2015-04-27 23 views
13

Gibt es eine Methode, um eine Triangulation in 2D zu erhalten, die mehr geordnet ist, wie Matlab Delaunay erzeugt? Hier ist ein Beispiel für die 2D-Delaunay-Triangulation von Matlab.Regelmäßiges Delaunay-Gitter mit scipy erstellen

matlab delaunay

Mit diesem Code:

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") 

Ich erhalte die Triangulation unter:

scipy delaunay

Beachten Sie, wie diagonal Bögen in der Matlab führen alle die gleiche Neigung haben; aber diejenigen in der scipy Ergebnis sind unterschiedlich. Da Matlab und Scipy beide intern QHull verwenden, nehme ich an, dass es eine Methode gibt, das Matlab-Ergebnis nachzuahmen.

+2

Offensichtlich beide Triangulation "richtig" sind, da beide Arten von Diagonalen die gleiche Länge haben. Vielleicht möchten Sie den Parameter 'qhull_options =' für 'Delaunay' betrachten, der eine Reihe von Optionen enthält, die an' qdelaunay' übergeben werden. Die verschiedenen möglichen Optionen sind [hier] (http://www.qhull.org/html/qh-optq.htm) zusammengefasst, obwohl nichts offensichtlich hervorsteht. Leider ist es nicht möglich zu sehen, wie MATLABs 'Delaunay'-Funktion funktioniert, da sie Closed-Source ist. –

+0

Ja, beide sind korrekt, aber da dies eine einheitliche Domäne ist, erlaubt die Matlab-Triangulation einige Vereinfachungen in der Mathematik. Danke für diesen Link, den habe ich bei der Suche nicht gefunden. –

+0

Würde es für Ihr Problem funktionieren, die Triangulation explizit zu generieren? Dies sollte für eine einheitliche rechteckige Domäne sinnvoll sein. –

Antwort

2

Sie könnten versuchen, Triangulation statt 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