簡體   English   中英

生成不重疊的坐標

[英]Generate co-ordinates that do not overlap

我有一個隨機放置線元素的程序。 但是,我希望這些線條不要重疊或交叉(線條完全不接觸)。

查找有關如何執行此操作的示例,通常使用一個循環遍歷多個線元素並生成一個坐標,然后在該循​​環內使用另一個循環檢查該坐標是否在最小距離處。

從到目前為止的經驗來看,使用循環確實會使程序費勁,並且在顯示刺激時,幀會下降。

我這樣做的另一個想法是生成一個坐標列表,然后計算每個坐標的距離。 到目前為止,我擁有的代碼如下:

import numpy as np
import scipy.spatial.distance
import random

length_line=12
nLines = 1000  #the number of line elements that I want

#Random coordinates for the lines. 500X500 pixels centred around 0
xys = np.random.random([nEls,2])*500-250   

#Calculating the distance of the centre of the lines from each other
dist = scipy.spatial.distance.pdist(xys)

minDist = (length_line/2)+2  #the minimum distance that should not cause overlap

print sys

我不太確定如何從這里開始-理想情況下,我希望程序保持最小距離minDist設置的minDist的坐標,並可能用其他東西代替沒有坐標。

這可能嗎? 謝謝。

如果我的理解是正確的,你想生成部分不彼此部分重疊? (但是他們可以交叉,對嗎?)。 在以下建議中,線段和線之間的區別至關重要。

該方法是通過簡化問題:通過將線段擴展為 (無限長)來實現的 檢驗兩條線不重疊是微不足道的(基本上,一條線是一階函數,用f(0)和一個梯度表示)。

在這里,我對二維空間進行了推理,但是可以將其擴展到三維空間。

兩個應避免接近的重疊,您必須以某種方式將f(0)和漸變四舍五入 (例如,小數點后的一位或兩位數)。 那應該比計算距離更快。

每次生成新細分時,您:

  1. 將線段展開為一條線(計算梯度和f(0))。
  2. 檢查該梯度是否沒有預先存在的線。 該測試應消除大多數候選人。
    • 一種快速的方法是實現一個哈希表,其中的鍵是漸變,值是f(0)(起點和終點)。
  3. 如果有候選人,請檢查f(0)。 那也應該消除大多數剩余的候選人。
  4. 最后比較一下這兩個線段沒有重疊-因為您已經知道它們都在同一條線上,所以第一個線段的最高點(y維)不應大於第二個線段的最低點,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM