前言
置信很多社交產品中,一定會存在尋覓左近人或許左近商家的需求,相似下圖,在大圓和小圓之間(橘色區域)生成一系列的隨機圓,並且一切隨機圓之間也不能有交集,我暫且稱這種圓為規范圓。
關於這樣的需求以前在做項目中有同事做過,雖然可以完成了下面的效果圖,但是坐標及半徑都是寫死,從寫死的數據隨機取值,看上去是滿足了,但是關於用戶來說屢次運用該功用時,一定有一定的視覺疲倦,且寫死的一些數據真的不好寫,假如大圓或許小圓半徑變化了,或許需求更多的規范圓,那怎樣辦呢?一臉懵逼????
完成思緒
思緒一:
關於這個需求,我一開端也墮入了寫死數據的套路,但是在兼容大小圓半徑上做了一定的兼容,大致的將大圓切分紅 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開發之隨機生成兩圓之間的規范圓】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!