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

2022-10-01 13:51:11 字數 2421 閱讀 1750

前言

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

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

實現思路

思路一:

對於這個需求,我一開始也陷入了寫死資料的套路,但是在相容大程式設計客棧小圓半徑上做了一定的相容,大致的將大圓切分成 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)

}if (success) 為了尋找 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開發之隨機生成兩圓之間的標準圓

本文位址: /ruanjian/ios/177119.html

iOS開發 生成隨機數

有時候我們需要在程式中生成隨機數,但是在objective c中並沒有提供相應的函式,好在c中提供了rand srand random arc4random 幾個函式。那麼怎麼使用呢?下面將簡單介紹 1 獲取乙個隨機整數範圍在 0,100 包括0,不包括100 int x arc4random 10...

iOS開發 生成隨機數

有時候我們需要在程式中生成隨機數,但是在objective c中並沒有提供相應的函式,好在c中提供了rand srand random arc4random 幾個函式。那麼怎麼使用呢?下面將簡單介紹 1 獲取乙個隨機整數範圍在 0,100 包括0,不包括100 intx arc4random 100...

iOS開發之歸檔

歸檔是一種物件都可以實現的更加常規的序列化方式。適用對模型物件進行歸檔的技術可以輕鬆將複雜物件寫入檔案和從檔案中進行讀取。大多數支援儲存資料的foundation和cocos touch類都遵循nscoding協議 不過有些例外,例如uiiamge 因此對於大多數系統提供的類而言,歸檔比較輕鬆。如果...