區域內隨機圓形的生成
生成的方法比較簡單,同樣是使用二維填充等高線函數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);
結果如下: