iOS开发之随机生成两圆之间的标准圆
发布时间 - 2026-01-10 22:37:43 点击率:次前言

相信很多社交产品中,肯定会存在寻找附近人或者附近商家的需求,类似下图,在大圆和小圆之间(橘色区域)生成一系列的随机圆,并且所有随机圆之间也不能有交集,我暂且称这种圆为标准圆。
关于这样的需要以前在做项目中有同事做过,虽然可以实现了上面的效果图,但是坐标及半径都是写死,从写死的数据随机取值,看上去是满足了,但是对于用户来说多次使用该功能时,肯定有一定的视觉疲倦,且写死的一些数据真的不好写,如果大圆或者小圆半径变化了,或者需要更多的标准圆,那怎么办呢?一脸懵逼????
实现思路
思路一:
对于这个需求,我一开始也陷入了写死数据的套路,但是在兼容大小圆半径上做了一定的兼容,大致的将大圆切分成 9块 ,然后在除了中间区域外的8块区域再生成一系列的伪标准圆。然后取值时现随机选取8块区域,再随机从块区拿取 伪标准圆 :
很明显,在 1、3、6、8 块中及中间块 存在很大的误差,明显也不可取
思路二:
根据数学思路,寻找标准圆:
1、在大圆内部生成 随机圆1 ,也就是生成内含圆:(其中只有圆1才是该步骤所需要的 随机圆1 )
对应的数学公式,当圆心距小于两圆半径之差时 两圆内含:
大圆中心坐标为(px1、py1),半径为R; 随机圆中心坐标为(px2、py2),半径为r
Objective-c代码如下:
// 1: 判断随机生成的 圆 包含在 self 这个大圆内部
if ( sqrt(pow(self.center.x - randomCPX, 2) + pow(self.frame.size.height / 2 - randomCPY, 2)) < (R - r) ) {
}
2、从第1步得到的随机圆1中,筛选出和小圆不相交 随机圆2 :(其中只有圆1才是该步骤所需要的 随机圆2 )
对应的数学公式,当圆心距大于两圆半径之和时 两圆外离:
小圆中心坐标为(px1、py1),半径为Rr; 随机圆 中心坐标为(px2、py2),半径为r
Objective-c代码如下:
// 2: 判断随机生成的 圆 不在 中间 这个圆 不能重合, 即得到两个圆之间的小圆
if (sqrt(pow(self.center.x - randomCPX, 2) + pow(self.frame.size.height / 2 - randomCPY, 2)) > (Rr + r)) {
}
3、从第2步得到的随机圆2中,筛选出和已存在的 标准圆 不相交 随机圆3 , 随机圆3 即我们所需要的 标准圆 (其中圆2是已经存在的 标准圆 ,那么只有圆1才是该步骤所需要的 随机圆3 )
对应的数学公式,当圆心距小于两圆半径之和时 两圆相交或两圆内含,随机圆2应该废弃:
存在的标准圆中心坐标为(px、py),半径为rr; 随机圆中心坐标为(px2、py2),半径为r
Objective-c代码如下:
// 3: 新生成的 圆 和已经存在的 圆 不能重合
BOOL success = YES;
for (NSValue *value in randomCircleInfos) {
CircleInfo circle;
[value getValue:&circle];
// 只要新生成的 圆 和 任何一个存在的 圆 有交集,则失败
if (sqrt(pow(circle.center.x - randomCPX, 2) + pow(circle.center.y - randomCPY, 2)) <= (circle.radius + r)) {
success = NO; break ;
}
}
if (success) { [randomCircleInfos addObject:[self standardCircle:randomCPX centerY:randomCPY radius:r]];}为了寻找 8 个标准圆一共生成了 53 个随机圆 生成了 29 个在大圆内部的圆 生成了 9 个在大圆内部的圆且不与中圆有交集的圆 为了寻找 8 个标准圆一共生成了 38 个随机圆 生成了 28 个在大圆内部的圆 生成了 10 个在大圆内部的圆且不与中圆有交集的圆
只要通过这三步成功后,即得到了我们所要的标准圆,从算法的时间复杂度看 ,得到标准圆的复杂度为O(n*n),对于小量了标准圆来说,速度是非常快的:(当然效率上还由随机圆的半径有关系)
为了寻找 8 个标准圆一共生成了 53 个随机圆 生成了 29 个在大圆内部的圆 生成了 9 个在大圆内部的圆且不与中圆有交集的圆 为了寻找 8 个标准圆一共生成了 38 个随机圆 生成了 28 个在大圆内部的圆 生成了 10 个在大圆内部的圆且不与中圆有交集的圆
但是在产生大量的标准圆上,随机生成的总量会非常大:(可以考虑将随机圆半径减少,或者生成该页面之前,提前生成好这些标准圆相关数据:即圆心坐标和半径)
为了寻找 30 个标准圆 一共生成了 233220 个随机圆 生成了 138095 个在大圆内部的圆 生成了 40287 个在大圆内部的圆且不与中圆有交集的圆
最后给出最终成果图:
对应的log日志:
为了寻找 9 个标准圆 一共生成了 127 个随机圆 生成了 75 个在大圆内部的圆 生成了 20 个在大圆内部的圆且不与中圆有交集的圆为了寻找 12 个标准圆 一共生成了 265 个随机圆 生成了 150 个在大圆内部的圆 生成了 40 个在大圆内部的圆且不与中圆有交集的圆 为了寻找 23 个标准圆 一共生成了 5181 个随机圆 生成了 3112 个在大圆内部的圆 生成了 909 个在大圆内部的圆且不与中圆有交集的圆
源码下载:点击这里
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# 随机圆形排列
# ios
# 随机颜色
# 圆形随机不重叠
# 浅谈iOS中三种生成随机数方法
# 利用iOS绘制图片生成随机验证码示例代码
# IOS实现圆形图片效果的两种方法
# iOS如何裁剪圆形头像
# IOS使用progssview仿滴滴打车圆形计时
# iOS开发中Quartz2D控制圆形缩放和实现刷帧效果
# iOS实现带文字的圆形头像效果
# 小圆
# 成了
# 不与
# 所需要
# 才是
# 也不
# 都是
# 切分
# 但是在
# 我一
# 中有
# 一脸
# 有一定
# 点击这里
# 能有
# 做过
# 任何一个
# 这篇文章
# 很明显
# 非常大
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
三星网站视频制作教程下载,三星w23网页如何全屏?
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
公司网站制作价格怎么算,公司办个官网需要多少钱?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何快速生成ASP一键建站模板并优化安全性?
Laravel PHP版本要求一览_Laravel各版本环境要求对照
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
西安专业网站制作公司有哪些,陕西省建行官方网站?
Laravel如何使用withoutEvents方法临时禁用模型事件
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Python文件操作最佳实践_稳定性说明【指导】
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Android Socket接口实现即时通讯实例代码
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
非常酷的网站设计制作软件,酷培ai教育官方网站?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
iOS中将个别页面强制横屏其他页面竖屏
手机网站制作与建设方案,手机网站如何建设?
如何快速选择适合个人网站的云服务器配置?
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
Laravel API资源类怎么用_Laravel API Resource数据转换
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Laravel如何生成API文档?(Swagger/OpenAPI教程)
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
如何在景安云服务器上绑定域名并配置虚拟主机?
Android okhttputils现在进度显示实例代码
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
如何快速生成可下载的建站源码工具?
如何续费美橙建站之星域名及服务?
利用 Google AI 进行 YouTube 视频 SEO 描述优化
如何在万网ECS上快速搭建专属网站?
Python文件流缓冲机制_IO性能解析【教程】
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
php json中文编码为null的解决办法
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
如何确保FTP站点访问权限与数据传输安全?
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
如何在不使用负向后查找的情况下匹配特定条件前的换行符
如何注册花生壳免费域名并搭建个人网站?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
如何在Windows服务器上快速搭建网站?

