Постройте призму в наклонно-параллельной проекции (кавалерский проект) с помощью matplotlib (python) - PullRequest
0 голосов
/ 05 августа 2020

Я хочу построить призмы в наклонной параллельной проекции (также известной как кавалерийская проекция). Угол между осями 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...