如何在另一条线上停止 pyplot 线?
How can I stop pyplot lines on another line?
您好!有谁知道使用 matpltolib 实现类似于图表显示的内容?我需要绘制一些不跨越给定线 AB 的线,例如 CC' 和 DD'。有什么办法可以实现吗?
从C点画一条线,垂直于AB线,止于AB,可以计算出投影点P。 P 应该在 AB 上,所以 P = t*A + (1-t)*B
。这个关于点的方程意味着它应该同时适用于 x 和 y 坐标:xp = t * xa + (1 - t) * xb
和 yp = t * ya + (1 - t) * yb)
对于某些 t
。 P 也应该在包含 C 的直线上,并以垂直矢量作为其方向。垂直矢量为yb - ya, - (xb - xa)
。所以,P = C + u * Perp
对于一些 u
。
Sympy,Python 的符号数学库可用于求解这些方程:
from sympy import symbols, Eq, solve
t, u, xa, ya, xb, yb, xc, yc = symbols('t u xa ya xb yb xc yc ')
eqpx = Eq(xc + u * (yb - ya), t * xa + (1 - t) * xb)
eqpy = Eq(yc + u * (xa - xb), t * ya + (1 - t) * yb)
solution = solve([eqpx, eqpy])
这发现:
{t: -(xa*xb - xa*xc - xb**2 + xb*xc + ya*yb - ya*yc - yb**2 + yb*yc)/(xa**2 - 2*xa*xb + xb**2 + ya**2 - 2*ya*yb + yb**2),
u: (xa*yb - xa*yc - xb*ya + xb*yc + xc*ya - xc*yb)/(xa**2 - 2*xa*xb + xb**2 + ya**2 - 2*ya*yb + yb**2)}
该解可用于定义一个函数,将点 C 投影到直线 AB 上。这是一个例子:
from matplotlib import pyplot as plt
def project_on_line(xc, yc, xa, ya, xb, yb):
t = -(xa * xb - xa * xc - xb ** 2 + xb * xc + ya * yb - ya * yc - yb ** 2 + yb * yc) / (
xa ** 2 - 2 * xa * xb + xb ** 2 + ya ** 2 - 2 * ya * yb + yb ** 2)
return t * xa + (1 - t) * xb, t * ya + (1 - t) * yb
def show_point(x, y, name):
plt.text(x, y, f' {name}', ha='left', va='top')
xa, ya = 0, 2
xb, yb = 6, 5
xc, yc = 5, 1
xd, yd = 7, 0
xcp, ycp = project_on_line(xc, yc, xa, ya, xb, yb)
xdp, ydp = project_on_line(xd, yd, xa, ya, xb, yb)
show_point(xa, ya, "A")
show_point(xb, yb, "B")
show_point(xc, yc, "C")
show_point(xcp, ycp, "C'")
show_point(xd, yd, "D")
show_point(xdp, ydp, "D'")
plt.plot([xa, xb], [ya, yb], color='dodgerblue')
plt.plot([xc, xcp], [yc, ycp], color='dodgerblue')
plt.plot([xd, xdp], [yd, ydp], color='dodgerblue')
plt.axis('equal')
plt.show()
您好!有谁知道使用 matpltolib 实现类似于图表显示的内容?我需要绘制一些不跨越给定线 AB 的线,例如 CC' 和 DD'。有什么办法可以实现吗?
从C点画一条线,垂直于AB线,止于AB,可以计算出投影点P。 P 应该在 AB 上,所以 P = t*A + (1-t)*B
。这个关于点的方程意味着它应该同时适用于 x 和 y 坐标:xp = t * xa + (1 - t) * xb
和 yp = t * ya + (1 - t) * yb)
对于某些 t
。 P 也应该在包含 C 的直线上,并以垂直矢量作为其方向。垂直矢量为yb - ya, - (xb - xa)
。所以,P = C + u * Perp
对于一些 u
。
Sympy,Python 的符号数学库可用于求解这些方程:
from sympy import symbols, Eq, solve
t, u, xa, ya, xb, yb, xc, yc = symbols('t u xa ya xb yb xc yc ')
eqpx = Eq(xc + u * (yb - ya), t * xa + (1 - t) * xb)
eqpy = Eq(yc + u * (xa - xb), t * ya + (1 - t) * yb)
solution = solve([eqpx, eqpy])
这发现:
{t: -(xa*xb - xa*xc - xb**2 + xb*xc + ya*yb - ya*yc - yb**2 + yb*yc)/(xa**2 - 2*xa*xb + xb**2 + ya**2 - 2*ya*yb + yb**2),
u: (xa*yb - xa*yc - xb*ya + xb*yc + xc*ya - xc*yb)/(xa**2 - 2*xa*xb + xb**2 + ya**2 - 2*ya*yb + yb**2)}
该解可用于定义一个函数,将点 C 投影到直线 AB 上。这是一个例子:
from matplotlib import pyplot as plt
def project_on_line(xc, yc, xa, ya, xb, yb):
t = -(xa * xb - xa * xc - xb ** 2 + xb * xc + ya * yb - ya * yc - yb ** 2 + yb * yc) / (
xa ** 2 - 2 * xa * xb + xb ** 2 + ya ** 2 - 2 * ya * yb + yb ** 2)
return t * xa + (1 - t) * xb, t * ya + (1 - t) * yb
def show_point(x, y, name):
plt.text(x, y, f' {name}', ha='left', va='top')
xa, ya = 0, 2
xb, yb = 6, 5
xc, yc = 5, 1
xd, yd = 7, 0
xcp, ycp = project_on_line(xc, yc, xa, ya, xb, yb)
xdp, ydp = project_on_line(xd, yd, xa, ya, xb, yb)
show_point(xa, ya, "A")
show_point(xb, yb, "B")
show_point(xc, yc, "C")
show_point(xcp, ycp, "C'")
show_point(xd, yd, "D")
show_point(xdp, ydp, "D'")
plt.plot([xa, xb], [ya, yb], color='dodgerblue')
plt.plot([xc, xcp], [yc, ycp], color='dodgerblue')
plt.plot([xd, xdp], [yd, ydp], color='dodgerblue')
plt.axis('equal')
plt.show()