在xy平面上绘制与(x,y)坐标法线的垂直线?
Ploting perpendicular line to normal of (x,y) coordinates on xy plane?
我想绘制位于 xy 平面上的点。问题是这些点具有给定的 x、y 和 z 坐标。我想要一架飞机,而不是 3d 物体。所以平面将是 xy、xz、yz。但其他的可以从xy平面举例说明。我问的是xy平面案例。
示例点及其对应的法线
point A=(10600, 26.662,-0.420), (Normal) N_A = [0.91, 0.36, 0.21]
point B=(9600, -30.532,-6.208), (Normal) N_B = [0.81, 0.50, -0.30]
point C=(1000, 10.5, -3.72), (Normal) N_C = [-0.83, -0.54, 0.11]
从这些x、y、z坐标中获取x和y值,如何绘制xy平面上的点及其法线和法线的垂线?
enter image description here
如果你想投影到xy平面上,你只需要使用点的前两个坐标:
A_xy = [A[0], A[1]]
在xz平面上的投影是
A_xz = [A[0], A[2]]
等等。投影可以绘制为平面上的箭头或点。
如果您在平面中有一个矢量 N = [nx, ny]
,则垂直于该矢量并通过点 N
的线由下式给出:
y(x) = -nx/ny*(x - nx) + ny
您可以将其绘制为变量 x 中的函数。或者,使用此函数计算起点和终点,并在计算出的起点和终点之间绘制一条直线。
示例:
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import numpy as np
fig, ax = plt.subplots()
arrow_scale = 100
A = [10600, 26.662,-0.420]
N_A = np.array([0.91, 0.36, 0.21])*arrow_scale
B = [9600, -30.532,-6.208]
N_B = np.array([0.81, 0.50, -0.30])*arrow_scale
xmin = min(A[0], B[0]) - 2*arrow_scale
xmax = max(A[0], B[0]) + 2*arrow_scale
ymin = min(A[1], B[1]) - 2*arrow_scale
ymax = max(A[1], B[1]) + 2*arrow_scale
arrow_A = mpatches.FancyArrowPatch((A[0], A[1]), (A[0] + N_A[0], A[1] + N_A[1]), mutation_scale=10)
ax.add_patch(arrow_A)
arrow_B = mpatches.FancyArrowPatch((B[0], B[1]), (B[0] + N_B[0], B[1] + N_B[1]), mutation_scale=10)
ax.add_patch(arrow_B)
x = np.linspace(xmin, xmax, 3)
line_A = -N_A[0]/N_A[1]*(x - A[0]) + A[1]
ax.plot(x, line_A)
line_B = -N_B[0]/N_B[1]*(x - B[0]) + B[1]
ax.plot(x, line_B)
ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax))
ax.set(aspect=1)
plt.show()
我想绘制位于 xy 平面上的点。问题是这些点具有给定的 x、y 和 z 坐标。我想要一架飞机,而不是 3d 物体。所以平面将是 xy、xz、yz。但其他的可以从xy平面举例说明。我问的是xy平面案例。
示例点及其对应的法线
point A=(10600, 26.662,-0.420), (Normal) N_A = [0.91, 0.36, 0.21]
point B=(9600, -30.532,-6.208), (Normal) N_B = [0.81, 0.50, -0.30]
point C=(1000, 10.5, -3.72), (Normal) N_C = [-0.83, -0.54, 0.11]
从这些x、y、z坐标中获取x和y值,如何绘制xy平面上的点及其法线和法线的垂线? enter image description here
如果你想投影到xy平面上,你只需要使用点的前两个坐标:
A_xy = [A[0], A[1]]
在xz平面上的投影是
A_xz = [A[0], A[2]]
等等。投影可以绘制为平面上的箭头或点。
如果您在平面中有一个矢量 N = [nx, ny]
,则垂直于该矢量并通过点 N
的线由下式给出:
y(x) = -nx/ny*(x - nx) + ny
您可以将其绘制为变量 x 中的函数。或者,使用此函数计算起点和终点,并在计算出的起点和终点之间绘制一条直线。
示例:
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import numpy as np
fig, ax = plt.subplots()
arrow_scale = 100
A = [10600, 26.662,-0.420]
N_A = np.array([0.91, 0.36, 0.21])*arrow_scale
B = [9600, -30.532,-6.208]
N_B = np.array([0.81, 0.50, -0.30])*arrow_scale
xmin = min(A[0], B[0]) - 2*arrow_scale
xmax = max(A[0], B[0]) + 2*arrow_scale
ymin = min(A[1], B[1]) - 2*arrow_scale
ymax = max(A[1], B[1]) + 2*arrow_scale
arrow_A = mpatches.FancyArrowPatch((A[0], A[1]), (A[0] + N_A[0], A[1] + N_A[1]), mutation_scale=10)
ax.add_patch(arrow_A)
arrow_B = mpatches.FancyArrowPatch((B[0], B[1]), (B[0] + N_B[0], B[1] + N_B[1]), mutation_scale=10)
ax.add_patch(arrow_B)
x = np.linspace(xmin, xmax, 3)
line_A = -N_A[0]/N_A[1]*(x - A[0]) + A[1]
ax.plot(x, line_A)
line_B = -N_B[0]/N_B[1]*(x - B[0]) + B[1]
ax.plot(x, line_B)
ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax))
ax.set(aspect=1)
plt.show()