Подтвердить что ты не робот

Как нарисовать пересекающиеся плоскости?

Я хочу использовать matplotlib для рисования более или менее приведенной ниже фигуры, которая включает в себя две пересекающиеся плоскости с нужным количеством прозрачности, указывающие их относительные ориентации, и круги и векторы в двух плоскостях, проецируемых в 2D.

Я не уверен, что для этого есть существующий пакет, любые подсказки? image credit: M Strassler

4b9b3361

Ответ 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()

result

предостережения:

  • Я запускаю версию, очень близкую к текущему мастеру, поэтому я не что будет работать в более старых версиях

  • Причиной расщепления сюжета является то, что "выше" и "ниже" определяется каким-то каким-то тайным способом (я не уверен, что zorder действительно что-то делает), и на самом деле зависит от порядок, в котором художники втягиваются. Таким образом, поверхности не могут пересекаться (один будет выше другого), поэтому вам нужно начертить участки по обе стороны от пересечения отдельно. (Вы можете видеть это в черной строке, которую я не разделял, выглядит так, как будто она находится поверх верхней голубой плоскости).

  • "Правильный" порядок поверхностей также зависит от угла обзора.

Ответ 2

Matplotlib имеет возможность 3D-проецирования, но пунктирные линии рисуются с постоянной шириной в окончательном представлении 2D-изображения, не выглядя так, как будто они лежат на наклонных плоскостях. Если геометрия проста и круглая "орбит", она может работать, но если вы хотите нарисовать эллипсы, видимые под углом, зритель может захотеть получить более визуальные подсказки во всей 3D-компоновке.

Если бы мне пришлось сделать такую ​​приятную иллюстрацию, как это, но даже приятнее и интереснее, и ее не нужно было автоматизировать, я бы начал с создания графики - по крайней мере, пунктирных линий - для каждой из плоскости как простое плоское двумерное изображение, используя то, что кажется удобным сейчас - векторная программа рисования, такая как Illustrator или Inkscape, или в matplotlib, если есть данные, которые следует соблюдать.

Тогда я бы использовал POV-Ray или Blender для моделирования плоскостей под любыми углами, сферами для круглых вещей (планет?). Созданная 2D-графика станет текстурой, которая будет отображаться на плоскости. POV-Ray использует язык сценариев, позволяющий сохранять, изменять и копировать запись для будущих проектов. Если бы это было действительно одноразово, и я не против делать это вручную, Блендер хорош. Какой бы инструмент я ни использовал, результатом будет изображение, показывающее желаемую проекцию трехмерных геометрических элементов в 2D.

Являются ли круглые вещи тем, что я называю "планетами", которые должны быть плоскими кругами в окончательной работе, как в примерах? Затем я нарисую их с помощью приложения для векторного рисования над визуализированным трехмерным изображением. Но я подозреваю, что вы предпочтете сферы в 3D.

Показанные образцы не имеют освещения или теней. Тени помогли бы уточнить геометрию в 3D, хотя первая из этих двух иллюстраций не так уж плоха. Короткая зеленая линия, показывающая наклонную плоскую планету над красной линией, кажется достаточно ясной, но тень помогла бы. Вторая иллюстрация выглядит немного более запутанной относительно формы, местоположения пересечения различных объектов. Тени помогли бы больше. POV-Ray или Blender с радостью создадут их с небольшим усилием. Более того, взаимные размышления, известные как радиус, помогают видеть 3D-отношения в 2D-изображениях. Этот расширенный эффект легко сделать в эти дни, не требуя опыта в оптике или графике, просто зная, что он существует.

Конечно, этот совет не годится, если он уже не знаком с 3D-графикой и инструментами, такими как POV-Ray.

Для автоматизированного решения лучше всего использовать OpenGL в некоторой быстрой и грязной программе. Однако тени могут занять некоторое время.