• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

matlab在2维区域内生成不重叠的多个圆形

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

区域内随机圆形的生成

生成的方法比较简单,同样是使用二维填充等高线函数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);

结果如下:


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi初浅入门笔记之三:过程和函数(过程篇)发布时间:2022-07-18
下一篇:
Delphi Form Designer (窗体设计器)之五发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap