如何画交叉飞机?

我想用matplotlib来绘制或多或less的下图所示的graphics,其中包括两个相交的平面,其中包含适量的透明度,指示它们的相对方位,以及在2D平面中投影的圆和vector。

我不确定是否有现成的软件包来做这个提示? 图片来源:M Strassler

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实际上做了什么),并且真正依赖于艺术家的顺序。因此曲面不能相交(每一个曲面都会在另一个的上面),所以你需要分别在曲线的两边绘制曲线。 (你可以看到这个在我没有分裂的黑色线上,看起来像在上面的蓝色飞机的顶部)。

  • 表面的“正确”sorting似乎也取决于视angular。

Matplotlib确实具有三维投影function,但在最终的二维图像视图中,虚线以恒定的宽度绘制,而不是看起来像是平放在倾斜的平面上。 如果几何graphics简单,并且“轨道”圆形,它可能会起作用,但是如果您想绘制以一个angular度看到的椭圆,观察者可能需要在整个3D布局上有更多的视觉线索。

如果我不得不做一个像这样漂亮的幻想插图,但更好,更漂亮,而且不需要自动化,我会开始创build每个飞机的graphics – 至less是虚线圆圈一个简单的平面二维图像使用任何似乎方便的时刻 – 一个vector绘图程序像Illustrator或Inkscape,或在matplotlib如果有数据要遵循。

那么,我会使用POV-Ray或Blender来对任何angular度的飞机进行build模,这些飞机是为了圆形的东西(行星?)而devise的。 已经生成的2Dgraphics将成为映射到平面的纹理。 POV-Ray使用脚本语言,允许logging被保存,修改和复制以供未来的项目使用。 如果真的是一次性的,我不介意一个人做,Blender很好。 无论使用什么工具,结果都是一个图像,显示3D几何元素在2D中的所需投影。

圆形的东西,我所谓的“行星”在最后的工作中应该是平坦的圆圈,就像例子中的那样? 然后,我会在渲染的3D图像上绘制一个vector绘图应用程序。 但我怀疑你更喜欢3D的领域。

显示的样本没有光照或阴影。 阴影将有助于澄清三维几何,虽然这两个插图中的第一个不是太糟糕。 显示红线斜坡行星的短绿线似乎足够清晰,但阴影会有所帮助。 第二个例子在形状,位置和各个实体的交叉点方面看起来有点混乱。 在这里,阴影会帮助更多。 POV射线或搅拌机将愉快地创build这些很less的努力。 甚至更多的是,被称为光能传递的相互reflection有助于在2D图像中看到3D关系。 这种先进的效果很容易做到这一点,不需要光学或graphics方面的专业知识,只要知道它的存在。

当然,这个build议是不好的,除非已经熟悉3Dgraphics和工具如POV-Ray。

对于一个自动化的解决scheme,在一些快速和脏的程序中使用OpenGL可能是最好的。 虽然阴影可能需要一些工作。