matlab在2維區域內生成不重疊的多個圓形


區域內隨機圓形的生成

生成的方法比較簡單,同樣是使用二維填充等高線函數contourf

1.設置范圍及指定圓的數目

范圍設置為10x10的正方形。而圓的數量通過其所占的面積指定,若全部的圓占總面積的\(40\%\),設圓的半徑為\(r\),則圓的數量為\([\frac{40}{\pi r^2}]\)

% 指定區域范圍
x = 0:0.01:10;
y = 0:0.01:10;
[X, Y] = meshgrid(x, y);

% 設置圓半徑及空隙分數
% 計算圓的數量
r = 0.5;
porosity = 0.6;
Acir = (1 - porosity) * 100;
cir_num = round(Acir/(r^2*pi));

2.隨機選擇圓心並判斷是否重疊

每產生一個圓心,就遍歷之前所有的圓心,計算他們之間的距離\(dis = \sqrt{x_{dis}^2 + y_{dis}^2}\),如果\(dis < 2r+0.1\)則說明它們重合。加0.1為了保證至少有0.1的空隙。
還要保證圓的范圍不能超過邊界,即\(0.5<x_{coor}<9.5\ \&\&\ 0.5<y_{coor}<9.5\)

% 生成第一個圓心
Center(1, 1) = 10 * rand(1);
Center(1, 2) = 10 * rand(1);
counter_next = 2;

% 循環生成剩余圓心
while (counter_next <= cir_num)
    x_coor = 10 * rand(1);
    y_coor = 10 * rand(1);
    if (x_coor <= 0.5 || x_coor >= 9.5 ...
            || y_coor <= 0.5 || y_coor >= 9.5)  % 防止圓越過邊界
        continue;
    end
    for (i = counter_next-1:-1:1)
        x_dis = abs(x_coor - Center(i, 1));
        y_dis = abs(y_coor - Center(i, 2));
        dis = sqrt(x_dis^2+y_dis^2);
        if (dis <= 1.1)
            break;
        elseif (i == 1)
            Center(counter_next, 1) = x_coor;
            Center(counter_next, 2) = y_coor;
            counter_next = counter_next + 1;  % 一開始寫在while下面出錯
        end
    end
end

3. 使用min函數結合所有圓並做出等高線

完整程序如下:

clear all;
clc;
% 指定區域范圍
x = 0:0.01:10;
y = 0:0.01:10;
[X, Y] = meshgrid(x, y);

% 設置圓半徑及空隙分數
% 計算圓的數量
r = 0.5;
porosity = 0.6;
Acir = (1 - porosity) * 100;
cir_num = round(Acir/(r^2*pi));

% 聲明圓心坐標矩陣並初始化
Center = -ones(cir_num, 2);

% 生成第一個圓心
Center(1, 1) = 10 * rand(1);
Center(1, 2) = 10 * rand(1);
counter_next = 2;

% 循環生成剩余圓心
while (counter_next <= cir_num)
    x_coor = 10 * rand(1);
    y_coor = 10 * rand(1);
    if (x_coor <= 0.5 || x_coor >= 9.5 ...
            || y_coor <= 0.5 || y_coor >= 9.5)  % 防止圓越過邊界
        continue;
    end
    for (i = counter_next-1:-1:1)
        x_dis = abs(x_coor - Center(i, 1));
        y_dis = abs(y_coor - Center(i, 2));
        dis = sqrt(x_dis^2+y_dis^2);
        if (dis <= 1.1)
            break;
        elseif (i == 1)
            Center(counter_next, 1) = x_coor;
            Center(counter_next, 2) = y_coor;
            counter_next = counter_next + 1;  % 一開始寫在while下面出錯
        end
    end
end

% 循環使用min函數將圓形組合
Z = (X - Center(1, 1)).^2 + (Y - Center(1, 2)).^2 - 0.25;
for i = 2:1:cir_num
    Z = min(Z, (X - Center(i, 1)).^2 + (Y - Center(i, 2)).^2 - 0.25);
end

% 使用contourf做出函數值為0的等高線
ax = figure;
[M, C] = contourf(X, Y, Z, [-0.25, 0]); % -0.25是為了之后填充
C.LineWidth = 1;
C.ShowText = 'off';

map = [0, 0.6, 1;
        1, 1, 1];
colormap(ax, map);

結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM