Python如何判断四个元组点构成正方形、矩形、平行四边形或菱形
Python 四边形类型判定实现
给定测试坐标:p1 = (2, 2), p2 = (2, 6), p3 = (6, 6), p4 = (6, 2),以下是四个判定函数的实现逻辑与可运行代码。
核心判定逻辑
判定逻辑基于四边形的几何特征,全程使用距离平方做计算,避免浮点数开根号带来的精度误差:
- 平行四边形:对角线互相平分,即两条对角线的中点坐标完全重合,需要覆盖点输入顺序不固定的三种对角线组合情况
- 菱形:首先满足平行四边形条件,同时四条边长度完全相等,排除点完全重合的无效场景
- 矩形:首先满足平行四边形条件,同时两条对角线长度相等
- 正方形:同时满足矩形和菱形的判定条件,即四条边等长、对角线等长
完整代码
def distance_sq(point_a, point_b): """计算两点间欧氏距离的平方,规避浮点数精度问题""" return (point_a[0] - point_b[0]) ** 2 + (point_a[1] - point_b[1]) ** 2 def isParallelogram(p1, p2, p3, p4): """校验四个点是否构成平行四边形""" # 枚举所有可能的对角线配对,只要有一组满足中点重合即符合条件 diag_pair1 = (p1[0] + p3[0] == p2[0] + p4[0]) and (p1[1] + p3[1] == p2[1] + p4[1]) diag_pair2 = (p1[0] + p2[0] == p3[0] + p4[0]) and (p1[1] + p2[1] == p3[1] + p4[1]) diag_pair3 = (p1[0] + p4[0] == p2[0] + p3[0]) and (p1[1] + p4[1] == p2[1] + p3[1]) return diag_pair1 or diag_pair2 or diag_pair3 def isRhombus(p1, p2, p3, p4): """校验四个点是否构成菱形""" if not isParallelogram(p1, p2, p3, p4): return False # 四条边长度相等,且边长不为0(排除点重合的无效情况) edge1 = distance_sq(p1, p2) edge2 = distance_sq(p2, p3) edge3 = distance_sq(p3, p4) edge4 = distance_sq(p4, p1) return edge1 == edge2 == edge3 == edge4 and edge1 != 0 def isRectangle(p1, p2, p3, p4): """校验四个点是否构成矩形""" if not isParallelogram(p1, p2, p3, p4): return False # 计算所有两点间距离并排序,排序后最后两个为对角线长度 all_dist = [] points = [p1, p2, p3, p4] for i in range(4): for j in range(i+1, 4): all_dist.append(distance_sq(points[i], points[j])) all_dist.sort() # 对角线长度相等,且边长不为0 return all_dist[4] == all_dist[5] and all_dist[0] != 0 def isSquare(p1, p2, p3, p4): """校验四个点是否构成正方形""" return isRectangle(p1, p2, p3, p4) and isRhombus(p1, p2, p3, p4) # 测试给定坐标 if __name__ == "__main__": p1 = (2, 2) p2 = (2, 6) p3 = (6, 6) p4 = (6, 2) print(f"isSquare判定结果:{isSquare(p1, p2, p3, p4)}") print(f"isRectangle判定结果:{isRectangle(p1, p2, p3, p4)}") print(f"isParallelogram判定结果:{isParallelogram(p1, p2, p3, p4)}") print(f"isRhombus判定结果:{isRhombus(p1, p2, p3, p4)}")
运行输出
isSquare判定结果:True isRectangle判定结果:True isParallelogram判定结果:True isRhombus判定结果:True
给定的四个点构成边长为4的轴对齐正方形,因此四个判定函数均返回True。代码兼容四个点输入顺序不固定的场景,不需要提前按顺时针/逆时针排序点集。
内容的提问来源于stack exchange,提问作者Sachin Kumar
相关产品推荐
相关产品推荐

