首先我们需要先检查输入的四个点是不是有重复。然后判断四个角是不是直角即可。
def isOrthogonal(p1, p2, p3):
return (p2[0] - p1[0]) * (p2[0] - p3[0]) + (p2[1] - p1[1]) * (p2[1] - p3[1]) == 0def _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)
一个更加巧妙地回答,我们可以先计算中点的位置
- x c = ( x 1 + x 2 + x 3 + x 4 ) / 4 x_c=(x_1+x_2+x_3+x_4)/4 xc?=(x1?+x2?+x3?+x4?)/4
- y c = ( y 1 + y 2 + y 3 + y 4 ) / 4 y_c=(y_1+y_2+y_3+y_4)/4 yc?=(y1?+y2?+y3?+y4?)/4
def dis(p1, p2):
return (p1[0] - p2[0])**2 + (p1[1] - p2[1])**2def 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://stackoverflow.com/questions/2303278/find-if-4-points-on-a-plane-form-a-rectangle
【Data|判断四个点是否可以构成矩形(优雅的解法!!!)】https://www.geeksforgeeks.org/check-given-four-points-form-square/
推荐阅读
- SQL|SQL基本功(五)--函数、谓词、CASE表达式
- python|深度盘点(一文详解数据分析中100个常用指标和术语)
- 专注于最有价值的事情!——亚马逊云科技首席科学家工作心得分享
- Python、java、go实现"strStr()"的几种方法
- Python、java、go实现"搜索插入位置"的几种方法
- Data|单链表的增删查改
- C|生成一个整数集合的所有子集
- 身兼数职的Amazon DocumentDB,还有什么不为人知的功能()
- 欧几里德算法证明
- Big|Anaconda 换源