检查Line Interesects n维立方体

时间:2017-06-09 22:47:49

标签: python geometry

我正在尝试确定两个端点start = (x, y, z, ...), end = (x, y, z, ...)给出的线是否与n维立方体或矩形相交,我将其存储为相对的端点bottom_most = (x, y, z, ...), top_most= (x, y, z, ...)

我找到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 个答案:

答案 0 :(得分:1)

如果你考虑一个轴对齐的三维立方体:

考虑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, ...)