欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

判断四个点是否可以构成矩形(优雅的解法!!!)

程序员文章站 2022-03-02 10:58:24
...

首先我们需要先检查输入的四个点是不是有重复。然后判断四个角是不是直角即可。

def isOrthogonal(p1, p2, p3):
    return (p2[0] - p1[0]) * (p2[0] - p3[0]) + (p2[1] - p1[1]) * (p2[1] - p3[1]) == 0

def _isRectangle(p1, p2, p3, p4):
    return self.isOrthogonal(p1, p2, p3) and self.isOrthogonal(p2, p3, p4) and self.isOrthogonal(p3, p4, p1)

def isRectangle(p1, p2, p3, p4):
    return self._isRectangle(p1, p2, p3, p4) or self._isRectangle(p2, p3, p1, p4) or self._isRectangle(p1, p3, p2, p4)

一个更加巧妙地回答,我们可以先计算中点的位置

  • xc=(x1+x2+x3+x4)/4x_c=(x_1+x_2+x_3+x_4)/4
  • yc=(y1+y2+y3+y4)/4y_c=(y_1+y_2+y_3+y_4)/4

然后再计算中点到四个点的距离是不是一样即可。

def dis(p1, p2):
    return (p1[0] - p2[0])**2 + (p1[1] - p2[1])**2

def isRectangle(p1, p2, p3, p4):
    x_c = (p1[0] + p2[0] + p3[0] + p4[0])/4
    y_c = (p1[1] + p2[1] + p3[1] + p4[1])/4
    d1 = dis(p1, (x_c,y_c))
    d2 = dis(p2, (x_c,y_c))
    d3 = dis(p3, (x_c,y_c))
    d4 = dis(p4, (x_c,y_c))
    return d1 == d2 and d1 == d3 and d1 == d4

reference:

https://*.com/questions/2303278/find-if-4-points-on-a-plane-form-a-rectangle

https://www.geeksforgeeks.org/check-given-four-points-form-square/

相关标签: 判断矩形