import numpy as np
from stl import mesh
import matplotlib.pyplot as plt

# читаем файл, получаем массив координат вершин каждой грани
m = mesh.Mesh.from_file("easy.stl").vectors


def plot_vec(ax, point, vec, c="k", mag=1):
    """
    функция для отрисовки одного вектора
    :param ax: пространство для отрисовки
    :param point: точка начала вектора
    :param vec: сам вектор
    :param c: цвет
    :param mag: множитель
    """
    point2 = point + vec * mag  # точка конца вектора
    ax.plot([point[0], point2[0]],
            [point[1], point2[1]],
            [point[2], point2[2]], c=c)


fig = plt.figure()  # создаем окошко рисования
ax = fig.add_subplot(111, projection='3d')  # создаем пространство в окошке
ax.plot(m[:, :, 0], m[:, :, 1], m[:, :, 2])  # рисуем кристаллик одним цветом

for i in range(m.shape[0]):  # цикл по граням
    face = m[i]  # грань с номером i
    e1 = face[1] - face[0]  # вектор одной стороны грани
    e2 = face[2] - face[0]  # вектор второй стороны грани
    e3 = np.cross(e1, e2)  # векторное произведение -- вектор нормали
    cent = np.mean(face, axis=0)  # вектор центра грани
    plot_vec(ax, cent, e3, mag=0.1)  # рисуем вектор
    s = 0.5 * np.linalg.norm(e3)  # площадь грани
plt.show()
