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

如何计算三角形外心并绘制外接圆?代码实现问题求助

解决三角形外接圆外心计算的问题

嘿,我懂你现在的处境——内切圆已经稳稳搞定居中了,但外接圆总是跑偏,核心问题就卡在外心的计算上对吧?别慌,外心其实就是三角形三边垂直平分线的交点,我给你一步步拆解计算逻辑,再附上实用的代码示例,应该能帮你快速解决这个问题。

外心的计算原理

假设你获取的三个顶点坐标是 A(x₁,y₁)、B(x₂,y₂)、C(x₃,y₃),计算外心分这几步走:

  • 先算出任意两条边的中点:比如AB边中点M((x₁+x₂)/2, (y₁+y₂)/2),AC边中点N((x₁+x₃)/2, (y₁+y₃)/2)
  • 再算出这两条边的垂直平分线斜率:
    • 如果AB边斜率是k_AB = (y₂-y₁)/(x₂-x₁),那它的垂直平分线斜率就是k₁ = -1/k_AB(特殊情况:AB是竖直线时,垂直平分线是水平线;AB是水平线时,垂直平分线是竖直线)
    • 同理,AC边的垂直平分线斜率k₂ = -1/k_AC(k_AC = (y₃-y₁)/(x₃-x₁))
  • 最后联立两条垂直平分线的直线方程,解出的(x,y)就是外心坐标

代码实现示例(以Python为例)

def calculate_circumcenter(x1, y1, x2, y2, x3, y3):
    # 计算AB、AC边的中点
    mx_ab, my_ab = (x1 + x2)/2, (y1 + y2)/2
    mx_ac, my_ac = (x1 + x3)/2, (y1 + y3)/2

    # 处理AB边为竖直线的情况
    if x2 - x1 == 0:
        # AB的垂直平分线是水平线 y = my_ab
        k_ac = (y3 - y1)/(x3 - x1) if x3 - x1 != 0 else float('inf')
        if k_ac == 0:
            # AC是水平线,垂直平分线是竖直线 x = mx_ac
            cx, cy = mx_ac, my_ab
        else:
            k2 = -1/k_ac if k_ac != float('inf') else 0
            cx = (my_ab - my_ac + k2 * mx_ac)/k2
            cy = my_ab
    # 处理AB边为水平线的情况
    elif y2 - y1 == 0:
        # AB的垂直平分线是竖直线 x = mx_ab
        k_ac = (y3 - y1)/(x3 - x1) if x3 - x1 != 0 else float('inf')
        if k_ac == float('inf'):
            # AC是竖直线,垂直平分线是水平线 y = my_ac
            cx, cy = mx_ab, my_ac
        else:
            k2 = -1/k_ac
            cy = k2 * (mx_ab - mx_ac) + my_ac
            cx = mx_ab
    # 常规情况联立方程求解
    else:
        k_ab = (y2 - y1)/(x2 - x1)
        k1 = -1/k_ab
        k_ac = (y3 - y1)/(x3 - x1) if x3 - x1 != 0 else float('inf')
        
        if k_ac == float('inf'):
            # AC是竖直线,垂直平分线是水平线 y = my_ac
            cx = (my_ac - my_ab)/k1 + mx_ab
            cy = my_ac
        else:
            k2 = -1/k_ac
            # 联立两条垂直平分线方程求解x
            cx = (k1 * mx_ab - k2 * mx_ac + my_ac - my_ab)/(k1 - k2)
            cy = k1 * (cx - mx_ab) + my_ab
    return (cx, cy)

最后一步:计算外接圆半径

拿到外心坐标(cx, cy)后,外接圆的半径就是外心到任意一个顶点的距离,比如:

import math
radius = math.sqrt((cx - x1)**2 + (cy - y1)**2)

用这个圆心和半径绘制外接圆,就能完美贴合三角形的外接位置了。

内容的提问来源于stack exchange,提问作者JDelgado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:37:26