iOS之两圆之间标准圆的随机生成
来源:互联网 发布:微信开放平台 php源码 编辑:程序博客网 时间:2024/06/06 03:38
思路一:
对于这个需求,我一开始也陷入了写死数据的套路,但是在兼容大小圆半径上做了一定的兼容,大致的将大圆切分成9块,然后在除了中间区域外的8块区域再生成一系列的伪标准圆。然后取值时现随机选取8块区域,再随机从块区拿取伪标准圆:
很明显,在 1、3、6、8 块中及中间块 存在很大的误差,明显也不可取
思路二:
根据数学思路,寻找标准圆:
1、在大圆内部生成随机圆1,也就是生成内含圆:(其中只有圆1才是该步骤所需要的随机圆1)
对应的数学公式,当圆心距小于两圆半径之差时 两圆内含:
大圆中心坐标为(px1、py1),半径为R; 随机圆中心坐标为(px2、py2),半径为r
大圆中心坐标为(px1、py1),半径为R; 随机圆中心坐标为(px2、py2),半径为r
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)
对应的数学公式,当圆心距大于两圆半径之和时 两圆外离:
小圆中心坐标为(px1、py1),半径为Rr; 随机圆中心坐标为(px2、py2),半径为r
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)
对应的数学公式,当圆心距小于两圆半径之和时 两圆相交或两圆内含,随机圆2应该废弃:
存在的标准圆中心坐标为(px、py),半径为rr; 随机圆中心坐标为(px2、py2),半径为r
存在的标准圆中心坐标为(px、py),半径为rr; 随机圆中心坐标为(px2、py2),半径为r
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 个在大圆内部的圆且不与中圆有交集的圆最后给出最终成果图:
对应的log日志:
项目源码地址 欢迎 star
0 0
- iOS之两圆之间标准圆的随机生成
- iOS之两圆之间标准圆的随机生成
- iOS之两圆之间标准圆的随机生成
- iOS 生成随机的UUID
- 生成随机数组的两种方式
- ios学习之 生成随机验证码
- 随机生成圆
- 随机生成两位字母
- Python随机生成验证码的两种方法
- C#随机生成四个两两相同的随机数
- 随机生成0到n之间的m个数
- 随机生成零到n之间的m个数
- 随机生成0到n之间的m个数
- js生成1-10之间的随机整数
- 生成在[min,max]之间的随机整数
- C++生成-1到1之间的随机小数
- 均匀的生成圆和三角形内的随机点
- 均匀的生成圆和三角形内的随机点
- linux--网络错误
- C/C++ 知识点回顾 双向链表的创建、插入和删除
- 解决java使用jdbc连接hive2出现Required field 'client_protocol' is unset! Struct:TOpenSessionReq
- git使用详解
- OpenJudge-Mooc 323:棋盘问题(dfs)
- iOS之两圆之间标准圆的随机生成
- ubuntu 14.04 安装jekyll
- jsp访问mysql数据库方式
- 关于vitualbox报错
- php生成验证码并显示在浏览器
- 第三章 JavaScript 栈
- jQuery Json数组操作
- EDA软件_Cadence_OrCAD Capture创建新元器件
- linux 相关整理