Python 对二维形状进行三角剖分以获得STL

Python 对二维形状进行三角剖分以获得STL,python,scipy,shapes,delaunay,numpy-stl,Python,Scipy,Shapes,Delaunay,Numpy Stl,我正在用python生成2D二进制形状。之后,我想把它们转换成3D STL文件进行3D打印。这种方法很有效,但只适用于三角形和正方形等简单形状。对于更复杂的形状,我得到以下形状: 所以我们可以看到,它看起来有点像二值图像,但是有更多的伪影。我使用: 基于scipy的delaunay三角剖分 生成stl文件的numpy stl需要生成顶点+面,这就是三角剖分的原因 numpy保存/加载我的形状 这是我的密码: import numpy as np from scipy.spatial impor

我正在用python生成2D二进制形状。之后,我想把它们转换成3D STL文件进行3D打印。这种方法很有效,但只适用于三角形和正方形等简单形状。对于更复杂的形状,我得到以下形状:

所以我们可以看到,它看起来有点像二值图像,但是有更多的伪影。我使用:

基于scipy的delaunay三角剖分 生成stl文件的numpy 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')

有谁能给我一些提示,告诉我如何去除这些瑕疵,并告诉delaunay三角剖分不要连接不在形状中的顶点吗?

为了使三角剖分正常工作,您必须编辑或预处理二维形状。请参阅并阅读有关单调多边形和非单调多边形的部分。

您必须编辑或预处理二维图形,才能进行三角剖分。请参阅并阅读有关单调多边形和非单调多边形的章节。

Delaunay的一个特点是,它总是从一组采样点生成凸多边形。因此,如果您使用Delaunay,您将需要某种方法来知道哪些三角形在您感兴趣的区域内,哪些在您感兴趣的区域外

为此,您可以研究约束Delaunay三角剖分CDT。某些Delaunay实现允许您根据非自利多边形指定约束,这些多边形可用于指定约束内的三角形和约束外的三角形。我不确定scipy是否支持这一点,但它的实现通常是优秀的,所以如果它支持,我也不会感到惊讶

此外,您可能会发现Delaunay会在多边形中生成大量的瘦三角形。由于您正在进行3D打印,您可能需要找到一些方法来修复这些问题。可以通过在网格中插入人工点Steiner点来实现。这些可以从常规网格中任意获取,或者,如果您有支持它的API,您可以对三角剖分应用某种Delaunay细化


除此之外,我想知道您试图解决的问题是否不是真正构建Delaunay,而是对多边形进行三角剖分。前面答案中引用的维基百科文章应该给你一个开始。

Delaunay的一个特点是它总是从一组采样点生成一个凸多边形。因此,如果您使用Delaunay,您将需要某种方法来知道哪些三角形在您感兴趣的区域内,哪些在您感兴趣的区域外

为此,您可以研究约束Delaunay三角剖分CDT。某些Delaunay实现允许您根据非自利多边形指定约束,这些多边形可用于指定约束内的三角形和约束外的三角形。我不确定scipy是否支持这一点,但它的实现通常是优秀的,所以如果它支持,我也不会感到惊讶

此外,您可能会发现Delaunay会在多边形中生成大量的瘦三角形。由于您正在进行3D打印,您可能需要找到一些方法来修复这些问题。可以通过在网格中插入人工点Steiner点来实现。这些可以从常规网格中任意获取,或者,如果您有支持它的API,您可以对三角剖分应用某种Delaunay细化

除此之外,我想知道您试图解决的问题是否不是真正构建Delaunay,而是对多边形进行三角剖分。在前面的回答中引用的维基百科文章应该给你一个开始