摆转曲面是一种通过将轮廓曲线绕轴旋转并同时沿该轴移动而生成的曲面。这种曲面在几何建模和计算机图形学中具有重要应用,特别是在创建螺旋状物体和工业设计领域。
数学定义与原理
给定一条参数化的轮廓曲线 C(u)=(0,y(u),z(u))C(u) = (0, y(u), z(u))C(u)=(0,y(u),z(u)),其中 uuu 是曲线参数,通常取值范围为 [0,1][0, 1][0,1]。摆转曲面的生成过程包含两个同时进行的变换:
- 绕 ZZZ 轴的旋转变换
- 沿 ZZZ 轴的平移变换
最终的曲面方程可表示为:
S(u,v)=(y(u)cos(v),y(u)sin(v),z(u)+k⋅v)S(u,v) = (y(u)\cos(v), y(u)\sin(v), z(u) + k \cdot v)S(u,v)=(y(u)cos(v),y(u)sin(v),z(u)+k⋅v)
其中:
- uuu 是轮廓曲线的参数
- vvv 是旋转角度参数,通常取值范围为 [0,2π][0, 2\pi][0,2π] 或更广
- kkk 是螺距系数,控制每单位旋转角度沿 ZZZ 轴的移动量
这个方程可以理解为在圆柱坐标系中的表达:半径分量由 y(u)y(u)y(u) 控制,高度分量由 z(u)+k⋅vz(u) + k \cdot vz(u)+k⋅v 控制。
基础实现:圆形轮廓的摆转曲面
首先实现一个基础版本,使用圆形作为轮廓曲线:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def generate_swung_surface_basic(y_func, z_func, k=1.0, u_samples=50, v_samples=100):
"""
生成基础摆转曲面
参数:
y_func: 轮廓曲线的y分量函数
z_func: 轮廓曲线的z分量函数
k: 螺距系数
u_samples: u参数的采样点数
v_samples: v参数的采样点数
"""
u = np.linspace(0, 1, u_samples)
v = np.linspace(0, 4*np.pi, v_samples)
U, V = np.meshgrid(u, v)
# 计算曲面坐标
Y = y_func(U)
Z = z_func(U)
X = Y * np.cos(V)
Y = Y * np.sin(V)
Z = Z + k * V
return X, Y, Z
# 定义圆形轮廓函数
def circular_profile(u, radius=1.0):
"""圆形轮廓:y分量是常数,z分量线性变化"""
return radius * np.ones_like(u), u
# 生成曲面
u_samples = 30
v_samples = 100
y_func = lambda u: circular_profile(u, 1.0)[0]
z_func = lambda u: circular_profile(u, 1.0)[1]
X, Y, Z = generate_swung_surface_basic(y_func, z_func, k=0.2, u_samples=u_samples, v_samples=v_samples)
# 可视化
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, alpha=0.8, cmap='viridis')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('基本摆转曲面 - 圆形轮廓')
plt.show()
高级实现:任意轮廓曲线的摆转曲面
下面实现一个更通用的版本,支持任意参数化轮廓曲线:
import numpy as np
import matplotlib.pyplot as plt