Я хочу построить призмы в наклонной параллельной проекции (также известной как кавалерийская проекция). Угол между осями y и z должен составлять 90 °, а между осями x и y - 135 °. Кроме того, длину оси x следует уменьшить в 0,5 * sqrt (2). В конечном итоге это должно выглядеть так (невидимые края пунктирны (или более светлого цвета)):
введите описание изображения здесь
Пока мне удалось построить призмы в орфографической c или перспективной проекции (показано в приведенном минимальном рабочем примере в конце поста). Но насколько я читал в документации, есть только указанные типы проекций: орфографи c и перспектива. Я тоже не нашел возможности показать топоры. Кроме того, подумал о преобразовании 3D-координат в 2D-координаты и использовании 2-мерного графика, но тогда было бы невозможно отобразить невидимые края по-другому (более светлым цветом или даже лучше с точками).
Какой будет наилучшая возможность получить описанный результат?
минимальный рабочий пример
import numpy as np
class Prism():
def __init__(self):
# here happens some magic to create the vertices as I wish (half randomly within given options)
# but to make the code example much shorter, I just create a fixed cuboid
self.points = np.array([[0,0,0], [2,0,0], [2,4,0], [0,4,0], [0,0,1], [2,0,1], [2,4,1], [0,4,1]], dtype="f")
self.sides = np.array([[self.points[0], self.points[1]], [self.points[1], self.points[2]],
[self.points[2], self.points[3]], [self.points[3], self.points[0]],
[self.points[4], self.points[5]], [self.points[5], self.points[6]],
[self.points[6], self.points[7]], [self.points[7], self.points[4]],
[self.points[0], self.points[4]], [self.points[1], self.points[5]],
[self.points[2], self.points[6]], [self.points[3], self.points[7]]], dtype="f")
self.test = np.array([[self.points[0], self.points[1], self.points[2], self.points[3]],
[self.points[4], self.points[5], self.points[6], self.points[7]],
[self.points[0], self.points[1], self.points[5], self.points[4]],
[self.points[1], self.points[2], self.points[6], self.points[5]],
[self.points[2], self.points[3], self.points[7], self.points[6]],
[self.points[3], self.points[0], self.points[4], self.points[7]]], dtype="f")
def plot(self):
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d', proj_type='ortho')
verts = self.points
ax.scatter3D(verts[:,0], verts[:,1], verts[:,2])
ax.add_collection3d(Poly3DCollection(self.test, facecolors='cyan', linewidths=1, edgecolors='r', alpha=0.8))
plt.show()
testprism = Prism()
testprism.plot()