2012-07-19 103 views
3

我在for循環中生成隨機值,我想測試下一個即將生成的值是否不在其他任何值附近,如果是這樣我想將它放在公差半徑之外,這是我到目前爲止有:如何創建一個遞歸方法來比較兩個值?

int spacing = 30; 
// create a bunch of random points 
for (int i = 0; i < MAX_NUMBER_OF_DOTS; i++) 
{ 
    ofVec2f point(ofRandom(spacing, ofGetWidth() - (spacing + spacing)), ofRandom(spacing, ofGetHeight() - (spacing + spacing))); 

    // Loop trough previously create points and check its distance 
    for (int j = 0; j < dots.size(); j++) 
    { 
     ofVec2f testPoint = dots[j]; 
     float minDistance = 20.0f; 
     // If the point is too close move it to a random point around it 
     if (point.distance(testPoint) < minDistance) 
     { 
      point.x += cos(ofRandom(TWO_PI)) + minDistance; 
      point.y += sin(ofRandom(TWO_PI)) + minDistance; 
     } 
    } 
    dots.push_back(point); 
} 

dotsvector<ofVec2f> dots; 是不完美的,因爲新的計算點並沒有考慮到近先前創建的帳戶點,所以我覺得遞歸方法可以幫助我解決了這個問題。

+0

你可以在你的代碼中包含'ofVec2f'嗎? – cybertextron 2012-07-19 16:08:17

+0

@philippe這裏是一個forVec2f的參考http://www.openframeworks.cc/documentation/math/ofVec2f.html希望有幫助 – 2012-07-19 16:10:10

+0

你可以重新開始你所有點的檢查(而不是繼續你在哪裏循環)後,選擇一個新點,以確保此新位置也不在任何先前檢查點附近。請注意,這種方法可能需要很長時間才能計算出您是否有多個點和/或當前存在的點是否覆蓋了大部分可用區域 – Attila 2012-07-19 16:58:36

回答

0

您可以使用geometric hashing算法來檢查新創建的點是否比任何其他先前創建的點的「minDistance」更近。 當應用於蛋白質構象時,描述這種方法的好文章可以在here中找到。

相關問題