【问题标题】:Check if 4 points in space are corner points of a rectangle检查空间中的4个点是否是矩形的角点
【发布时间】: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


    【解决方案1】:

    您必须首先确定点是否全部共面,因为矩形是 2D 几何对象,但您的点位于 3 空间中。您可以通过比较叉积来确定它们是共面的,如下所示:

    V1 = (B-A)×(B-C)
    V2 = (C-A)×(C-D)
    

    这将为您提供两个向量,如果 ABCD 共面,则它们是线性相关的。通过考虑Wolfram has to say on vector dependence,我们可以通过使用来测试向量的线性相关性

    C = (V1∙V1)(V2∙V2) - (V1∙V2)(V2∙V1)
    

    如果C 为0,则向量V1V2 是线性相关的,并且所有点都是共面的。

    接下来计算每对点之间的距离。这样的距离应该一共有6个。

    D1 = |A-B|
    D2 = |A-C|
    D3 = |A-D|
    D4 = |B-C|
    D5 = |B-D|
    D6 = |C-D|
    

    假设这些距离都不是 0,当且仅当顶点共面(已经验证)并且这些长度可以分组为三对,每对的元素具有相同的长度时,这些点才形成一个矩形。如果图形是正方形,则两组对的长度相同,并且比剩下的一对短。

    更新:再读一遍,我意识到上面可以定义一个平行四边形,所以需要额外检查来检查最长距离的平方是否等于两个较短的距离。只有这样,平行四边形才会是一个矩形。

    请记住,所有这些都是假设无限精度并在严格的数学结构内。如果您打算对此进行编码,则需要考虑四舍五入并接受一定程度的不精确性,这在纯数学术语中并不是真正的玩家。

    【讨论】:

      【解决方案2】:

      使用点积检查V1=B-AV2=D-A 是否正交。然后检查是否

      C-A == V1+V2
      

      在数值公差范围内。如果两者都为真,则这些点共面并形成一个矩形。

      【讨论】:

        【解决方案3】:

        这里定义了一个函数来检查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)
        

        【讨论】:

          猜你喜欢
          • 2012-07-10
          • 1970-01-01
          • 2012-08-22
          • 2013-06-12
          • 1970-01-01
          • 2011-05-11
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多