2013-12-10 15 views
6

Sto cercando un modo per interpolare i valori da alcuni dati sparsi 2D. Ho un punto 3d che rappresenta un terreno dal quale voglio interpolare punti intermedi. Per le coordinate di input (X, Y) ho bisogno del valore Z (altezza).Interpolazione dei valori in 2d dai dati dispersi

This article on wikipedia può anche aiutare a capire i miei desideri. C'è una biblioteca in MATLAB chiamato triscateredinterp che penso che faccia quello che voglio.

Qual è un modo leggero per eseguire questa interpolazione in C++?

+0

l'altitudine dei dati su un ingresso 2D? si trova su una griglia regolare o dispersa? – Michael

+0

Ho punti 3D sparsi. I miei dati sono altitudine. – mitjap

+0

e vuoi dare un valore ** 2D ** e interpolare l'altitudine? – Michael

risposta

1

Non penso che sia necessaria l'interpolazione 3D (triscateredinterp). Hai dati basati su input 2D; la terza dimensione è il tuo risultato. Se ho capito bene, vuoi fornire un punto in 2D (qualcosa tra i punti originali e interpolare il valore

Peso leggero "vicino più vicino", quindi interpolazione bi-lineare, quindi bi-cubico (e altri). il primo è semplice, gli altri richiedono una quantità crescente di matematica

Bi-lineare:. per ogni punto da interpolare, trovare la più vicina 3 punti al vostro X e Y:

lat long Altitude 
X1 Y1 A1 
X2 Y2 A2 
X3 Y3 A3 

fare queste matrici :

X1 Y1 1      A1 
X = X2 Y2 1     Y = A2 
    X3 Y3 1      A3 

B sono i coefficienti di interpolazione ti calcolare per questi tre punti più vicini (e possono essere riutilizzati per tutti i punti dell'area)

B1 
B = B2 
    B3 

L'equazione matriciale è: X*B = Y

Si potrebbe usa brut force: Moltiplica entrambi i lati per XT: XT*X*B = XT*Y
Prendi l'inverso di XT * X: B = (XT*X)^-1 *XT*Y.

Sì inversione matrice 3x3. Legando questo a una domanda in C++, potresti usare Boost per le tue operazioni con le matrici.

Ecco un altro simile C domanda ++: Solving a system of equations programmably?

Un problema che può sorgere dalla tecnica bi-lineari è che, come il vostro punto interpolato diventa più vicino a un diverso insieme di 3 valori è possibile ottenere alcuni salti (come sarebbe intercolli 4 punti in una configurazione a sella?)

+0

Grazie per la risposta. Ho familiarità con la moltiplicazione della matrice e C++ :) Sono un po 'confuso qui. Cosa fare con il vettore B quando viene calcolato ?. Come usi le coordinate del punto da interpolare per ottenere un nuovo valore?_ La tua soluzione è come montare un aereo sui 3 punti più vicini e poi intersecare con la linea verticale dove l'intersezione è il valore che cerchiamo? – mitjap

+1

B è la soluzione, i coefficienti nella formula che funzionerà per qualsiasi X e Y per trovare A. A = X * B1 + Y * B2 + B3. È la formula per il piano che interseca i tuoi 3 punti originali. – Michael

+0

Come si cita, questa soluzione non è continua, quindi non sono sicuro di quale possa essere la buona qualità dei punti sparsi. Sostituendo i 3 punti più vicini, con i 3 vertici del triangolo che contiene il punto, supponendo di avere una triangolazione (ad esempio Delaunay) dei punti, allora puoi fare interpolazione continua, e questo apre più opzioni. –

1

Un buon metodo per i punti sparsi è l'interpolazione Natural Neighbor. È possibile verificare l'implementazione disponibile in CGAL ad esempio: http://doc.cgal.org/latest/Interpolation/index.html

+0

I collegamenti non sono risposte. Le risposte su SO dovrebbero essere autonome. Per favore [rivedi questa meta domanda] (http://meta.stackexchange.com/q/8231/135887) e aggiungi abbastanza dettagli alla tua risposta per renderlo non completamente dipendente da un collegamento esterno. – Charles

+0

Beh, non mi dispiacerebbe dare ulteriori dettagli, ma non penso che questo sia il problema. In realtà, la mia risposta non era tanto il link, quanto piuttosto le parole "Natural Neighbor Interpolation". Inoltre, la vera domanda è trovare una libreria C++ che fornisce la funzionalità, per la quale il mio link è una risposta esatta. –

+0

Sigh, ho bisogno di ricordare di leggere la domanda quando faccio recensioni. Le raccomandazioni bibliografiche sono fuori tema su SO, e ho votato per chiudere la domanda. Sarebbe utile se fosse possibile fornire almeno un codice di esempio su come utilizzare questa libreria per risolvere il problema. – Charles

Problemi correlati