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

在圆内绘制三角形并添加指向顶点箭头的技术实现问题

解决圆内三角形绘制与两点距离计算问题

核心公式与思路

不管是哪种三角形,先搞定圆上两点距离的通用计算,再结合三角形性质确定顶点,最后完成箭头绘制:

1. 圆上两点距离的通用计算

针对单位圆(半径r=1),有两种高效计算方式:

  • 欧几里得距离公式(已知两点坐标时):
    若两点坐标为$(x_1,y_1)$和$(x_2,y_2)$,距离$d$为:
    $$d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}$$
    对应代码:distance = np.sqrt((x2-x1)**2 + (y2-y1)**2)

  • 弦长公式(已知两点对应的角度时):
    若两点对应的圆心角为$\Delta\theta = |\theta_1 - \theta_2|$,距离$d$为:
    $$d = 2\sin\left(\frac{\Delta\theta}{2}\right)$$
    如果是半径为$r$的圆,公式改为$d = 2r\sin\left(\frac{\Delta\theta}{2}\right)$
    对应代码:distance = 2 * np.sin(np.abs(theta1 - theta2)/2)

2. 三角形顶点的确定

  • 直角三角形:利用圆的性质——直径所对的圆周角是直角。任选圆的一条直径的两个端点作为三角形的两个顶点,第三个顶点可以是圆上任意一点;也可以通过向量点积为0的条件($\vec{AC} \cdot \vec{BC} = 0$)计算符合条件的顶点。
  • 等腰三角形:第三个顶点必在两点连线的垂直平分线上,而圆上两点的垂直平分线必过圆心,因此只需计算两点角度的平均值,再加减$\pi/2$即可得到顶点对应的角度,进而算出坐标。

3. 箭头绘制的通用方法

plt.arrow()的参数是(x_start, y_start, dx, dy),其中$(x_start,y_start)$是箭头起点,$dx$和$dy$是终点相对于起点的偏移量:

  • 若从点$P$指向点$Q$:$dx = Q_x - P_x$,$dy = Q_y - P_y$
  • 若从线段$PQ$的中点指向点$R$:先算中点坐标$\left(\frac{P_x+Q_x}{2}, \frac{P_y+Q_y}{2}\right)$,再计算$dx = R_x - 中点_x$,$dy = R_y - 中点_y$

代码示例

示例1:单位圆内绘制等腰三角形+指向顶点的箭头

import numpy as np
import matplotlib.pyplot as plt

# 生成单位圆
theta_circle = np.linspace(0, 2*np.pi, 100)
x_circle = np.cos(theta_circle)
y_circle = np.sin(theta_circle)

# 定义圆上任意两点的角度(可替换成任意值)
theta1 = np.pi/6  # 30度
theta2 = 5*np.pi/6  # 150度

# 计算两点坐标
A = (np.cos(theta1), np.sin(theta1))
B = (np.cos(theta2), np.sin(theta2))

# 计算AB距离(两种方法验证)
distance_ab_euclid = np.sqrt((A[0]-B[0])**2 + (A[1]-B[1])**2)
distance_ab_chord = 2 * np.sin(np.abs(theta1 - theta2)/2)

# 确定等腰三角形顶点C:在AB垂直平分线上的圆上点
theta_c = (theta1 + theta2)/2 + np.pi/2  # 也可以减np.pi/2得到另一个顶点
C = (np.cos(theta_c), np.sin(theta_c))

# 绘制图形
plt.figure(figsize=(6,6))
plt.plot(x_circle, y_circle, color='gray')
# 绘制三角形顶点与边
plt.scatter(*A, color='C1', marker='o')
plt.scatter(*B, color='C1', marker='o')
plt.scatter(*C, color='C2', marker='o')
plt.plot([A[0], B[0]], [A[1], B[1]], color='blue')
plt.plot([A[0], C[0]], [A[1], C[1]], color='blue')
plt.plot([B[0], C[0]], [B[1], C[1]], color='blue')
# 绘制从AB中点指向C的箭头
mid_ab = ((A[0]+B[0])/2, (A[1]+B[1])/2)
plt.arrow(mid_ab[0], mid_ab[1], C[0]-mid_ab[0], C[1]-mid_ab[1],
          width=0.005, color='red', head_width=0.05, head_length=0.08,
          head_starts_at_zero=False)

# 标注距离
plt.text(mid_ab[0], mid_ab[1]-0.12, f"AB距离: {distance_ab_euclid:.2f}", ha='center')
plt.axis('equal')
plt.show()

print(f"AB距离(欧几里得):{distance_ab_euclid:.2f}")
print(f"AB距离(弦长公式):{distance_ab_chord:.2f}")

示例2:单位圆内绘制直角三角形+指向顶点的箭头

import numpy as np
import matplotlib.pyplot as plt

# 生成单位圆
theta_circle = np.linspace(0, 2*np.pi, 100)
x_circle = np.cos(theta_circle)
y_circle = np.sin(theta_circle)

# AB为直径端点(直角三角形的两个顶点)
A = (1, 0)
B = (-1, 0)
# 圆上任意一点作为直角顶点C
theta_c = np.pi/3  # 60度
C = (np.cos(theta_c), np.sin(theta_c))

# 计算各边距离
distance_ac = np.sqrt((C[0]-A[0])**2 + (C[1]-A[1])**2)
distance_bc = np.sqrt((C[0]-B[0])**2 + (C[1]-B[1])**2)

# 绘制图形
plt.figure(figsize=(6,6))
plt.plot(x_circle, y_circle, color='gray')
# 绘制三角形顶点与边
plt.scatter(*A, color='C1', marker='o')
plt.scatter(*B, color='C1', marker='o')
plt.scatter(*C, color='C2', marker='o')
plt.plot([A[0], B[0]], [A[1], B[1]], color='blue')
plt.plot([A[0], C[0]], [A[1], C[1]], color='blue')
plt.plot([B[0], C[0]], [B[1], C[1]], color='blue')
# 绘制从A、B指向C的箭头
plt.arrow(A[0], A[1], C[0]-A[0], C[1]-A[1], width=0.005, color='red', head_width=0.05)
plt.arrow(B[0], B[1], C[0]-B[0], C[1]-B[1], width=0.005, color='red', head_width=0.05)

# 标注距离
plt.text(0, -0.1, f"AB直径长度: 2.00", ha='center')
plt.text((A[0]+C[0])/2, (A[1]+C[1])/2 + 0.08, f"AC: {distance_ac:.2f}", ha='center')
plt.text((B[0]+C[0])/2, (B[1]+C[1])/2 + 0.08, f"BC: {distance_bc:.2f}", ha='center')
plt.axis('equal')
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:15:40