【发布时间】:2015-04-23 13:53:15
【问题描述】:
我在空间 A(x,y,z)、B(x,y,z)、C(x,y,z) 和 D(x,y,z) 中有 4 个点。如何检查这些点是否是矩形的角点?
【问题讨论】:
标签: math 3d geometry rectangles plane
我在空间 A(x,y,z)、B(x,y,z)、C(x,y,z) 和 D(x,y,z) 中有 4 个点。如何检查这些点是否是矩形的角点?
【问题讨论】:
标签: math 3d geometry rectangles plane
您必须首先确定点是否全部共面,因为矩形是 2D 几何对象,但您的点位于 3 空间中。您可以通过比较叉积来确定它们是共面的,如下所示:
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|
假设这些距离都不是 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)
【讨论】: