2015-04-27 21 views
13

Czy jest jakaś metoda uzyskania triangulacji w 2D, która jest bardziej uporządkowana, jak produkuje Matlab Delaunay? Oto przykład triangulacji 2D Delaunaya firmy Matlab.Tworzenie regularnej siatki Delaunay za pomocą scipy

matlab delaunay

Stosując ten kod:

xPoints = np.arange(0,11,1) 
yPoints = np.arange(0,11,1) 
gridPoints = np.array([[x,y] for y in yPoints for x in xPoints]) 
tri = Delaunay(gridPoints) 
plt.triplot(gridPoints[:,0],gridPoints[:,1],tri.simplices.copy()) 
plt.plot(gridPoints[:,0],gridPoints[:,1],'bo') 
plt.title("Triangulation Visualization") 

uzyskać triangulacji poniżej:

scipy delaunay

zauważyć jak ukośne łuki w Matlab rezultacie wszystkie mają to samo nachylenie; ale te w wyniku scipy są różne. Ponieważ Matlab i Scipy używają wewnętrznie QHull, zakładam, że istnieje jakaś metoda naśladowania wyniku Matlaba.

+2

Oczywiście oba triangulacje są „poprawne”, ponieważ oba rodzaje przekątnej mają taką samą długość. Możesz spojrzeć na parametr 'qhull_options =' na 'Delaunay', który pobiera ciąg opcji, które są przekazywane do' qdelaunay'. Różne możliwe opcje są podsumowane [tutaj] (http://www.qhull.org/html/qh-optq.htm), chociaż nic oczywistego nie wystaje. Niestety, nie można zobaczyć, jak działa funkcja 'delaunay' MATLAB, ponieważ jest ona zamknięta. –

+0

Tak, obie są poprawne, ale ponieważ jest to domena jednorodna, triangulacja matlab pozwala na pewne uproszczenia w matematyce. Dzięki za ten link, nie znalazłem tego podczas wyszukiwania wcześniej. –

+0

Czy to zadziałałoby dla twojego problemu, aby samodzielnie wygenerować triangulację? Powinno to być rozsądne dla jednolitej domeny prostokątnej. –

Odpowiedz

2

można spróbować zamiast triangulacji Delaunay:

import matplotlib.tri as tri 

xlen = 10 
ylen = 16 
xPoints = np.arange(0,xlen+1,1) 
yPoints = np.arange(0,ylen+1,1) 

gridPoints = np.array([[[x,y] for y in yPoints] for x in xPoints]) 
a = [[i+j*(ylen+1),(i+1)+j*(ylen+1),i+(j+1)*(ylen+1)] for i in range(ylen) for j in range(xlen)] 
triang = tri.Triangulation(gridPoints[:,:,0].flatten(), gridPoints[:,:,1].flatten(),a) 

plt.triplot(triang) 
plt.plot(gridPoints[:,:,0],gridPoints[:,:,1],'bo') 
plt.title("Triangulation Visualization") 

enter image description here

Powiązane problemy