Я пытаюсь триангулировать кольцо с помощью функции 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
. Так что будь осторожен!