在圆内绘制三角形并添加指向顶点箭头的技术实现问题
解决圆内三角形绘制与两点距离计算问题
核心公式与思路
不管是哪种三角形,先搞定圆上两点距离的通用计算,再结合三角形性质确定顶点,最后完成箭头绘制:
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
相关产品推荐
相关产品推荐

