如何将点C连接至A、B两点创建的已有直线AB?

你需要实现的是点C到直线AB的连线绘制,核心是先计算点C在直线AB上的对应连接点(常规需求是最短垂线段连线,如果需要任意角度连线只需要取AB线上任意点和C连接即可),这套实现逻辑和你使用的绘图工具、编程语言无关,通用可复用:
计算步骤
- 先记录三个点的平面坐标:A
(Ax, Ay)、B(Bx, By)、C(Cx, Cy) - 计算两个方向向量:
- AB方向向量:
ABx = Bx - Ax,ABy = By - Ay - AC方向向量:
ACx = Cx - Ax,ACy = Cy - Ay
- AB方向向量:
- 计算投影比例参数t:
t = (ACx * ABx + ACy * ABy) / (ABx * ABx + ABy * ABy)
这个参数代表连接点D在AB直线上的相对位置:- t=0时D点与A点重合
- t=1时D点与B点重合
- t<0时D点在A点外侧的AB延长线上
- t>1时D点在B点外侧的AB延长线上
- 计算连接点D的坐标:
Dx = Ax + t * ABxDy = Ay + t * ABy - 调用绘图接口连接C点和D点,就能得到你要的连线。
补充说明
- 如果你要连接的是有限长度的AB线段(不是无限延伸的直线),只需要在算出t值后,把t的取值限制在
[0, 1]区间即可,也就是在计算D点坐标前加一步t = max(0, min(1, t)),这样得到的D点一定落在线段AB范围内。 - 以下是Python matplotlib环境下的可运行参考代码:
import matplotlib.pyplot as plt # 替换成你实际的三点坐标 A = (1, 2) B = (6, 5) C = (3, 6) Ax, Ay = A Bx, By = B Cx, Cy = C # 计算垂足坐标 ABx, ABy = Bx - Ax, By - Ay ACx, ACy = Cx - Ax, Cy - Ay t = (ACx * ABx + ACy * ABy) / (ABx ** 2 + ABy ** 2) # 如果要限制落点在线段AB上,取消注释下一行 # t = max(0, min(1, t)) D = (Ax + t * ABx, Ay + t * ABy) # 绘制图形 plt.figure(figsize=(6,6)) plt.plot([Ax, Bx], [Ay, By], linewidth=2, label='直线AB') plt.scatter([Ax, Bx, Cx], [Ay, By, Cy], c='red', s=50, zorder=5) plt.plot([Cx, D[0]], [Cy, D[1]], c='green', linewidth=2, label='C到AB的连线') for point, name in zip([A,B,C], ['A','B','C']): plt.text(point[0]+0.1, point[1]+0.1, name, fontsize=12) plt.axis('equal') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Maite Martinez
相关产品推荐
相关产品推荐

