法向量 - 平面上的法向量和曲面上的法向量
flyfish
-
平面上的法向量 :
-
定义了一个平面 z = 0 z = 0 z=0。
-
法向量是 (0, 0, 1),表示垂直于平面的向上方向。
-
使用
quiver
函数在平面上绘制法向量。
-
-
曲面上的法向量 :
-
定义了一个曲面 z = x 2 − y 2 z = x^2 - y^2 z=x2−y2。
-
使用
np.gradient
函数计算曲面的梯度,然后归一化得到单位法向量。
-
平面上的法向量
py
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定义平面
x = np.linspace(-1, 1, 10)
y = np.linspace(-1, 1, 10)
X, Y = np.meshgrid(x, y)
Z = np.zeros_like(X)
# 定义法向量
U = np.zeros_like(X)
V = np.zeros_like(Y)
W = np.ones_like(Z) # 对于平面 z = 0,法向量为 (0, 0, 1)
# 绘制平面和法向量
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, alpha=0.5, rstride=1, cstride=1, color='c', edgecolor='none')
ax.quiver(X, Y, Z, U, V, W, color='r', length=0.1)
# 设置图形属性
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('平面上的法向量')
plt.show()
曲面上的法向量
py
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定义曲面
x = np.linspace(-1, 1, 10)
y = np.linspace(-1, 1, 10)
X, Y = np.meshgrid(x, y)
Z = X**2 - Y**2 # 曲面 z = x^2 - y^2
# 计算梯度
dz_dx, dz_dy = np.gradient(Z)
U, V = -dz_dx, -dz_dy # 负梯度方向作为法向量方向
W = np.ones_like(Z)
# 归一化法向量
norm = np.sqrt(U**2 + V**2 + W**2)
U /= norm
V /= norm
W /= norm
# 绘制曲面和法向量
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, alpha=0.5, rstride=1, cstride=1, color='c', edgecolor='none')
ax.quiver(X, Y, Z, U, V, W, color='r', length=0.5)
# 设置图形属性
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('曲面上的法向量')
plt.show()