服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS开发之随机生成两圆之间的标准圆

iOS开发之随机生成两圆之间的标准圆

2021-03-03 15:11iOS开发网 IOS

这篇文章主要给大家介绍了iOS如何实现在两圆之间随机生成标准圆的方法,实现的效果类似寻找附近人或者附近商家的动态效果,有需要的朋友可以参考借鉴,下面来一起学习学习吧。

前言

相信很多社交产品中,肯定会存在寻找附近人或者附近商家的需求,类似下图,在大圆和小圆之间(橘色区域)生成一系列的随机圆,并且所有随机圆之间也不能有交集,我暂且称这种圆为标准圆。

关于这样的需要以前在做项目中有同事做过,虽然可以实现了上面的效果图,但是坐标及半径都是写死,从写死的数据随机取值,看上去是满足了,但是对于用户来说多次使用该功能时,肯定有一定的视觉疲倦,且写死的一些数据真的不好写,如果大圆或者小圆半径变化了,或者需要更多的标准圆,那怎么办呢?一脸懵逼????

iOS开发之随机生成两圆之间的标准圆

实现思路

思路一:

对于这个需求,我一开始也陷入了写死数据的套路,但是在兼容大小圆半径上做了一定的兼容,大致的将大圆切分成 9块 ,然后在除了中间区域外的8块区域再生成一系列的伪标准圆。然后取值时现随机选取8块区域,再随机从块区拿取 伪标准圆 :

iOS开发之随机生成两圆之间的标准圆

很明显,在 1、3、6、8 块中及中间块 存在很大的误差,明显也不可取

思路二:

根据数学思路,寻找标准圆:

1、在大圆内部生成 随机圆1 ,也就是生成内含圆:(其中只有圆1才是该步骤所需要的 随机圆1 )

iOS开发之随机生成两圆之间的标准圆

对应的数学公式,当圆心距小于两圆半径之差时 两圆内含:

大圆中心坐标为(px1、py1),半径为r; 随机圆中心坐标为(px2、py2),半径为r

iOS开发之随机生成两圆之间的标准圆

objective-c代码如下:

?
1
2
3
4
// 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 )

iOS开发之随机生成两圆之间的标准圆

对应的数学公式,当圆心距大于两圆半径之和时 两圆外离:

小圆中心坐标为(px1、py1),半径为rr; 随机圆 中心坐标为(px2、py2),半径为r

iOS开发之随机生成两圆之间的标准圆

objective-c代码如下:

?
1
2
3
4
// 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 )

iOS开发之随机生成两圆之间的标准圆

对应的数学公式,当圆心距小于两圆半径之和时 两圆相交或两圆内含,随机圆2应该废弃:

存在的标准圆中心坐标为(px、py),半径为rr; 随机圆中心坐标为(px2、py2),半径为r

iOS开发之随机生成两圆之间的标准圆

objective-c代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
// 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 个在大圆内部的圆且不与中圆有交集的圆

最后给出最终成果图:

iOS开发之随机生成两圆之间的标准圆

对应的log日志:

为了寻找 9 个标准圆 一共生成了 127 个随机圆 生成了 75 个在大圆内部的圆 生成了 20 个在大圆内部的圆且不与中圆有交集的圆为了寻找 12 个标准圆 一共生成了 265 个随机圆 生成了 150 个在大圆内部的圆 生成了 40 个在大圆内部的圆且不与中圆有交集的圆 为了寻找 23 个标准圆 一共生成了 5181 个随机圆 生成了 3112 个在大圆内部的圆 生成了 909 个在大圆内部的圆且不与中圆有交集的圆

源码下载:点击这里

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

延伸 · 阅读

精彩推荐
  • IOSiOS逆向教程之logify跟踪方法的调用

    iOS逆向教程之logify跟踪方法的调用

    这篇文章主要给大家介绍了关于iOS逆向教程之logify跟踪方法调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学...

    Mr.Guo11472021-04-28
  • IOSIOS网络请求之AFNetWorking 3.x 使用详情

    IOS网络请求之AFNetWorking 3.x 使用详情

    本篇文章主要介绍了IOS网络请求之AFNetWorking 3.x 使用详情,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    总李写代码6892021-03-04
  • IOSiOS10 Xcode8适配7个常见问题汇总

    iOS10 Xcode8适配7个常见问题汇总

    这篇文章主要为大家详细汇总了iOS10 Xcode8适配7个常见问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    索马里猫10332021-02-01
  • IOSxcode8提交ipa失败无法构建版本问题的解决方案

    xcode8提交ipa失败无法构建版本问题的解决方案

    xcode升级到xcode8后发现构建不了新的版本。怎么解决呢?下面小编给大家带来了xcode8提交ipa失败无法构建版本问题的解决方案,非常不错,一起看看吧...

    Cinna丶7542021-02-03
  • IOSiOS常见的几个修饰词深入讲解

    iOS常见的几个修饰词深入讲解

    这篇文章主要给大家介绍了关于iOS常见的几个修饰词的相关资料,iOS修饰词包括assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite,文中通过示...

    郡王丶千夜7422021-05-10
  • IOS谈一谈iOS单例模式

    谈一谈iOS单例模式

    这篇文章主要和大家谈一谈iOS中的单例模式,单例模式是一种常用的软件设计模式,想要深入了解iOS单例模式的朋友可以参考一下...

    彭盛凇11872021-01-19
  • IOSiOS中时间与时间戳的相互转化实例代码

    iOS中时间与时间戳的相互转化实例代码

    这篇文章主要介绍了iOS中时间与时间戳的相互转化实例代码,非常具有实用价值,需要的朋友可以参考下。...

    张无忌!4812021-03-09
  • IOSiOS APP实现微信H5支付示例总结

    iOS APP实现微信H5支付示例总结

    这篇文章主要介绍了iOS APP实现微信H5支付示例总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    一张小A11332021-06-01