Питон: триангуляция Делоне для цилиндра (или любой периодической поверхности) - PullRequest
0 голосов
/ 18 февраля 2019

Год назад я спросил о правильной триангуляции периодической фигуры на плоскости: кольцевое пространство ( Получение правильной триангуляции Делоне для кольцевого пространства (с использованием питона) ).

Я сейчасхочу расширить это до триангуляции цилиндра (или вообще любой периодической поверхности).Я пробую прямое расширение двумерного кода:

from scipy.spatial import Delaunay
NZ = 14
NTheta = 14

R = 1 #radius of cylinder 
L = 3 #length of cylinder 

#define base rectangle (u,v)
u=np.linspace(0, 2*np.pi, NTheta) #periodic direction
v=np.linspace(0, L, NZ)
# u=u[:-1] #leave out one point
u,v=np.meshgrid(u,v)
u=u.flatten()
v=v.flatten()

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

#define 2D points, as input data for the Delaunay triangulation of U
points2D=np.vstack([u,v]).T
tri = Delaunay(points2D, incremental=True)#triangulate the rectangle U
triSimplices = tri.simplices

xyz0 = np.vstack([x,y,z]).T

Я создаю цилиндр с помощью параметризации и получаю триангуляцию через scipy.spatial.Delaunay() базовой области - прямоугольника.Очевидно, что эта триангуляция не знает о периодичности.Я ясно вижу это, перемещая последний ряд и рисуя: enter image description here

Чтобы исправить это, я пробую прямое расширение 2D-решения - я добавляю дополнительную точку в3D, повторно триангулируйте и удаляйте ненужные симплексы.

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

## we add a central (0,0,L/2) point to xy0 to fill it up with triangles
last_pt = xyz0.shape[0]
xy1 = np.vstack((xyz0,(0,0,L/2)))  # add ctr point
Tri3 = Delaunay(xyz1)
print(Tri3.points.shape, Tri3.simplices.shape)
print(Tri1.points.shape, Tri1.simplices.shape)
print(Tri2.points.shape, Tri2.simplices.shape)

## remove the simplices that contain the central point
mask = ~(Tri3.simplices==last_pt).any(axis=1)
triSimplices = Tri3.simplices[mask,:]

Однако расширение 2D-кода на 3D, похоже, представляет собой большую проблему - триангуляции в 3D дают тетраэдры, а не треугольники!Более того, он кажется более чувствительным к выбору центральной точки.Короче я застрял.

Итак, как правильно триангулировать такую ​​периодическую поверхность?

...