获取环空的正确Delaunay三角剖分(使用python)

获取环空的正确Delaunay三角剖分(使用python),python,numpy,scipy,triangulation,delaunay,Python,Numpy,Scipy,Triangulation,Delaunay,我正在尝试使用scipy.spatial.Delaunay()函数对环形空间进行三角剖分,但无法获得所需的结果。这是我的密码: from scipy.spatial import Delaunay NTheta = 26 NR = 8 a0 = 1.0 #define base rectangle (r,theta) = (u,v) u=np.linspace(0, 2*np.pi, NTheta) v=np.linspace(1*a0, 3*a0, NR) u,v=np.meshgrid(u

我正在尝试使用
scipy.spatial.Delaunay()
函数对环形空间进行三角剖分,但无法获得所需的结果。这是我的密码:

from scipy.spatial import Delaunay
NTheta = 26
NR = 8
a0 = 1.0

#define base rectangle (r,theta) = (u,v)
u=np.linspace(0, 2*np.pi, NTheta)
v=np.linspace(1*a0, 3*a0, NR)
u,v=np.meshgrid(u,v)
u=u.flatten()
v=v.flatten()

#evaluate the parameterization at the flattened u and v
x=v*np.cos(u)
y=v*np.sin(u)

#define 2D points, as input data for the Delaunay triangulation of U
points2D=np.vstack([u,v]).T
xy0 = np.vstack([x,y]).T

Tri1 = Delaunay(points2D) #triangulate the rectangle U
Tri2 = Delaunay(xy0) #triangulate the annulus

#plt.scatter(x, y)
plt.triplot(x, y, Tri1.simplices, linewidth=0.5)
plt.show()
plt.triplot(x, y, Tri2.simplices, linewidth=0.5)
plt.show()
我得到以下信息:

环空本身的三角剖分清楚地给出了不需要的三角形。基本矩形的三角剖分似乎给出了正确的结果,直到您通过稍微拉伸环(即移动其节点),意识到环实际上并不是闭合的。

所以,我的问题是,我如何得到正确的三角剖分来解释非平凡拓扑?我可以从环的三角剖分中去掉简单部分吗?例如,基于键的长度,或者以某种方式将基础矩形的两端缝合在一起?有没有一个简单的方法可以做到这一点

答复:
我接受了下面的答案,但它并没有完全解决问题。我仍然不知道如何使用
scipy.Delaunay
(即
qhull
例程)平铺周期曲面。但是,使用下面定义的遮罩,可以创建一个新的三角形简单列表,它可以用于多种用途。但是,不能将此列表与
scipy.Delaunay
类中定义的其他方法一起使用。所以,小心点

qhull
与凸面外壳一起工作。所以它不能直接使用凹面的内部。在图2中,它是用三角形填充内部。如果我们在
xy0
中添加一个(0,0)点,这可能会更加明显

last_pt = xy0.shape[0]
xy1 = np.vstack((xy0,(0,0)))  # add ctr point
Tri3 = Delaunay(xy1)
print(Tri3.points.shape, Tri3.simplices.shape)

plt.triplot(Tri3.points[:,0], Tri3.points[:,1], Tri3.simplices, linewidth=0.5)
plt.show()
删除包含该中心点的简化:

mask = ~(Tri3.simplices==last_pt).any(axis=1)
plt.triplot(Tri3.points[:,0], Tri3.points[:,1], Tri3.simplices[mask,:], linewidth=0.5)
plt.show()
要将两端缝合在一起,从
u
中删除一个值似乎有效:

u = u[:-1]
在FEM模型中,您可以将中心图元保留在适当的位置,但要赋予它们适当的“中性”属性(绝缘或任何有效的属性)


太好了!你能详细解释一下为什么它的内部充满了三角形吗?我想我不能补充一下。关键是
凸面外壳
,在这种情况下,凸面外壳是与最大的
v
对应的点,即外圈。它填满了整个船体。另一件事:设置
u=u[:-1]
对我不起作用?你到底在哪里实现这个?我一开始就这么做,所以
u
不会一直运行到
2*pi
。你一定做了类似的事情来显示第三张图中的差距。我们可以仔细检查,但我认为
qhull
不希望点在网格上,甚至不希望点有序。顺序可能会影响单个三角形,但凸包应该是相同的。