前言

相信很多社交产品中,肯定会存在寻找附近人或者附近商家的需求,类似下图,在大圆和小圆之间(橘色区域)生成一系列的随机圆,并且所有随机圆之间也不能有交集,我暂且称这种圆为标准圆。
关于这样的需要以前在做项目中有同事做过,虽然可以实现了上面的效果图,但是坐标及半径都是写死,从写死的数据随机取值,看上去是满足了,但是对于用户来说多次使用该功能时,肯定有一定的视觉疲倦,且写死的一些数据真的不好写,如果大圆或者小圆半径变化了,或者需要更多的标准圆,那怎么办呢?一脸懵逼????
实现思路
思路一:
对于这个需求,我一开始也陷入了写死数据的套路,但是在兼容大小圆半径上做了一定的兼容,大致的将大圆切分成 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实现带文字的圆形头像效果
# 小圆
# 成了
# 不与
# 所需要
# 才是
# 也不
# 都是
# 切分
# 但是在
# 我一
# 中有
# 一脸
# 有一定
# 点击这里
# 能有
# 做过
# 任何一个
# 这篇文章
# 很明显
# 非常大
相关文章:
建站之星与建站宝盒如何选择最佳方案?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
如何通过商城免费建站系统源码自定义网站主题?
如何用西部建站助手快速创建专业网站?
建站之星ASP如何实现CMS高效搭建与安全管理?
h5网站制作工具有哪些,h5页面制作工具有哪些?
建站之星代理如何获取技术支持?
孙琪峥织梦建站教程如何优化数据库安全?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
学校免费自助建站系统:智能生成+拖拽设计+多端适配
宝塔Windows建站如何避免显示默认IIS页面?
建站主机是否属于云主机类型?
,柠檬视频怎样兑换vip?
电商网站制作公司有哪些,1688网是什么意思?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
电商网站制作价格怎么算,网上拍卖流程以及规则?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何生成腾讯云建站专用兑换码?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
定制建站流程步骤详解:一站式方案设计与开发指南
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
太平洋网站制作公司,网络用语太平洋是什么意思?
如何用wdcp快速搭建高效网站?
如何选择靠谱的建站公司加盟品牌?
Swift中循环语句中的转移语句 break 和 continue
大连网站制作公司哪家好一点,大连买房网站哪个好?
建站主机默认首页配置指南:核心功能与访问路径优化
小型网站制作HTML,*游戏网站怎么搭建?
高防服务器租用指南:配置选择与快速部署攻略
韩国服务器如何优化跨境访问实现高效连接?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
常州自助建站费用包含哪些项目?
网站制作公司,橙子建站是合法的吗?
,石家庄四十八中学官网?
香港服务器选型指南:免备案配置与高效建站方案解析
Java解压缩zip - 解压缩多个文件或文件夹实例
,巨量百应是干嘛的?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
Python多线程使用规范_线程安全解析【教程】
高端建站如何打造兼具美学与转化的品牌官网?
高防服务器如何保障网站安全无虞?
学校建站服务器如何选型才能满足性能需求?
建站VPS选购需注意哪些关键参数?
音乐网站服务器如何优化API响应速度?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
如何快速上传自定义模板至建站之星?
广平建站公司哪家专业可靠?如何选择?
实例解析Array和String方法
*请认真填写需求信息,我们会在24小时内与您取得联系。