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

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

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

需求原型

思路一:

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

思路一

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

思路二:

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

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

随机圆1

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

大圆中心坐标为(px1、py1),半径为R; 随机圆中心坐标为(px2、py2),半径为r
$$
\sqrt[2]{(px1-px2)^{2} + (py1-py2)^{2}} < R-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

随机圆2

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

小圆中心坐标为(px1、py1),半径为Rr; 随机圆中心坐标为(px2、py2),半径为r
$$
\sqrt[2]{(px1-px2)^{2} + (py1-py2)^{2}} > Rr+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

随机圆3

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

存在的标准圆中心坐标为(px、py),半径为rr; 随机圆中心坐标为(px2、py2),半径为r
$$
\sqrt[2]{(px-px2)^{2} + (py-py2)^{2}} \leq rr+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]];
}

只要通过这三步成功后,即得到了我们所要的标准圆,从算法的时间复杂度看 ,得到标准圆的复杂度为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 个在大圆内部的圆且不与中圆有交集的圆

项目源码地址 欢迎 star

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 我们很早就学过,圆的面积计算公式: 但是以前从没想过他是怎么推导来的,今天突发奇想,用微积分推导了一下,然后上网看...
    taozhaojun阅读 38,949评论 27 63
  • 第一次来
    天蝎七魔将阅读 178评论 0 0
  • 我何其幸运, 因为我不是气象学家, 不用知道云彩如何形成或气流里有什么成分, 但我却可以用我的眼采集天边的流云, ...
    李翊洺赫阅读 337评论 0 0
  • 今天下雨,淅淅沥沥一直没有停的想法,很烦人,一直对连雨没有好感,路会泥泞!对于那种倾盆大雨却有着向往,喜欢!一种酣...
    OO碰到OO阅读 132评论 0 0
  • 早晨下雨,今天没有出去锻炼,明天继续加油,放几张之前拍过的皂片,各种天空,不知道为什么,每次抬头看到各种形状的天空...
    D_3c62阅读 104评论 0 0