获得适当的Delaunay三角测量环(使用python)

时间:2018-01-21 22:58:22

标签: 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,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()

我得到以下内容: Triangulation of base rectangle Triangulation of base annulus

环空的三角剖分显然会产生不需要的三角形。基本矩形的三角测量似乎给出了正确的结果,直到您通过拉伸环(即,移动其节点)一点来意识到环实际上并非闭合enter image description here

所以,我的问题是,如何获得适当的三角测量来解释非平凡拓扑?我可以从环的三角剖分中移除单纯形 - 例如,基于粘合的长度 - 或者以某种方式将基础矩形的两端缝合在一起?有一个简单的方法吗?

答案:

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

1 个答案:

答案 0 :(得分:2)

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模型中,您可以将中心元素留在原位,但要给它们适当的“中性”元素。属性(绝缘或任何工作)。

enter image description here enter image description here