中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS開發之隨機生成兩圓之間的標準圓

發布時間:2020-10-06 08:16:54 來源:腳本之家 閱讀:111 作者:daisy 欄目:移動開發

前言

相信很多社交產品中,肯定會存在尋找附近人或者附近商家的需求,類似下圖,在大圓和小圓之間(橘色區域)生成一系列的隨機圓,并且所有隨機圓之間也不能有交集,我暫且稱這種圓為標準圓。

關于這樣的需要以前在做項目中有同事做過,雖然可以實現了上面的效果圖,但是坐標及半徑都是寫死,從寫死的數據隨機取值,看上去是滿足了,但是對于用戶來說多次使用該功能時,肯定有一定的視覺疲倦,且寫死的一些數據真的不好寫,如果大圓或者小圓半徑變化了,或者需要更多的標準圓,那怎么辦呢?一臉懵逼????

iOS開發之隨機生成兩圓之間的標準圓

實現思路

思路一:

對于這個需求,我一開始也陷入了寫死數據的套路,但是在兼容大小圓半徑上做了一定的兼容,大致的將大圓切分成 9塊 ,然后在除了中間區域外的8塊區域再生成一系列的偽標準圓。然后取值時現隨機選取8塊區域,再隨機從塊區拿取 偽標準圓 :

iOS開發之隨機生成兩圓之間的標準圓

很明顯,在 1、3、6、8 塊中及中間塊 存在很大的誤差,明顯也不可取

思路二:

根據數學思路,尋找標準圓:

1、在大圓內部生成 隨機圓1 ,也就是生成內含圓:(其中只有圓1才是該步驟所需要的 隨機圓1 )

iOS開發之隨機生成兩圓之間的標準圓

對應的數學公式,當圓心距小于兩圓半徑之差時 兩圓內含:

大圓中心坐標為(px1、py1),半徑為R; 隨機圓中心坐標為(px2、py2),半徑為r

iOS開發之隨機生成兩圓之間的標準圓

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 )

iOS開發之隨機生成兩圓之間的標準圓

對應的數學公式,當圓心距大于兩圓半徑之和時 兩圓外離:

小圓中心坐標為(px1、py1),半徑為Rr; 隨機圓 中心坐標為(px2、py2),半徑為r

iOS開發之隨機生成兩圓之間的標準圓

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 )

iOS開發之隨機生成兩圓之間的標準圓

對應的數學公式,當圓心距小于兩圓半徑之和時 兩圓相交或兩圓內含,隨機圓2應該廢棄:

存在的標準圓中心坐標為(px、py),半徑為rr; 隨機圓中心坐標為(px2、py2),半徑為r

iOS開發之隨機生成兩圓之間的標準圓

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 個在大圓內部的圓且不與中圓有交集的圓

最后給出最終成果圖:

iOS開發之隨機生成兩圓之間的標準圓

對應的log日志:

為了尋找 9 個標準圓 一共生成了 127 個隨機圓 生成了 75 個在大圓內部的圓 生成了 20 個在大圓內部的圓且不與中圓有交集的圓為了尋找 12 個標準圓 一共生成了 265 個隨機圓 生成了 150 個在大圓內部的圓 生成了 40 個在大圓內部的圓且不與中圓有交集的圓 為了尋找 23 個標準圓 一共生成了 5181 個隨機圓 生成了 3112 個在大圓內部的圓 生成了 909 個在大圓內部的圓且不與中圓有交集的圓

源碼下載:點擊這里

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

团风县| 凉山| 克拉玛依市| 平湖市| 新安县| 英山县| 广元市| 仁怀市| 民乐县| 临沂市| 郑州市| 哈尔滨市| 辽源市| 大化| 中西区| 巴林右旗| 古蔺县| 石家庄市| 梁平县| 蕲春县| 台南县| 苍山县| 登封市| 南丹县| 五家渠市| 南澳县| 简阳市| 晋州市| 建水县| 扎赉特旗| 吉安市| 宜丰县| 清流县| 寿宁县| 邹平县| 抚顺县| 乐东| 普定县| 荆门市| 许昌县| 兴和县|