Триангуляция 2-й формы, чтобы получить STL - PullRequest
1 голос
/ 28 апреля 2020

Я генерирую 2D бинарные фигуры в python. После этого я хочу, чтобы они были преобразованы в файл 3D STL для 3D-печати. Этот вид работ, но только с «простыми» формами, такими как треугольники и квадраты. Для более сложных фигур я получаю следующую форму: Shape ( I want exactly this in 3D model / STL)

STL model my code generates

Итак, как мы можем видеть, это выглядит как двоичное изображение, но с еще некоторыми "артефактами". Я использую:

  • триангуляция Делоне (от scipy)
  • numpy -stl для генерации файла stl (для генерации нужны вершины + грани, что является причиной триангуляции )
  • numpy для сохранения / загрузки моих фигур

Вот мой код:

import numpy as np
from scipy.spatial import Delaunay
from stl import mesh

from numpy import loadtxt

def load_shape(id):
    return loadtxt("../shapes/shape_{}.shape".format(id))

def extract_vertices(shape):
    arr = []
    for ix, x in enumerate(shape):
        for iy, y in enumerate(x):
            if y == 0:
                arr.append([ix, iy])
    return np.array(arr)

def vertices_2d_to_3d(vertices, z=10):
    x, y = vertices.shape
    new = np.zeros((x*2, y + 1))
    for i, v in enumerate(vertices):
        new[i] = [v[0], v[1], 0]
        new[x+i] = [v[0], v[1], z]
    return new

shape = load_shape(4)
vertices = extract_vertices(shape)
vertices = vertices_2d_to_3d(vertices, 10)

tri = Delaunay(vertices)
faces = tri.convex_hull

ms = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(faces):
    for j in range(3):
        ms.vectors[i][j] = vertices[f[j],:]

ms.save('shape.stl')

Может кто-нибудь дать мне несколько советов о том, как избавиться из этих "артефактов" и сказать триангуляции Делоне не соединять вершины, которые не в форме?

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Одной из характеристик c Делоне является то, что он всегда будет создавать выпуклый многоугольник из набора точек выборки. Поэтому, если вы используете Делоне, вам понадобится какой-то способ узнать, какие треугольники находятся внутри вашей области интересов, а какие - снаружи.

С этой целью вы можете рассмотреть одну вещь - ограниченную триангуляцию Делоне (CDT). ). Некоторые реализации Делоне позволяют указывать ограничения в терминах не-самопересекающихся многоугольников, которые можно использовать для указания «треугольников внутри» и «треугольников снаружи» ограничений. Я не уверен, поддерживает ли scipy это, но его реализация в целом превосходна, поэтому я не удивлюсь, если это так.

Кроме того, вы можете обнаружить, что Delaunay производит много "тощих" треугольников. в ваших полигонах. Поскольку вы делаете 3D-печать, вы можете найти способ исправить это. Вы можете сделать это, вставив искусственные точки (точки Штейнера) в me sh. Они могут быть просто произвольно взяты из обычной сетки или, если у вас есть API, который поддерживает его, вы можете применить какой-то уточнение Делоне к вашей триангуляции. решить не на самом деле построение Делоне, а скорее триангуляцию многоугольника. Статья в Википедии, процитированная в предыдущем ответе, должна дать вам представление об этом.

1 голос
/ 28 апреля 2020

Вы должны будете отредактировать или предварительно обработать 2D-фигуру, чтобы ваша триангуляция работала. См. страницу Википедии о триангуляции полигонов и прочитайте разделы о монотонных и немонотонных полигонах.

...