作者:叶飞影
链接:https://www.zhihu.com/question/53012468/answer/133362692
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

-------尊重原著!!!!!!!!!

感觉逻辑很棒就记录一下,怕哪天找不到了!

1)第一种方法
写个循环,循环中随机生成一个圈圈的圆心坐标位置、半径。然后判断圈圈是否与已有的圈圈发生碰撞。如果有碰撞让它滚蛋,否则画圈圈。

(2)第二种方法
还是写个循环,循环中随机生成一个圈圈的圆心坐标位置,然后判断这个坐标点是否在已有的圈圈内部,如果是就让它滚蛋,否则计算出与它到距离最近圈圈的距离,并以此画圈圈。

(3)第三种方法

有时需要将一堆指定半径的圈圈,无碰撞的放置在某一空间中。这就需要一套物理碰撞算法,感觉很难,不要怕,圈圈之间的碰撞检测是所有碰撞检测中最容易的。碰到这一情况,首先要找到一个中心点,然后将所有的圈圈按照与该中心点的距离远近进行排序,依次将每一个圈圈朝向党中心靠近,最后实现大和谐。

这种方法中需要克服的一个难点是,如何实现三个圈圈的两两相碰。解决这一问题,需要用到一个数学公式:余弦定理,已知三角形的三边长度,求三个角度。这算是我在实际编程中用过最高深的数学知识之一。

(4)第四种方法

让所有圈圈围向一个中心,这样太过集中,体现了独裁专制,这政治不正确吗。有时可能只是想让圈圈放到一个大框里。这时的处理方式和前一个类似,只是修改一下圈圈的排序方式,让圈圈按照朝向某一方向的远近进行排序,并且朝着该方向移动。

(5)第五种方法

前四种方法,每添加一个圈圈时,都需要遍历已有圈圈判断是否与之碰撞。当圈圈数目增大时,效率不高啊。第五种方法可以轻松画出大规模的圈圈:

先以固定步长生成规则的正方形网格点;

然后对网格点进行随机移动,移动距离不要超过固定步长;

移动后的网格点为圈圈的圆心;

计算出每一个网格点与其周围8个网格点的最近距离;

最近距离的一半为圈圈的半径;

发一下该算法的C代码:

inline void hash22(float px, float py, float& hx, float& hy)
{ float n = sinf(px * 7.0f + py * 157.0f); hx = 2097152.0f*n;hy = 262144.0f*n;hx = hx - floorf(hx);hy = hy - floorf(hy);
}// 查找最近的相邻顶点
float   nearest_dis_2d(float x, float y)
{float ox, oy;hash22(x, y, ox, oy); // 当前顶点偏移float d, r = 2.0f;float vx, vy;for(int i = -1; i <= 1; i++){for(int j = -1; j <= 1; j++){if (i == 0 && j == 0){continue;}hash22(i + x, j + y, vx, vy);vx += float(i) - ox;vy += float(j) - oy;d = vx*vx + vy*vy;if (d < r){r = d;}}}return sqrtf(r);
}// 使用worley画圈圈
float   circle_worley2d(float x, float y)
{float fx = floorf(x);float fy = floorf(y);float gx = x - fx;float gy = y - fy;float vx, vy;float d, r = 3.0f;float si, sj;for(int i = -1; i <= 1; i++){for(int j = -1; j <= 1; j++){hash22(i + fx, j + fy, vx, vy);vx += float(i) - gx;vy += float(j) - gy;d = vx*vx + vy*vy;if (d < r){r = d;si = i + fx;sj = j + fy;}}}d = sqrtf(r) / nearest_dis_2d(si, sj) * 2.0f;return d;
}

代码中调用函数circle_worley2d,输入是平面上的一个二维坐标,返回值为1时,表示该坐标位于圆上。用上面的代码可以生成如下图像:

6)第六种方法:

上一种方法中,float circle_worley2d(float x, float y)函数,可以很容易地改成三维的

float circle_worley3d(float x, float y, float z)。

用三维的可以生成空间中若干个互相不重叠的球,如下图所示:

并且利用circle_worley3d函数可以实现球面上画圈圈:

附上篇国外一大叔写的文章:Random space filling tiling of the plane

:知乎 - 安全中心

Moon craters (shadertoy.com)

