用于检查点是在长方体内部还是外部的Python代码

2024-05-15 14:02:47 发布

您现在位置:Python中文网/ 问答频道 /正文

为了一个特殊的目的,我必须找出一个给定的点是否在长方体内部。借助此链接(https://math.stackexchange.com/questions/1472049/check-if-a-point-is-inside-a-rectangular-shaped-area-3d)的帮助。我已经编写了一个原型代码,可以检查点是否在长方体内

(有关此项的数学,请参阅此链接。)

为此,我们应该定义长方体的3个相互垂直的轴

这是我的密码

import numpy

def dot(v1, v2):
    return numpy.sqrt(numpy.square(numpy.dot(v1, v2)))

def InCuboid ( plist,pnt):
    c1 = plist[0]
    c2 = plist[1]
    c3 = plist[2]
    c4 = plist[3]
    u1 = numpy.subtract(c1, c2)
    u2 = numpy.subtract(c1, c3)
    u3 = numpy.subtract(c1, c4)
    t = pnt
    if dot(u1, c1) <= dot(u1, t) <= dot(u1, c2) and dot(u2, c1) <= dot(u2, t) <= dot(u2, c3) and dot(u3, c1) <= dot(u3,t) <= dot(u3, c4):
        return "In"
    else :
        return "Out"

c1 = [-100,1,-10]
c2 = [-50,1,-10]
c3 = [-100,3.0,-10]
c4 = [-100,1,10]

plst = [c1,c2,c3,c4]
mlst = [[0,0,0],[100,1000,1000],[-80,2,0],[-80,2,1]]

for p in mlst :
    print InCuboid(plst,p)


如果公共顶点位于原点,则可以正常工作。但如果是一般性的问题,代码就不起作用了。 有人能帮我找到问题吗


Tags: numpyreturnif链接dotplistsubtractc2
1条回答
网友
1楼 · 发布于 2024-05-15 14:02:47

如果您的长方体是轴对齐的,那么这样的计算就太过分了——比较坐标就足够了

对于任意方向,您必须稍微修改代码。移除奇怪的结构

return numpy.sqrt(numpy.square(numpy.dot(v1, v2)))

你是说abs吗?我怀疑算法需要省略点积符号

def dot(v1, v2):
    return numpy.dot(v1, v2)
....
 u1 = numpy.subtract(c1, c2)
 u2 = numpy.subtract(c1, c3)
 u3 = numpy.subtract(c1, c4)
 t = pnt
 if min(dot(u1, c1), dot(u1, c2)) <= dot(u1, t) <= max(dot(u1, c1), dot(u1, c2))\
    and min(dot(u2, c1), dot(u2, c3)) <= dot(u2, t) <= max(dot(u2, c1), dot(u1, c3))\
    and min(dot(u3, c1), dot(u3, c4)) <= dot(u3, t) <= max(dot(u3, c1), dot(u3, c4)):
        return "In"
    else :
        return "Out"

为您的示例返回Out Out In In,为我的示例返回In In Out Out

c1 = [-10,-10,-10]
c2 = [-10, -10, 10]
c3 = [-10, 10, -10]
c4 = [10, -10, -10]

plst = [c1,c2,c3,c4]
mlst = [[0,0,0],[1,1,1],[30,2,0],[4,-20,1]]

相关问题 更多 >