Ordinamento di una serie di punti non organizzati lungo una curva


9

Ho una serie di punti 3D (che recupero da una libreria che esegue la tassellatura di un corpo solido) che appartengono a una curva (cioè un bordo del solido). Ciò significa che la curva passa sicuramente da ciascuno di questi punti.

Tuttavia, il punto impostato non è ordinato, quindi devo ordinarli per poter disegnare correttamente questa curva.

Esiste un approccio noto per questo tipo di problema?

Alcune informazioni aggiuntive:

  • Le curve sono parametriche in generale (spline / bezier, sezioni circolari ...).
  • I punti sono indicati come coordinate in virgola mobile.
  • I punti sono molto densi (ma possono essere densi come lo voglio). Per darti un'idea, per una curva che occupa 19 unità in x, 10 unità in x e 5 unità in z, cito una sequenza di punti in un segmento di curva: (20.7622, ​​25.8676, 0) (20.6573, 25.856, 0) (20.5529, 25.8444, 0) (20.4489, 25.8329, 0) (20.3454, 25.8213, 0)

Anche se sappiamo che l'ordine esiste fino a un numero infinito di curve che si adattano ai punti. Anche se aggiungiamo ulteriori vincoli, le estremità aperte sono problematiche in quanto il loro orientamento tangente può essere arbitrario. Un'immagine qui
joojaa,

@joojaa Sì, hai ragione. Ma poiché l'imballaggio dei punti è molto denso, non mi aspetto che sia esatto. Se riesco ad avere il giusto ordine, stavo pianificando di collegare la sequenza di punti come una polilinea.
andrea.al

Nel codice che deve ordinare i punti, sei anche a conoscenza della forma parametrica della curva? (In caso contrario, eliminerò la mia prima risposta, perché richiede la conoscenza del modulo parametrico.)
Martin Ender,

@ MartinBüttner Sì, ho accesso alla forma parametrica della curva, se necessario.
andrea.al

1
Si prega di mostrare un set di punti tipico!
Yves Daoust,

Risposte:


6

Hai un'istanza di un problema chiamato ricostruzione della curva da punti non organizzati . Ora che sai cosa cercare troverai diversi metodi, come la crosta, la crosta NN, ecc. Ecco alcuni link:

Dato che hai a che fare con le curve e che i campioni sono densi, ti suggerisco di calcolare un albero spanning minimo euclideo.


4

Dopo alcuni chiarimenti, esiste probabilmente un approccio molto migliore che non richiede nemmeno la conoscenza della forma parametrica della curva ed evita anche la fase di minimizzazione numerica potenzialmente problematica.

Se la curva non si interseca con se stessa e i punti sono sufficientemente densamente impaccati sulla curva (e con ciò intendo che devono essere più vicini di due punti qualsiasi sulla curva che non appartengono allo stesso segmento, ad es. su se stesso), quindi puoi facilmente determinare il punto precedente e successivo di ciascun campione:

  • Determina i due vicini più vicini a ciascun punto. Questo è un operazioneO(nlogn) .
  • Dovrai fare un trattamento speciale per gli endpoint. I loro due vicini più vicini saranno i due punti successivi lungo la curva anziché uno per lato. Puoi rilevarli in modo euristico se il rapporto tra le distanze e i due vicini differisce di più di una certa soglia (1.5 diciamo, dipende dalla levigatezza della curva e dalla densità dei punti). Oppure puoi trattare i dati del tuo vicino più vicino come un grafico, in cui scoprirai che i due vicini degli endpoint puntano l'uno verso l'altro (cosa che non dovrebbe accadere in nessun altro punto del grafico).
  • Ora puoi semplicemente scegliere un punto finale e camminare lungo i vicini più vicini (scegliendo sempre quello da cui non sei arrivato) per attraversare i punti lungo la curva.

Soprattutto se puoi rendere i punti molto densi, questa dovrebbe essere l'opzione più affidabile a meno che la curva non si intersechi da sola. Anche in questo caso, questo approccio potrebbe essere recuperabile a condizione che l'intersezione sia con un angolo sufficientemente ampio la curva abbastanza regolare (in tal caso è possibile scegliere i vicini corretti in base a un vincolo che i passaggi successivi non possono rendere un angolo maggiore di una soglia ).θ


3

Dato che hai solo rappresentazioni in virgola mobile dei punti, non c'è garanzia che questi si trovino esattamente sulla curva, a causa di errori di arrotondamento. Quindi penso che l'unico approccio generico sia approssimare la loro posizione sulla curva, trovando il punto più vicino sulla curva al tuo campione . Ad esempio, se la tua curva parametrica è potresti provare a minimizzare( x ( t ) , y ( t ) , z ( t ) )(X,Y,Z)(x(t),y(t),z(t))

(Xx(t))2+(Yy(t))2+(Zz(t))2

rispetto a . Se sai con quale tipo di curva hai a che fare, potrebbero esserci buone soluzioni analitiche, altrimenti dovrai ricorrere ad un algoritmo numerico. Dato che i tuoi punti dovrebbero essere molto vicini alla curva, questo metodo dovrebbe essere affidabile (purché l'algoritmo di minimizzazione sia), a meno che tu non abbia un campione esattamente dove la curva (quasi) si incrocia. In tal caso, comunque, probabilmente sei sfortunato.t

Una volta che hai quella per ciascuno dei tuoi punti, puoi semplicemente ordinarli per . Naturalmente, se hai il controllo su come ricevi i punti, potresti essere in grado di eludere tutti questi problemi restituendo insieme alle coordinate del punto durante la loro generazione.t tttt

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.