如何生成多个互不重叠的不同半径圆(逻辑)相关推荐

  1. 生成多个互不重叠的不同半径圆

    生成多个互不重叠的不同半径圆 https://www.zhihu.com/question/53012468 固定区域,生成所有圆,统计圆的面积,最后面积最大的就是答案. import numpy a ...

  2. R语言dataframe创建新的特征(变量)、行加和特征、行均值特征(基于加减乘除、指数、模数等操作符)、创建新的特征(变量)、生成编码特征(基于比较操作符、逻辑操作符)

    R语言dataframe创建新的特征(变量).行加和特征.行均值特征(基于加减乘除.指数.模数等操作符).为dataframe创建新的特征(变量).生成编码特征(基于比较操作符.逻辑操作符) 目录

  3. 生成三角网算法java,一种低效但逻辑简单清晰的Delaunay三角网生成算法

    由离散样本点生成Delaunay三角网有多种算法,每个算法的执行效率都不一样,这里介绍一种最简单,最低效,但是算法逻辑最清晰的一种. Delaunay三角网必须满足的一个条件是任何一个三角形的外接圆都 ...

  4. 批量画同心不同半径圆lisp_cad绘制同心圆lisp二次开发源代码

    简介:本资源为autocad同心圆lisp二次开发源代码下载,该代码文件可以直接在autocad中加载,执行,可以实现的功能为绘制多个间距一定的同心圆 源代码: (Defun C:TXY () (Se ...

  5. 批量画同心不同半径圆lisp_【微课视频】青岛版数学六年级上册5.1圆的认识

    六年级微课堂专注六年级微课堂,每日推送学习资料. 语/数/英(上册)电子课本请点击上图▲ 微课探路 微课视频第一课时 微课视频第二课时 课本再现 巩固练习 答案:1.曲线:圆心,两端,圆上:半径. 2 ...

  6. 在java中改变圆半径_java小例子:打印一个近似圆,要求根据给定半径圆的大小随之发生改变...

    如题:通过API文档查询Math类方法,打印如下所示的近似圆,只要给定不同的半径,圆的大小随之发生改变. import java.lang.Math; public class MathDraw { ...

  7. Django项目实战——8—(判断用户是否登录并返回JSON、Django发送邮件的配置、生成邮箱验证链接、验证邮箱后端逻辑)

    1.判断用户是否登录并返回JSON 重要提示: 只有用户登录时才能让其绑定邮箱. 此时前后端交互的数据类型是JSON,所以需要判断用户是否登录并返回JSON给用户. 方案一: 使用Django用户认证 ...

  8. 求任意半径圆的面积c语言,需要一个输入半径求圆面积的C语言程序

    #include #define PI 3.14159 int main() {float r, l, s; scanf("%f", &r); printf("S ...

  9. Labview生成三维曲面 | 花瓶

    LabVIEW专栏:https://blog.csdn.net/weixin_44543463/category_10714833.html 目录 一.程序思路 1.1 底面圆轮廓的生成 1.2 引导 ...

最新文章

  1. Centos7上安装docker 详细教程
  2. T-SQL查询进阶--深入理解子查询
  3. Hbase shell详情
  4. php登陆框_PHP 登录完成跳转上一访问页面
  5. python合并视频和音频_真没想到,Python 还能实现 5 毛特效
  6. 2021全球自由行报告:我的中国,真好玩!
  7. 深入解析常量池与装拆箱机制
  8. (六)linux内核中的offsetof与container_of宏
  9. PHP命名空间带来的干扰
  10. Bailian3195 最大公约数【数论】
  11. 人型自走输入法(网页日语输入法)
  12. 信号与系统 徐亚宁 matlab程序,信号与系统分析 [徐亚宁,李和主编] 2010年版
  13. 【毕设资料】 Web版RSS阅读器(一)——dom4j读取xml(opml)文件
  14. 中国Linux内核开发者大会
  15. 学习计算机网络感想,计算机网络学习心得体会
  16. 时隔一年半,我,一个卑微的前端初学者,又来写面经了
  17. console.log详解
  18. C++ this指针详解
  19. Docker 定制容器镜像的2种方法
  20. 17福师《计算机应用基础,17春福师《计算机应用基础》在线作业2.doc

热门文章

  1. 【网页制作】jQuery操作css实现设置箭头图片
  2. 中台搞了2年,项目叫停,CIO被裁!本以为中台是道送分题,没想到是送命题!...
  3. 使用人性化的 Linux 防火墙 CFW 阻止 DDOS 攻击
  4. facenet生成自己的pairs.txt
  5. 交换机putty怎么调试_【技术】如何登陆交换机进行命令配置?常用的交换机组网模拟器有哪些?...
  6. 【c51单片机】交通红绿灯设计
  7. oeasy教您玩转 linux 010213 中文 fcitx
  8. 大专学的计算机如何进国企,专科毕业生想进国企?这三大专业不要错过,成功率高达60%...
  9. 【转载】如何自己DIY组装一台台式电脑
  10. UEFI引导+GPT分区模式如何安装win10原版镜像或ghost版