2015-04-27 12 views
13

Esiste un metodo per ottenere una triangolazione in 2D più ordinata come quella prodotta da Matlab Delaunay? Ecco un esempio della triangolazione 2D di Delaunay di Matlab.Creazione di una griglia Delaunay regolare con scipy

matlab delaunay

Utilizzando questo codice:

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

ottengo la triangolazione di seguito:

scipy delaunay

noti come archi diagonali nel Matlab risultare tutti hanno la stessa pendenza; ma quelli nel risultato scipy sono variabili. Dal momento che Matlab e Scipy usano entrambi QHull internamente, presumo che ci sia un metodo per simulare il risultato di Matlab.

+2

Ovviamente entrambe le triangolazioni sono "corrette", dal momento che entrambi i tipi di diagonale hanno la stessa lunghezza. Potresti voler vedere il parametro 'qhull_options =' in 'Delaunay', che accetta una stringa di opzioni passate a' qdelaunay'. Le varie opzioni possibili sono riepilogate [qui] (http://www.qhull.org/html/qh-optq.htm), sebbene non risulti evidente nulla di ovvio. Sfortunatamente non è possibile vedere come funziona la funzione 'delaunay' di MATLAB dato che è closed-source. –

+0

Sì, entrambi sono corretti, ma poiché si tratta di un dominio uniforme, la triangolazione di matlab consente alcune semplificazioni matematiche da adottare. Grazie per questo link, non l'avevo trovato durante la ricerca precedente. –

+0

Funzionerebbe, per il tuo problema, generare autonomamente la triangolazione? Questo dovrebbe essere ragionevole per un dominio rettangolare uniforme. –

risposta

2

Si potrebbe provare Triangolazione invece di 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

Problemi correlati