Math 检查空间中的4个点是否为矩形的角点

Math 检查空间中的4个点是否为矩形的角点,math,3d,geometry,rectangles,plane,Math,3d,Geometry,Rectangles,Plane,我在空间A(x,y,z),B(x,y,z),C(x,y,z)和D(x,y,z)中有4个点。如何检查这些点是否为矩形的角点?您必须首先确定这些点是否都是共面的,因为矩形是二维几何对象,但您的点位于三维空间中。通过比较叉积,可以确定它们是共面的,如中所示: V1 = (B-A)×(B-C) V2 = (C-A)×(C-D) 这将为您提供两个向量,如果A、B、C和D共面,则它们是线性相关的。考虑到什么,我们可以使用 C = (V1∙V1)(V2∙V2) - (V1∙V2)(V2∙V1) 如果C为0

我在空间A(x,y,z),B(x,y,z),C(x,y,z)和D(x,y,z)中有4个点。如何检查这些点是否为矩形的角点?

您必须首先确定这些点是否都是共面的,因为矩形是二维几何对象,但您的点位于三维空间中。通过比较叉积,可以确定它们是共面的,如中所示:

V1 = (B-A)×(B-C)
V2 = (C-A)×(C-D)
这将为您提供两个向量,如果
A
B
C
D
共面,则它们是线性相关的。考虑到什么,我们可以使用

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|
假设这些距离都不为0,则这些点形成矩形,当且仅当顶点共面(已验证),并且这些长度可以分组为三对,其中每对元素的长度相同。如果图形是正方形,则两组线对的长度相同,并且比其余的线对短

更新:再次阅读这篇文章,我意识到上面的公式可以定义一个平行四边形,因此需要额外检查最长距离的平方是否等于两个较短距离的平方和。只有这样,平行四边形才能成为矩形


请记住,所有这些都是假设无限精度和严格的数学结构。如果你打算编写代码,你将需要考虑舍入,并接受一定程度的不精确性,这在纯数学术语中并不是一个真正的参与者

使用点积检查
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)