如何用Python在参数化曲线上绘制单位切向量与单位法向量?
实现参数化曲线的单位切向量与凹侧单位法向量绘制
以下是符合需求的Python实现代码,包含完整的向量计算与可视化逻辑:
import numpy as np import matplotlib.pyplot as plt # 设置绘图风格 plt.style.use('seaborn-v0_8') # 1. 生成参数t与曲线坐标 t = np.linspace(-4, 4, 100) x = t y = t**3 - 9*t # 2. 计算一阶导数(切向量原始分量) dx_dt = np.gradient(x, t) dy_dt = np.gradient(y, t) # 3. 计算单位切向量T norm_t = np.hypot(dx_dt, dy_dt) # 避免模长为0的情况(通用容错处理) norm_t[norm_t < 1e-10] = 1e-10 Tx = dx_dt / norm_t Ty = dy_dt / norm_t # 4. 计算二阶导数,用于判断凹侧方向 d2x_dt2 = np.gradient(dx_dt, t) d2y_dt2 = np.gradient(dy_dt, t) # 5. 计算指向凹侧的单位法向量N # 生成两个候选法向量:切向量逆时针/顺时针旋转90度 N_candidate1 = (-Ty, Tx) # 逆时针旋转 N_candidate2 = (Ty, -Tx) # 顺时针旋转 # 通过曲率符号判断凹侧方向 curvature_sign = np.sign(dx_dt * d2y_dt2 - dy_dt * d2x_dt2) Nx = np.where(curvature_sign > 0, N_candidate1[0], N_candidate2[0]) Ny = np.where(curvature_sign > 0, N_candidate1[1], N_candidate2[1]) # 6. 选取曲线上的采样点(每隔10个点取一个) sample_indices = np.arange(0, len(t), 10) x_sample = x[sample_indices] y_sample = y[sample_indices] Tx_sample = Tx[sample_indices] Ty_sample = Ty[sample_indices] Nx_sample = Nx[sample_indices] Ny_sample = Ny[sample_indices] # 7. 绘制曲线与向量 fig, ax = plt.subplots(figsize=(8, 6)) # 绘制参数曲线 ax.plot(x, y, label="参数曲线 $x=t, y=t^3-9t$", linewidth=2, color='darkblue') # 绘制单位切向量(红色) ax.quiver(x_sample, y_sample, Tx_sample, Ty_sample, color='red', scale=15, label='单位切向量 $\mathbf{T}$') # 绘制凹侧单位法向量(绿色) ax.quiver(x_sample, y_sample, Nx_sample, Ny_sample, color='green', scale=15, label='凹侧单位法向量 $\mathbf{N}$') # 图表配置 ax.set_xlabel('x') ax.set_ylabel('y') ax.set_title('参数化曲线的切向量与法向量') ax.legend() ax.axis('equal') # 保持坐标轴比例一致,避免向量变形 plt.show()
关键步骤说明
1. 导数计算
使用np.gradient计算一阶、二阶数值导数,这是numpy中处理离散序列导数的稳健方法,比手动差分更适配非均匀参数序列。
2. 单位切向量生成
切向量的原始分量为(dx_dt, dy_dt),通过除以其欧几里得模长(np.hypot计算)完成单位化,同时添加了模长为0的容错处理。
3. 凹侧法向量判断
参数化曲线的凹侧由曲率符号决定:
- 曲率公式:$k = \frac{dx \cdot d^2y - dy \cdot d2x}{(dx2 + dy2){3/2}}$
- 当$k>0$时,曲线逆时针弯曲,选择切向量逆时针旋转90度的法向量;
- 当$k<0$时,曲线顺时针弯曲,选择切向量顺时针旋转90度的法向量;
通过np.where根据曲率符号自动匹配正确的法向量方向。
4. 向量可视化
使用plt.quiver绘制向量,scale参数控制向量显示长度(单位向量通过scale放大后更清晰),axis('equal')确保坐标轴比例一致,避免向量形状失真。
内容的提问来源于stack exchange,提问作者Andrew




