如何计算三角形外心并绘制外接圆?代码实现问题求助
解决三角形外接圆外心计算的问题
嘿,我懂你现在的处境——内切圆已经稳稳搞定居中了,但外接圆总是跑偏,核心问题就卡在外心的计算上对吧?别慌,外心其实就是三角形三边垂直平分线的交点,我给你一步步拆解计算逻辑,再附上实用的代码示例,应该能帮你快速解决这个问题。
外心的计算原理
假设你获取的三个顶点坐标是 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₁))
- 如果AB边斜率是
- 最后联立两条垂直平分线的直线方程,解出的(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
相关产品推荐
相关产品推荐

