2017-06-09 20 views
0

我想確定兩個端點start = (x, y, z, ...), end = (x, y, z, ...)給出的線是否與n維立方體或矩形相交,我將其存儲爲相反端點bottom_most = (x, y, z, ...), top_most= (x, y, z, ...)檢查線互相關n維立方體

我發現solutions in 3D,但不是一個一般化的n維。

我目前的解決辦法是:

dimensions = 3 


def check_intersects(start, end, cube): 
    num_intersections = 0 
    for dim in range(dimensions): 
     if cube[dim] <= start[dim] <= cube[self.dimensions + dim] or start[dim] <= cube[dim] <= end[dim]: 
      num_intersections += 1 

    if num_intersections >= dimensions: 
     return True 

    return False 


start, end = (0, 0, 0), (30, 30, 30) 
cube = (10, 10, 10, 20, 20, 20) 
print(check_intersects(start, end, cube)) 
start, end = (0, 0, 0), (0, 10, 20) 
print(check_intersects(start, end, cube)) 

,但是這似乎打破在某些情況下,該行從某些角度進去。

是否有更好的解決方案,或能爲我做這個圖書館?

回答

1

如果你仔細想想軸對齊的3D立方體:

考慮x軸,說(例如)立方體運行從x = 2至x = 4。所以你可以把「片」的在x = 2和x = 4處由平行平面界定的空間;

然後考慮y軸,從(比方說)Y = 3到y = 5 「片」;和z中的一個片段;和(如果你將它擴展到更高的尺寸)每個相應維度中的一個切片;

,那麼你可以把魔方那些片的交叉點 - 這同時屬於所有片的所有點。

如果定義了線的任意點作爲

pt = start + k * (end - start) 

然後爲每個維度你可以找到min_k和MAX_K其中線進入和離開該維度的切片,

但穿過(超)立方體必須有一些k同時屬於所有的價值,即

max(min_k_x, min_k_y, min_k_z, ...) <= min(max_k_x, max_k_y, max_k_z, ...) 
+0

它看起來像我的問題源於行的方向。某些行可能會「向後」,從右到左或從上到下,因此某些軸比較不起作用。 – Teknophilia

+0

通過使用開始和結束的相應最小/最大值來解決此問題。 – Teknophilia