【分享编程遇到的点点滴滴】

最近在一个行为仿真的项目中,遇到了一个仿真场景的初始化问题,具体是关于随机圆的不重叠分布。完成编程和测试之后,梳理了一下代码,概要性的写了一下总结。

其中编程和测试语言使用的是C++。

编程任务

编程要实现的具体任务是,在一个2000x2000的正方形区域内,随机位置分布1000个圆,并且每个圆的半径随机在0到50之间。

在这里,我把这种随机坐标和随机半径的圆称为:随机园。

为了方便定位位置,在这里引入二维坐标系。

设2000x2000正方形区域的中心在二维坐标系的坐标原点处,正方形区域的四个顶点的坐标分别为(1000,1000)、(-1000,1000)、(-1000,-1000)、(-1000,-1000)。

编程思路

  • 在预先设想好的正方形区域内,依次随机分布坐标不同的1000个点。即是分布点的x坐标和y坐标,都是在—1000和1000之间的随机数。
  • 考虑把分布的坐标不同的点,转换成分布的圆。每个点的坐标即为圆的圆心坐标,且每个圆的半径初始化为0到50之间的随机数。
  • 以上分布圆心坐标时,一开始并没有考虑圆的半径,所以,有可能会遇到两个圆之间有部分相互重叠的情况。解决方案是,考虑在分布圆时,不断地检测此次分布的圆,是否会与其他已经在正方形场景中存在的圆产生部分重叠。如果产生重叠,则此次分布的圆不加入场景,重新再生成和分布随机圆。
  • 如此反复,直至满足分布满1000个圆的情况。

编程逻辑

测试代码

#include

代码模块解释

  • 生成随机圆

随机圆包含的属性有圆心坐标、圆半径。其中,圆心坐标格式为(x,y),分布在二维空间。

在二维空间中的一点,可以用以下结构体表示:

struct 

在二维空间中的一个圆有两个参数,分别是圆心坐标和圆半径,可以用下面的结构体来表示:

struct 

生成一个随机圆也就是,生成一个圆,这个圆的圆心坐标点和圆半径,都是由随机函数生成的随机数。

随机函数 int rand(void) 是包含在头文件stdlib.h中的一个库函数。它的返回值是0到RAND_MAX的随机数。RAND_MAX是在头文件stdlib.h中的一个宏定义,代表的数值为32767。

在C++编程中,使用rand()时包含头文件iostream.h就行了。因为头文件iostream.h中包含了头文件stdlib.h。

如果想要在自定义区间内生成随机数,可以利用rand()函数。(float)rand()/RAND_MAX生成在区间[0,1]中的随机小数。

如果想要生成在区间[min,max]中的随机小数,可以是在已经生成区间[0,1]中的随机小数的前提下,乘以(max-min)完成区间尺度缩放,再加上min完成区间平移。这样,最后生成的随机数便是在区间[min,max]中的随机小数。用函数的形式表示如下:

float 

随机圆的生成需要两个参数,分别是随机圆的圆心坐标和随机圆半径,其中这里的圆心坐标又包含x坐标和y坐标。

设正方形的边长为areaLength,正方形的中心是二维坐标系的原点,随机圆半径允许的最大值为maxRadius,则创建随机圆的表示如下:

Circle 

  • 检测生成的随机圆是否和已在场景中的圆有部分区域重叠

检测生成的随机圆是否和已在场中的圆有重叠区域。如果有重叠区域,那么这次生成的随机圆不加入场景中,重新生成随机圆并且重新进行检测。如果没有重叠区域,那么就把生成的随机圆加入到场景中。

首先,把已经在场景中的圆,存放在容器vector中。之后新生成的随机圆检测与场景中已经存在的圆是否有重叠区域时,直接遍历容器vector,与容器vector中的每个元素(也就是已经在场景中的圆)挨个测试。定义容纳场景中已经存在的圆的容器为全局变量,表示为:

vector

检测两个圆是否有重叠区域时,只要比较两个圆之间的圆心距离,是否小于两个圆的半径之和。两个圆圆心之间的距离为,根号下的x坐标差的平方加上y坐标差的平方。

由于计算机计算乘法要比计算开根号快的多,所以我们在这里做比较时,直接比较距离的平方和半径和的平方,比较结果也是距离与半径和的比较结果。函数表示为:

bool 

场景中已存在的圆已经在容器vector中,新生成的随机圆与场景中已经存在的圆,也就是容器vector中的元素,依次测试就行了。

如果在测试期间容器有一个圆与新生成的随机圆有区域重叠,那么这次新生成的随机圆失效,重新生成随机圆再测试。

如果遍历完容器中所有圆后,没有发现哪个圆与新生成的随机圆有重叠区域,那么这次随机圆生成成功。检测随机圆是否生成成功的函数表示为:

bool 

  • 如果满足区域不重叠条件则把新生成的随机圆加入到场景中

如果满足要求,那么就把随机圆加入到场景中,也即是容器vector中。

把新生成的随机圆加入到容器vector中,需要用到容器中的push_back函数。push_back函数的作用是在容器的尾部添加新的元素。代码表示为:

if 

  • 检测场景中圆的数量是否已经达到了设定的数目

检测场景中圆的数量是否已经达到了设定的数目。如果未达到,那么再生成新的随机圆继续循环。如果达到了,那么就结束循环,输出每个在场景中的圆的圆心坐标和半径。

检测场景中的已存在圆的数量需要自定义一个变量,设为currentCircleNum。每当有新的随机圆加入场景时,currentCircleNum自增一。

整个程序在每轮循环过程中,都要检测是否场景中已存在圆的数量已经达到设定值。如果达到了,就跳出循环,进行下一步的输出行为。如果没达到,就继续循环生成新的随机圆。

while 

  • 显示或打印在场景中的圆的圆心坐标和半径

显示或打印在场景中的圆的圆心坐标和半径,用以检查是否符合规范。

这里打印生成的最终结果,利用C++的输入输出流。其中setiosflags()、setw()函数用来调输出格式,代码表示如下:

void 

设计一个类代表二维空间的一个圆。_【编程随笔】如何在特定区域内分布一些互不重叠的随机圆?...相关推荐

  1. Java设计一个类代表二维空间的一个点,设计一个类代表二维空间的一个圆,计算面积,,并写程序验证计算一个点(Point对象)是否在圆(Cricle对象)内

    题目要求: (1) 设计一个类代表二维空间的一个点 (2) 设计一个类代表二维空间的一个圆.要求两个成员变量.一个是圆心,一 个是半径,提供计算面积的方法. (3) 为上述Cricle类添加一个方法, ...

  2. 设计一个类代表二维空间的一个点,设计一个类代表二维空间的一个圆。要求两个成员变量。一个是圆心,一 个是半径,提供计算面积的方法。为上述Cricle类添加一个方法,计算一个点(Point)是否在圆内

    (1) 设计一个类代表二维空间的一个点 (2) 设计一个类代表二维空间的一个圆.要求两个成员变量.一个是圆心,一 个是半径,提供计算面积的方法. (3) 为上述Cricle类添加一个方法,计算一个点( ...

  3. 设计一个类代表二维空间的一个圆。_平面设计基础——点、线、面

    平面构成是以研究造型要素及构成规律为内容,讲点.线.面和基本形等视觉要素进行合理的排版合成在一个二维的平面上的艺术表现形式. 平面构成是一种视觉形象的二维构成,主要是视觉的二维空间.平面构成他通过对造 ...

  4. 设计一个类代表二维空间的一个圆。_多媒体数字展厅设计如何有效搭建空间美感?...

    如今在多媒体数字展厅设计中,空间陈列设计美感的搭建程度十分重要.一个多媒体数字展厅是否足够吸引人,不仅要有创意,还需对空间设计美感也要良好的把握.那么,在展厅设计中要如何搭建空间美感? 首先 多媒体数 ...

  5. 设计一个类代表二维空间的一个圆。_绝了!这是什么神仙花园设计! | 2020世界花园大会...

    2020世界花园大会 时间:4/27--5/3 地点:海宁国际花卉城 上次小编带来的六位设计师花园方案,许多小伙伴表示意犹未尽,期待更多预告. 于是乎,小编又去收集了一波资料,这里是七位将要呈现在世界 ...

  6. 京东商智--POP店铺数据导出(每一个类目,每一个月份的数据)--本次为了汇总2019年度数据

    dim arrayRet = "" dim objExcelWorkBook = "" dim hWeb = "" dim sRet = & ...

  7. python如何创建一个类_python 3——自定义一个类、object类

    1.如何创建一个类? __init__(self): self代表类的实例,而非类 类的方法:在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第 ...

  8. java定义一个类_java如何定义一个类,创建它的成员变量和方法?

    展开全部 类即对象的思想,一个对象包含e69da5e887aa3231313335323631343130323136353331333337623439了属于自己的成员变量和操作方法. 如何定义一个 ...

  9. 编写一个程序,设计一个类Score用于统计一个班的学生成绩,其中使用一个静态数据成员sum存储总分和一个静态成员函数getSum返回该总分

    头文件名称: 头文件: #include<iostream> using namespace std;class Score { public:int getSum(){return su ...

最新文章

  1. Qt选择文件对话框-中文路径-转std::string
  2. Riot美术师经验分享:好设计是改出来的
  3. pyqt5 qlabel无法显示图片_实战PyQt5: 011-单选框控件QRadioButton
  4. python自学教程-3D图示Python标准自学教程入门篇
  5. java 取模运算_JAVA算术运算符_四则与取模
  6. vue项目实战(移动端)
  7. OverFeat笔记
  8. 宁德时代钠电池雷声大,雨点小?
  9. 最美的十大经典爱情句子{转}
  10. 2020全国计算机考试ps版本,2020年3月计算机等级Photoshop练习题及参考答案
  11. 入门级蓝牙遥控小车制作教程
  12. soot基础 -- soot 中的处理阶段
  13. Map 和ConcurrentMap 线程不安全和线程安全证明
  14. Spring Boot (Filter)过滤器的实现以及使用场景
  15. node 打开浏览器
  16. 小白看了直呼细节--CPP“引用”
  17. 基于麒麟SP10服务器版的Kubernetes集群安装
  18. gulp报错The following tasks did not complete
  19. 35岁被大厂踢出豪门,褪去这层皮你还剩什么
  20. 跨越逐梦路上的荆棘(程序猿生存指南)

热门文章

  1. JLink NO JLINK DEVICE FOUND
  2. Virgin Voyages以精心打造的音乐形象、海上唱片店和卡拉OK室呈献视听盛宴
  3. (已解决)同一局域网下关闭了windows防火墙,外部仍然无法访问本机的java服务
  4. wind10 文件名区分大小写
  5. micropython int与bytes之间的转换
  6. 如何使用Python识别图片中的二维码
  7. # iOS基础 # iOS面试题一
  8. 如何成为一所技术学院狼
  9. 浅谈XS-Leaks之Timeless timing attck
  10. 体外(无细胞)蛋白表达系统,蛋白表达的新模式 试剂盒