python计算三角形的内心、外心、中心、垂心、旁心
时间: 2025-02-04 12:25:27 浏览: 48
### 计算三角形五心的Python实现
#### 定义辅助函数
为了简化后续计算过程,定义一些常用的几何运算函数:
```python
import math
def distance(p1, p2):
"""两点之间的距离"""
return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)
def slope(p1, p2):
"""通过两个点计算直线斜率"""
if p2[0] != p1[0]:
return (p2[1]-p1[1])/(p2[0]-p1[0])
else:
return None # 表示垂直线的情况
def perpendicular_slope(slope_value):
"""给定一条直线的斜率,返回其垂线的斜率"""
if slope_value is not None and slope_value != 0:
return -1 / slope_value
elif slope_value == 0:
return None # 平行于X轴变为平行Y轴
else:
return 0 # 原本是None表示垂直线,则现在变水平线
```
#### 计算内心
内心的坐标可以通过角平分线交点来获得。这里采用面积法求解。
```python
def incenter(A, B, C):
ax, ay = A; bx, by = B; cx, cy = C
a = distance(B,C); b = distance(A,C); c = distance(A,B)
px = (a*ax + b*bx + c*cx) / (a+b+c)
py = (a*ay + b*by + c*cy) / (a+b+c)
return round(px, 5), round(py, 5)
```
#### 计算外心
外心位于三边中垂线的交点处。
```python
def circumcenter(A, B, C):
D = 2 * ((B[0] - A[0])*(C[1] - A[1]) - (B[1] - A[1])*(C[0] - A[0]))
Ux = (((B[0]**2 + B[1]**2)*(C[1] - A[1])) - ((C[0]**2 + C[1]**2)*(B[1] - A[1])) + ((A[0]**2 + A[1]**2)*(B[1] - C[1]))) / D
Uy = (((B[0]**2 + B[1]**2)*(C[0] - A[0])) - ((C[0]**2 + C[1]**2)*(B[0] - A[0])) + ((A[0]**2 + A[1]**2)*(B[0] - C[0]))) / D
return round(Ux, 5), round(Uy, 5)
```
#### 计算重心
重心就是三个顶点坐标的平均值。
```python
def centroid(A, B, C):
gx = sum([pt[0] for pt in [A, B, C]])/3
gy = sum([pt[1] for pt in [A, B, C]])/3
return round(gx, 5), round(gy, 5)
```
#### 计算垂心
利用两条高的交点作为垂心位置。
```python
def orthocenter(A, B, C):
mAB = slope(A, B)
mBC = slope(B, C)
mhAC = perpendicular_slope(mAB)
mhBA = perpendicular_slope(mBC)
if mhAC is None or mhBA is None:
raise ValueError('无法处理直角或钝角三角形')
x_diff_AC = C[0] - A[0]; y_diff_AC = C[1] - A[1]
x_diff_BA = A[0] - B[0]; y_diff_BA = A[1] - B[1]
H_x = (mhAC*x_diff_AC*A[0]+mhBA*x_diff_BA*B[0]+mAB*y_diff_AC*C[1]-mBC*y_diff_BA*A[1])/(
mhAC*x_diff_AC-mhBA*x_diff_BA+mAB*y_diff_AC-mBC*y_diff_BA)
H_y = (-perpendicular_slope(mhAC)*H_x+A[1]+slope(C,A)*(H_x-A[0]))
return round(H_x, 5), round(H_y, 5)
```
#### 计算旁心
对于每个顶点对应的旁切圆来说,旁心可以看作是由该顶点出发向另外两边做高并延长后的交点。
由于旁心涉及到较为复杂的解析几何推导,在此仅提供一种基于已知公式的简单方法:
```python
def excenters(A, B, C):
results = []
sides = sorted([(distance(A, B),'c'), (distance(B, C),'a'), (distance(C, A),'b')], key=lambda item:item[0])
for i in range(len(sides)):
opposite_side_length, side_label = sides[i][0],sides[i][1]
adjacent_sides_lengths = list(map(lambda t:t[0],[item for idx,item in enumerate(sides)if idx!=i]))
s = sum(adjacent_sides_lengths)/2
Ix = (adjacent_sides_lengths[0]*A[0]+adjacent_sides_lengths[1]*B[0]-opposite_side_length*C[0])/(sum(adjacent_sides_lengths)-opposite_side_length)
Iy = (adjacent_sides_lengths[0]*A[1]+adjacent_sides_lengths[1]*B[1]-opposite_side_length)
results.append({'label':f'I_{side_label}', 'coords':(round(Ix, 5), round(Iy, 5))})
return results
```
上述代码实现了对三角形五个特殊点——内心、外心、重心、垂心以及旁心的计算[^1]。
阅读全文
相关推荐







