我在空间A(x,y,z),B(x,y,z),C(x,y,z)和D(x,y,z)中有4个点。如何检查这些点是否是矩形的角点?
答案 0 :(得分:3)
您必须首先确定这些点是否都是共面的,因为矩形是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,当且仅当顶点是共面的(已经验证)时,这些点形成矩形,并且这些长度可以分组为三对,其中每对的元素具有相同的长度。如果数字是正方形,则两组对将具有相同的长度,并且将比其余对更短。
更新:再次阅读此内容,我意识到上面可以定义一个平行四边形,因此需要额外检查以检查最长距离的平方是否等于平方的平方和两个较短的距离。只有这样,平行四边形也是一个矩形。
请记住,所有这些都是在无限精确度和严格的数学结构内。如果你打算对此进行编码,那么你需要考虑舍入并接受一定程度的不精确性,而这种不精确性在用纯粹的数学术语说话时并不是真正的玩家。
答案 1 :(得分:0)
使用点积检查V1=B-A
和V2=D-A
是否正交。然后检查是否
C-A == V1+V2
在数值公差范围内。如果两者都为真,则这些点是共面的并形成一个矩形。
答案 2 :(得分:0)
这里定义了一个函数来检查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)