检查 space 中的 4 个点是否是矩形的角点
Check if 4 points in space are corner points of a rectangle
我在 space A(x,y,z)、B(x,y,z)、C(x,y,z) 和 D(x,y,z) 中有 4 个点.如何检查这些点是否是矩形的角点?
首先要判断点是否共面,因为矩形是二维几何对象,而你的点在3-space中。您可以通过比较叉积来确定它们是共面的,如下所示:
V1 = (B-A)×(B-C)
V2 = (C-A)×(C-D)
这将为您提供两个向量,如果 A
、B
、C
和 D
共面,则它们是线性相关的。通过考虑 Wolfram has to say on vector dependence,我们可以使用
测试向量的线性相关性
C = (V1∙V1)(V2∙V2) - (V1∙V2)(V2∙V1)
如果 C
为 0,则向量 V1
和 V2
线性相关并且所有点共面。
接下来计算每对点之间的距离。总共应该有6个这样的距离。
D1 = |A-B|
D2 = |A-C|
D3 = |A-D|
D4 = |B-C|
D5 = |B-D|
D6 = |C-D|
假设这些距离中的 none 为 0,当且仅当顶点共面(已验证)并且这些长度可以分为三对,每对的元素具有一样的长度。如果图形是正方形,则两组对的长度相同,并且比其余对短。
Update: 再次阅读,我意识到上面可以定义一个平行四边形,所以需要额外检查以检查最长距离的平方是否等于两个较短距离的平方和。只有这样平行四边形也是矩形。
请记住,所有这些都是假设无限精确并且在严格的数学构造内。如果您打算对此进行编码,则需要考虑四舍五入并接受一定程度的不精确性,这在用纯数学术语说话时并不是真正的玩家。
使用点积检查 V1=B-A
和 V2=D-A
是否正交。然后检查是否
C-A == V1+V2
在数值公差范围内。如果两者都为真,则这些点共面并形成一个矩形。
这里定义了一个函数来检查4个点是否代表矩形。
from math import sqrt
def Verify(A, B, C, D, epsilon=0.0001):
# Verify A-B = D-C
zero = sqrt( (A[0]-B[0]+C[0]-D[0])**2 + (A[1]-B[1]+C[1]-D[1])**2 + (A[2]-B[2]+C[2]-D[2])**2 )
if zero > epsilon:
raise ValueError("Points do not form a parallelogram; C is at %g distance from where it should be" % zero)
# Verify (D-A).(B-A) = 0
zero = (D[0]-A[0])*(B[0]-A[0]) + (D[1]-A[1])*(B[1]-A[1]) + (D[2]-A[2])*(B[2]-A[2])
if abs(zero) > epsilon:
raise ValueError("Corner A is not a right angle; edge vector dot product is %g" % zero)
else:
print('rectangle')
A = [x1,y1,z1]
print(A)
B = [x2,y2,z2]
C = [x3,y3,z3]
D = [x4,y4,z4]
Verify(A, B, C, D, epsilon=0.0001)
我在 space A(x,y,z)、B(x,y,z)、C(x,y,z) 和 D(x,y,z) 中有 4 个点.如何检查这些点是否是矩形的角点?
首先要判断点是否共面,因为矩形是二维几何对象,而你的点在3-space中。您可以通过比较叉积来确定它们是共面的,如下所示:
V1 = (B-A)×(B-C)
V2 = (C-A)×(C-D)
这将为您提供两个向量,如果 A
、B
、C
和 D
共面,则它们是线性相关的。通过考虑 Wolfram has to say on vector dependence,我们可以使用
C = (V1∙V1)(V2∙V2) - (V1∙V2)(V2∙V1)
如果 C
为 0,则向量 V1
和 V2
线性相关并且所有点共面。
接下来计算每对点之间的距离。总共应该有6个这样的距离。
D1 = |A-B|
D2 = |A-C|
D3 = |A-D|
D4 = |B-C|
D5 = |B-D|
D6 = |C-D|
假设这些距离中的 none 为 0,当且仅当顶点共面(已验证)并且这些长度可以分为三对,每对的元素具有一样的长度。如果图形是正方形,则两组对的长度相同,并且比其余对短。
Update: 再次阅读,我意识到上面可以定义一个平行四边形,所以需要额外检查以检查最长距离的平方是否等于两个较短距离的平方和。只有这样平行四边形也是矩形。
请记住,所有这些都是假设无限精确并且在严格的数学构造内。如果您打算对此进行编码,则需要考虑四舍五入并接受一定程度的不精确性,这在用纯数学术语说话时并不是真正的玩家。
使用点积检查 V1=B-A
和 V2=D-A
是否正交。然后检查是否
C-A == V1+V2
在数值公差范围内。如果两者都为真,则这些点共面并形成一个矩形。
这里定义了一个函数来检查4个点是否代表矩形。
from math import sqrt
def Verify(A, B, C, D, epsilon=0.0001):
# Verify A-B = D-C
zero = sqrt( (A[0]-B[0]+C[0]-D[0])**2 + (A[1]-B[1]+C[1]-D[1])**2 + (A[2]-B[2]+C[2]-D[2])**2 )
if zero > epsilon:
raise ValueError("Points do not form a parallelogram; C is at %g distance from where it should be" % zero)
# Verify (D-A).(B-A) = 0
zero = (D[0]-A[0])*(B[0]-A[0]) + (D[1]-A[1])*(B[1]-A[1]) + (D[2]-A[2])*(B[2]-A[2])
if abs(zero) > epsilon:
raise ValueError("Corner A is not a right angle; edge vector dot product is %g" % zero)
else:
print('rectangle')
A = [x1,y1,z1]
print(A)
B = [x2,y2,z2]
C = [x3,y3,z3]
D = [x4,y4,z4]
Verify(A, B, C, D, epsilon=0.0001)