如何用Python/Julia实现绕x=2r旋转圆生成圆环(Torus)
实现圆绕直线x=2r旋转生成圆环(Torus)
需求说明
将**半径为r的圆(圆心在原点,方程为$x2+y2=r^2$)**绕直线$x=2r$(平行于y轴的竖线)旋转,生成3D圆环结构,优先采用高效的向量化计算方案。
Julia 高效实现方案
利用Julia的向量化运算和Plots库的3D绘图功能,直接通过圆环的参数方程生成坐标,避免循环,性能更优:
using Plots, LaTeXStrings gr() # 参数定义 r = 2 # 圆的半径 R = 2r # 旋转轴到圆心的距离(x=2r) # 生成参数网格:θ是原圆上的角度,φ是旋转角度 θ = range(0, 2π, length=100) φ = range(0, 2π, length=100) # 圆环参数方程 x(θ, φ) = R + (r*cos(θ) - R) * cos(φ) y(θ, φ) = r*sin(θ) z(θ, φ) = (r*cos(θ) - R) * sin(φ) # 生成坐标矩阵(向量化计算) X = x.(θ', φ) Y = y.(θ', φ) Z = z.(θ', φ) # 绘制3D圆环 surface(X, Y, Z, label="圆环 (Torus)", color=:viridis, title=L"圆 $x^2+y^2=r^2$ 绕 $x=2r$ 旋转生成的圆环", xlabel="X", ylabel="Y", zlabel="Z") # 可选:绘制原始圆和旋转轴(2D子图) plot!(plot(r*cos.(θ), r*sin.(θ), label=L"原始圆 $x^2+y^2=r^2$", color=:blue, xlabel="X", ylabel="Y"), plot!([R], seriestype=:vline, color=:green, label=L"旋转轴 $x=2r$"), layout=(1,2), size=(1200, 600))
代码说明
- 参数化方程:通过两个角度参数
θ(原圆上点的角度)和φ(旋转角度)推导圆环3D坐标,逻辑清晰且计算高效。 - 向量化运算:利用Julia广播机制(
.运算符)一次性生成所有坐标矩阵,替代逐点循环,大幅提升计算速度。 - 可视化:同时展示3D圆环与原始2D圆+旋转轴,直观验证旋转效果。
Python 高效实现方案
使用NumPy的向量化计算生成坐标,配合Matplotlib绘制3D圆环:
import numpy as np import matplotlib.pyplot as plt # 参数定义 r = 2 # 圆的半径 R = 2 * r # 旋转轴位置x=2r # 生成参数网格 theta = np.linspace(0, 2*np.pi, 100) phi = np.linspace(0, 2*np.pi, 100) theta, phi = np.meshgrid(theta, phi) # 圆环参数方程(向量化计算) X = R + (r * np.cos(theta) - R) * np.cos(phi) Y = r * np.sin(theta) Z = (r * np.cos(theta) - R) * np.sin(phi) # 创建3D绘图 fig = plt.figure(figsize=(12, 6)) # 子图1:3D圆环 ax1 = fig.add_subplot(121, projection='3d') ax1.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none') ax1.set_title('圆绕x=2r旋转生成的圆环') ax1.set_xlabel('X') ax1.set_ylabel('Y') ax1.set_zlabel('Z') # 子图2:原始圆和旋转轴 ax2 = fig.add_subplot(122) # 绘制原始圆 circle_x = r * np.cos(theta[:,0]) circle_y = r * np.sin(theta[:,0]) ax2.plot(circle_x, circle_y, label=f'原始圆 $x^2+y^2={r}^2$', color='blue') # 绘制旋转轴 ax2.axvline(x=R, color='green', label=f'旋转轴 x={R}') ax2.set_title('原始圆与旋转轴') ax2.set_xlabel('X') ax2.set_ylabel('Y') ax2.legend() ax2.axis('equal') plt.tight_layout() plt.show()
代码说明
- 向量化网格:用
np.meshgrid生成参数网格,通过矩阵运算直接计算所有坐标,避免低效循环。 - 参数方程:与Julia版本逻辑一致,确保坐标计算的准确性和一致性。
- 可视化优化:设置
axis('equal')保证原始圆比例正确,3D图使用edgecolor='none'让圆环显示更平滑。
内容的提问来源于stack exchange,提问作者Freya the Goddess
相关产品推荐
相关产品推荐

