You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python绘制Torus(环面)样式不符,如何调整至目标效果?

调整环面绘制代码以匹配目标样式

问题描述

我是Python新手,尝试绘制Torus(环面),希望达到扁平的环面样式,但当前代码绘制出的环面过高,与目标样式不符。以下是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Parameters for the torus
R = 2  # Major radius
r = 1  # Minor radius

# Create a meshgrid for u (angle around the main circle) and v (angle around the tube)
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, 2 * np.pi, 50)
u, v = np.meshgrid(u, v)

# Parametric equations for the torus
x = (R + r * np.cos(v)) * np.cos(u)
y = (R + r * np.cos(v)) * np.sin(u)
z = r * np.sin(v)

# Plotting
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')

# Torus surface
ax.plot_surface(x, y, z, rstride=1, cstride=1, color='lightblue', edgecolor='gray', alpha=0.6)

# Add lines of latitude (constant v, varying u)
for j in np.linspace(0, 2*np.pi, 12):  # meridians
    x_line = (R + r * np.cos(j)) * np.cos(u[0])
    y_line = (R + r * np.cos(j)) * np.sin(u[0])
    z_line = r * np.sin(j) * np.ones_like(u[0])
    ax.plot(x_line, y_line, z_line, color='darkblue', linewidth=1)

# Add lines of longitude (constant u, varying v)
for i in np.linspace(0, 2*np.pi, 12):  # parallels
    x_line = (R + r * np.cos(v[:, 0])) * np.cos(i)
    y_line = (R + r * np.cos(v[:, 0])) * np.sin(i)
    z_line = r * np.sin(v[:, 0])
    ax.plot(x_line, y_line, z_line, color='darkred', linewidth=1)

# Set aspect and remove axes
ax.set_box_aspect([1, 1, 1])
ax.axis('off')
plt.title("Torus with Parallels and Meridians")
plt.show()

解决方案

核心修改点

  • 调整环面参数比例:当前r=1(管半径)相对R=2(主半径)过大,导致Z方向高度突出。将r减小为0.5,让管身更细,环面自然变得扁平。
  • 优化3D视图角度:默认视图角度可能导致视觉上的比例偏差,添加ax.view_init()调整仰角和方位角,让环面的扁平效果更直观。

修改后的完整代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 调整环面参数:减小管半径r,让环面更扁平
R = 2  # 主半径
r = 0.5  # 管半径,从1改为0.5

# 创建网格
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, 2 * np.pi, 50)
u, v = np.meshgrid(u, v)

# 参数方程保持不变
x = (R + r * np.cos(v)) * np.cos(u)
y = (R + r * np.cos(v)) * np.sin(u)
z = r * np.sin(v)

# 绘图设置
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')

# 绘制环面
ax.plot_surface(x, y, z, rstride=1, cstride=1, color='lightblue', edgecolor='gray', alpha=0.6)

# 添加纬线(恒定v,变化u)
for j in np.linspace(0, 2*np.pi, 12):
    x_line = (R + r * np.cos(j)) * np.cos(u[0])
    y_line = (R + r * np.cos(j)) * np.sin(u[0])
    z_line = r * np.sin(j) * np.ones_like(u[0])
    ax.plot(x_line, y_line, z_line, color='darkblue', linewidth=1)

# 添加经线(恒定u,变化v)
for i in np.linspace(0, 2*np.pi, 12):
    x_line = (R + r * np.cos(v[:, 0])) * np.cos(i)
    y_line = (R + r * np.cos(v[:, 0])) * np.sin(i)
    z_line = r * np.sin(v[:, 0])
    ax.plot(x_line, y_line, z_line, color='darkred', linewidth=1)

# 设置轴比例并调整视图角度,优化视觉效果
ax.set_box_aspect([1, 1, 1])
ax.view_init(elev=25, azim=40)  # 调整仰角和方位角,让环面看起来更扁平
ax.axis('off')
plt.title("Torus with Parallels and Meridians")
plt.show()

效果说明

  1. 参数调整直接改变了环面的物理比例,Z方向的高度从原来的±1变为±0.5,完美匹配扁平的目标样式。
  2. 视图角度的调整避免了3D绘图中常见的视觉拉伸问题,让环面的比例呈现更准确。

内容的提问来源于stack exchange,提问作者GeMa 8906

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:28:11