You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 04:18:23