我正在生成python中的2D二进制形状。在那之后,我希望他们被转换为一个3D STL文件进行3D打印。这种作品,但只有“简单”的形状,如三角形和广场。对于更复杂的形状,我得到以下形状:
因此,我们可以看到,它看起来有点像二进制图像,但与更多的“工件”。我用:
这是我的代码:
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三角剖分不要将不处于形状的顶点连接起来?
发布于 2020-04-30 04:21:34
Delaunay的一个特点是它总是从一组样本点产生一个凸多边形。因此,如果您使用Delaunay,您将需要某种方式来了解哪些三角形在您感兴趣的区域内,哪些是外部的。
为了达到这个目的,你可能会考虑的一件事是受约束的Delaunay三角剖分(CDT)。有些Delaunay实现允许您根据非自插入多边形来指定约束,这些多边形可用于指定“内部三角形”和“外部三角形”。我不确定not是否支持这一点,但是它的实现一般都很好,所以如果它支持的话,我不会感到惊讶。
另外,你可能会发现德拉奈在你的多边形中产生了很多“瘦”三角形。因为你正在做3D打印,你可能想找到一些方法来修复这些。你可以通过在网格中插入人工点(Steiner点)来做到这一点。这些可以从常规网格中任意获取,或者,如果您有一个支持它的API,您可以将某种Delaunay细化应用到您的三角剖分中。
除此之外,我想知道你想要解决的问题是不是真的不是构造一个Delaunay,而是三角剖分一个多边形。在前面的答案中引用的维基百科的文章应该给你一个开始。
发布于 2020-04-28 07:24:36
您将不得不编辑或预处理的2D形状,以便您的三角剖分工作。请参阅维基百科关于多边形三角剖分的网页,并阅读关于单调和非单调多边形的章节。
https://stackoverflow.com/questions/61480649
复制相似问题