如何绘制相交平面?

2025-03-05 09:17:00
admin
原创
4
摘要:问题描述:我想使用 matplotlib 来绘制或多或少如下所示的图形,其中包括两个相交的平面,并具有适当的透明度以指示它们的相对方向,以及在二维中投影的两个平面中的圆和矢量。我不确定是否有现有的包可以执行此操作,有什么提示吗?解决方案 1:from mpl_toolkits.mplot3d import a...

问题描述:

我想使用 matplotlib 来绘制或多或少如下所示的图形,其中包括两个相交的平面,并具有适当的透明度以指示它们的相对方向,以及在二维中投影的两个平面中的圆和矢量。

我不确定是否有现有的包可以执行此操作,有什么提示吗?图片来源:M Strassler


解决方案 1:

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


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

dim = 10

X, Y = np.meshgrid([-dim, dim], [-dim, dim])
Z = np.zeros((2, 2))

angle = .5
X2, Y2 = np.meshgrid([-dim, dim], [0, dim])
Z2 = Y2 * angle
X3, Y3 = np.meshgrid([-dim, dim], [-dim, 0])
Z3 = Y3 * angle

r = 7
M = 1000
th = np.linspace(0, 2 * np.pi, M)

x, y, z = r * np.cos(th),  r * np.sin(th), angle * r * np.sin(th)

ax.plot_surface(X2, Y3, Z3, color='blue', alpha=.5, linewidth=0, zorder=-1)

ax.plot(x[y < 0], y[y < 0], z[y < 0], lw=5, linestyle='--', color='green',
        zorder=0)

ax.plot_surface(X, Y, Z, color='red', alpha=.5, linewidth=0, zorder=1)

ax.plot(r * np.sin(th), r * np.cos(th), np.zeros(M), lw=5, linestyle='--',
        color='k', zorder=2)

ax.plot_surface(X2, Y2, Z2, color='blue', alpha=.5, linewidth=0, zorder=3)

ax.plot(x[y > 0], y[y > 0], z[y > 0], lw=5, linestyle='--', color='green',
        zorder=4)

plt.axis('off')
plt.show()

结果

注意事项:

  • 我正在运行一个与当前主版本非常接近的版本,所以我不确定旧版本中哪些功能可以正常工作

  • 分割绘图的原因在于“上方”和“下方”是以某种神秘的方式确定的(我并不完全确定它zorder是否真的有作用),并且实际上取决于艺术家绘制的顺序。因此,表面不能相交(一个表面在任何地方都在另一个表面之上),所以您需要分别绘制交叉点两侧的部分。(您可以在黑线中看到这一点,我没有分割它,它看起来像是在蓝色平面的“上方”)。

  • 表面的“正确”排序似乎也取决于视角。

解决方案 2:

Matplotlib 确实具有 3D 投影功能,但虚线在最终的 2D 图像视图中以恒定宽度绘制,看起来不像平放在倾斜的平面上。如果几何形状简单,并且“轨道”为圆形,则可能会有效,但如果您想绘制以一定角度看到的椭圆,则查看者可能需要有关整个 3D 排列的更多视觉线索。

如果我必须制作一幅像这样的漂亮而精美的插图,甚至更漂亮和更精美,并且它不必自动化,我会首先为每个平面创建图形 - 至少是虚线圆 - 作为一个简单的平面 2D 图像,使用任何目前看起来方便的东西 - 像 Illustrator 或 Inkscape 这样的矢量绘图程序,或者在 matplotlib 中,如果有要跟踪的数据。

然后,我会使用 POV-Ray 或 Blender 以任意角度对平面进行建模,对圆形物体(行星?)进行球体建模。已经生成的 2D 图形将成为要映射到平面的纹理。POV-Ray 使用脚本语言,允许保存、修改和复制记录以用于未来的项目。如果真的是一次性的,而且我不介意手动完成所有操作,Blender 就很不错。无论我使用哪种工具,结果都是一张显示 3D 几何元素在 2D 中的所需投影的图像。

这些圆形物体,也就是我所说的“行星”,在最终作品中应该是扁平的圆形,就像例子中的那样吗?然后我会用矢量绘图应用程序在渲染的 3D 图像上绘制它们。但我想你更喜欢 3D 中的球体。

所展示的样本没有光照或阴影。阴影有助于在 3D 中清晰显示几何图形,尽管这两个图中的第一个还不错。红线上显示倾斜平面行星的短绿线似乎足够清晰,但阴影会有所帮助。第二个插图在形状、位置和各个实体的交叉点方面看起来确实有点令人困惑。在这里,阴影会更有帮助。POV-Ray 或 Blender 可以轻松创建这些。此外,相互反射(称为辐射度)有助于在 2D 图像中看到 3D 关系。这种高级效果现在很容易实现,不需要光学或图形方面的专业知识,只要知道它存在即可。

当然,除非人们已经熟悉 3D 图形和 POV-Ray 等工具,否则这个建议就没什么用。

对于自动化解决方案,最好在一些快速而粗糙的程序中使用 OpenGL。不过阴影可能需要一些工作。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用