Python 检查一个点是在长方体内部还是外部的代码
Python code to check if a point is inside or outside a Cuboid
出于特定目的,我必须确定给定点是否在长方体内。在 link ( https://math.stackexchange.com/questions/1472049/check-if-a-point-is-inside-a-rectangular-shaped-area-3d ) 的帮助下。我写了一个原型代码,可以检查点是否在长方体内。
(关于这个的数学,请参考这个link。)
为此,我们应该定义长方体的 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)
如果公共顶点在原点,则工作正常。但如果它是任何一般点,代码是行不通的。
谁能帮我找到问题所在?
如果你的长方体是轴对齐的,这样的计算就太过分了——比较坐标就足够了。
对于任意方向,您必须稍微修改代码。移除奇怪的构造
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"
Returns 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]]
出于特定目的,我必须确定给定点是否在长方体内。在 link ( https://math.stackexchange.com/questions/1472049/check-if-a-point-is-inside-a-rectangular-shaped-area-3d ) 的帮助下。我写了一个原型代码,可以检查点是否在长方体内。
(关于这个的数学,请参考这个link。)
为此,我们应该定义长方体的 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)
如果公共顶点在原点,则工作正常。但如果它是任何一般点,代码是行不通的。 谁能帮我找到问题所在?
如果你的长方体是轴对齐的,这样的计算就太过分了——比较坐标就足够了。
对于任意方向,您必须稍微修改代码。移除奇怪的构造
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"
Returns 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]]