三角二维形状以获取STL

问题描述 投票:0回答:2

我正在用python生成2D二进制形状。之后,我希望将它们转换为3D STL文件以进行3D打印。这种作品,但仅具有“简单”形状,例如三角形和正方形。对于更复杂的形状,我得到以下形状:Shape ( I want exactly this in 3D model / STL)

STL model my code generates

因此,我们可以看到它有点像二进制图像,但带有更多“伪像”。我使用:

  • delaunay三角剖分(来自scipy)
  • 用于生成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三角剖分法不要连接非形状的顶点吗?

python scipy shapes delaunay numpy-stl
2个回答
1
投票

您将必须编辑或预处理2D形状,以便三角剖分起作用。请参见the Wikipedia page about polygon triangulation,并阅读有关单调和非单调多边形的部分。


0
投票

Delaunay的一个特征是,它将始终根据一组采样点生成凸多边形。因此,如果使用Delaunay,则需要某种方式来知道哪些三角形在您感兴趣的区域内,哪些三角形在您的关注区域外。

为此,您可能要研究的一件事是约束Delaunay三角剖分(CDT)。一些Delaunay实现允许您根据非自相交多边形来指定约束,这些多边形可用于指定约束的“内部三角形”和“外部三角形”。我不确定scipy是否支持此功能,但是它的实现通常是出色的,因此如果它支持,我也不会感到惊讶。

[此外,您可能会发现Delaunay在您的多边形中产生了许多“瘦”三角形。由于您正在执行3D打印,因此您可能希望找到某种方法来修复这些问题。您可以通过将人工点(Steiner点)插入到网格中来实现。这些可以只是从常规网格中任意获取,或者,如果您有支持它的API,则可以对三角剖分应用某种Delaunay优化。

[除此之外,我想知道您要解决的问题是否不是在构造Delaunay,而是对多边形进行三角剖分。较早答案中引用的维基百科文章应为您提供一个起点。

© www.soinside.com 2019 - 2024. All rights reserved.