2017-06-09 10 views
0

2つの端点start = (x, y, z, ...), end = (x, y, z, ...)によって与えられた線がn次元キューブまたは矩形と交差するかどうかを調べようとしています。これは反対の端点bottom_most = (x, y, z, ...), top_most= (x, y, z, ...)として保存しています。Lineが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 = 2からのx = 4に(例えば)と言う、x軸を考えますx = 2およびx = 4における平行平面によって境界が定められた空間の、

次に、y = 3からy = 5までの "スライス"を持つy軸を考えます。 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

関連する問題