Come posso eseguire un triangolo all'interno del test in mesh poligonali?


10

inserisci qui la descrizione dell'immagine Ho 3 vertici (V1, V2, V3)casualmente selezionati su una normale maglia triangolare. Per questi 3 vertici, ho calcolato la distanza geodetica e il percorso (usando Dijkstra) tra loro e ho formato una superficie triangolare come nella figura sopra.

Ora ho i vertici che giacciono in ciascun percorso e possono calcolare le distanze geodetiche da un dato vertice.

Quello che voglio fare è ottenere i vertici o i triangoli che si trovano in un'area triangolare. Come posso fare questo?


2
Supponendo che l'approccio baricentrico faccia quello che penso, sarebbe piuttosto lento con set di grandi dimensioni. Immagina un set di 9 milioni di vertici con solo 9 vertici nel set desiderato. Perché iterare l'intero set quando v1, v2 e v3 ti danno tutte le informazioni di cui hai bisogno. La risposta al riempimento di alluvione sarebbe la soluzione flessibile più veloce. Anche se non flessibile, se si può presumere che ci siano linee come la geometria, la scanline sarebbe l'approccio più veloce.
Andrew Wilson,

Hai assolutamente ragione sui problemi di prestazioni. Mi piacerebbe usare questo approccio in maglie grandi, quindi quello che sto cercando è un metodo efficiente. In realtà non ho familiarità con gli algoritmi di riempimento inondazione e scansione, non li vedrò. Grazie.
mkocabas,

3
Un riempimento di inondazione con un grafico inizierebbe in corrispondenza di un nodo, visitando tutti i nodi vicini se la condizione limite è soddisfatta e non visitata, contrassegnandola come visitata e ripetuta (ricorsione). Alterazione: contrassegnare ogni nodo sul percorso come visitato e iniziare da un nodo all'interno dell'insieme. Quindi utilizzare semplicemente il controllo di visita come condizione al contorno.
Andrew Wilson,

Grazie per la spiegazione dettagliata. Trovo l'algoritmo di riempimento delle alluvioni più ragionevole, ma voglio implementare sia la linea di riempimento delle inondazioni che la scansione, quindi confrontare le prestazioni.
mkocabas,

Risposte:


4

Esiste un metodo alternativo che si basa sul riempimento di inondazioni. Per prima cosa disponi i dati dei bordi in un ciclo in cui i bordi formano un ciclo in senso antiorario. Quindi iniziare in un punto arbitrario sul loop e selezionare i bordi che uniscono quel punto. Usa il bordo di confine in uscita e attraversalo con l'altro bordo in uscita, se punta nella direzione della faccia normale allora è un bordo da includere, se non scartalo. Da questo bordo continuare fino a quando non si raggiunge un limite, a quel punto si termina il riempimento. Continuare su un vertice del bordo di confine ancora da visitare.


Non ho familiarità con l'algoritmo di riempimento delle inondazioni. La tua spiegazione mi sembra un po 'complicata. Potresti fornire un riferimento decente da guardare? Grazie.
mkocabas,

Ho ottenuto la soluzione leggendone alcuni. Grazie.
mkocabas,

3

Ho già commentato l'uso dell'inondazione e come sarebbe meglio in quanto è più flessibile ma un'altra possibile soluzione è scanline. (Dico possibile perché fa molte ipotesi sulla tua geometria ma per il particolare set mostrato e molti simili funzionerebbe.)

Per il tuo esempio con 3 punti: trova il vertice di intersezione dal segmento v1, v2 e dalla linea su cui si trova v3. (Il vertice in alto a sinistra di v2) Chiameremo questo vertice v4.

For every vertex pair a,b down v1,v4 and v1,v3 
    For every vertex from a to b
        Mark as in the set
For every vertex pair a,b down v3,v2 and v4,v3
    For every vertex from a to b
        Mark as in the set

inserisci qui la descrizione dell'immagine

Si chiama scanline perché (nell'immagine sopra) si scendono contemporaneamente le linee rossa e verde e quindi le linee rossa e blu simultaneamente scansionano le linee mentre si procede.

Questa soluzione sarebbe molto veloce se c'è un modello di indice, che è spesso il caso. Altrimenti sarebbe necessario un calcolo per determinare quale vertice adiacente si trova sulla linea.

La cosa divertente è scanline, test baricentrici (nel riquadro delimitato da triangoli) e riempimento di inondazioni sono tutti modi per disegnare triangoli nel rendering 3d.


2

Penso che tu possa calcolare alcune coordinate baricentriche legate alla superficie per ogni punto sulla superficie, e quindi usarle per verificare l'interno o l'esterno del triangolo.

Non ho un algoritmo esatto a portata di mano, ma ho trovato questo articolo che sembra gestire esattamente questo tipo di coordinate.

Coordinate baricentriche su superfici


Grazie per la risposta e il documento di riferimento. Proverò ad attuare il metodo proposto.
mkocabas,
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.