2014-12-08 14 views
6

Vorrei triangolare tra due serie di poligoni. Un set è sempre all'interno dell'altro, infatti, i poligoni esterni vengono creati come offset dal set originale. La triangolazione sarebbe facile se si trovassero sullo stesso piano, ma mi piacerebbe aggiungere profondità spostando il poligono esterno su un piano parallelo ma diverso. Il solito metodo di triangolazione che uso (glu tesselator) non funziona. C'è un'alternativa che farebbe?Triangolazione tra poligoni su diversi piani

+3

Non capisco cosa si vuole raggiungere.Puoi spiegare più chiaramente? Con le illustrazioni? Quali sono i tuoi dati di origine? Cosa vuoi finire? Puoi aggiungere esempi? Grazie :) –

+0

Ho una serie di contorni (o poligoni) creati da un font. Ho anche un'altra serie di contorni creata dal primo set come contorno a un offset specificato. Voglio creare modelli 3d da questi e utilizzare il contorno come un bordo smussato. Tuttavia, il glu tesselator che uso di solito fallisce se tutti i contorni non sono sullo stesso piano. – aronsatie

+0

In effetti, avrei una soluzione se potessi triangolare i miei poligoni forzando il tesselator a non creare alcun triangolo che abbia tutti i suoi tre vertici sullo stesso poligono. – aronsatie

risposta

5

Stai dicendo che hai un metodo di triangolazione che funziona in 2D. Belle. Posizionare entrambi i contorni sullo stesso piano z = 0, eseguire la triangolazione 2D, quindi impostare la coordinata z dei vertici del contorno esterno sul valore desiderato. Come hai detto, sposta il contorno esterno sul piano parallelo.

Perché questo approccio non ti soddisfa?

Sì, si può finire con alcuni triangoli orizzontali, che hanno tutti e tre i vertici con la stessa coordinata z. Se hai usato una triangolazione 3D "vera" potresti anche ritrovarti con gli stessi triangoli orizzontali. Tutto dipende dalla forma del contorno e dall'algoritmo.

Se non è accettabile avere tali triangoli orizzontali è possibile aggiungere un secondo passaggio per cercare di eliminarle:

Trova un triangolo orizzontale. Due dei suoi bordi dovrebbero appartenere al contorno esterno originale o originale. Il terzo bordo "cortocircuiterà" i vertici del contorno originale. Trova un altro triangolo che abbia lo stesso bordo del "terzo" bordo descritto sopra. La coppia di questi triangoli forma un rombo. Ci sono solo due modi per triangolare il rombo. Quello che hai non è accettabile, quindi basta ri-triangolare il rombo in un modo diverso.

È difficile spiegarlo senza disegni.

+0

Penso di averti capito perfettamente. Ho pensato di correggere i triangoli "sbagliati" ma non ho trovato quello che hai appena suggerito. Ci penserò sicuramente perché questa sembra essere un'ottima soluzione! – aronsatie

+0

Sembra essere un po 'più complicato di così. Ricevo più di un singolo triangolo "falso", quindi la pulizia richiede più della creazione di triangoli alternativi da un rombo. Comunque penso che questa sia la strada da percorrere, quindi a meno che qualcuno non abbia un'idea ancora migliore, penso che la generosità dovrebbe essere la tua. – aronsatie

+0

Bene, sì, dopo la triangolazione iniziale si può finire con molti triangoli falsi/piatti/orizzontali che sono adiacenti l'uno all'altro. Significa solo che il tuo secondo passaggio deve essere eseguito più volte. Ogni volta che esegui il processo di "riparazione", viene risolto un triangolo piatto. Se non riesce a trovare alcun triangolo da correggere, interrompi il ciclo. Inoltre, devi cercare non solo un triangolo piatto, ma un tale triangolo piatto che abbia almeno un vertice che appartiene al contorno esterno e almeno un vertice che appartiene al contorno interno. Se tutti i vertici di un triangolo piatto appartengono allo stesso contorno, non è possibile correggerlo (ancora, in questo passaggio). –

3

IMO quando hai spostato il poligono esterno puoi provare una triangolazione delaunay in 3d per esempio con circumspheres. Cgal può fare triangolazione 3d.

+0

Sai di più piccoli e semplici? Preferirei evitare le grandi librerie per una singola attività. – aronsatie

+0

@aronsatie: No, ma puoi provare un algoritmo, ad esempio un bowyer-watson con circumspheres. In effetti è l'algoritmo cgal. – Bytemain

+0

Grazie, darò un'occhiata. Speravo in una soluzione più semplice, dal momento che i miei contorni non sono serie casuali di punti. Voglio triangolare tra i poligoni originali e le loro versioni modificate calcolate come offset. Il problema è solo 3D perché sposto l'offset su un altro piano parallelo all'originale. – aronsatie

3

Se ho capito quello che stai chiedendo correttamente, suona come si sta cercando di fare ciò che è talvolta chiamato un di estrusione, come questo
an example extrusion.
Ci sono un certo numero di librerie di caratteri che possono fare ciò che vuoi per OpenGL. Mentre le informazioni su questo page sono un po 'datate, ho sentito cose positive su GLTT.

Se si vuole fare da soli, si può farla franca con una semplice striscia triangolare che collega i due contorni (presumendo che siano collegati [nel senso del grafico matematico]), e potrebbe non aver bisogno del tassellatore (a parte creando il primo contorno).

Diciamo che il contorno "interno" è quello emesso dal tassellatore e si registrano i suoi vertici perimetrali. Quindi, come dici tu, crea il contorno "esterno" (quello che vuoi sfalsare) traducendo ciascun vertice interno di qualche offset (magari usando il normale [ortogonale alla linea tangente] al vertice, o qualsiasi altra cosa) nello stesso piano e quindi aggiungere la profondità di estrusione. Se mantieni la stessa topologia generale (cioè lo stesso numero di vertici e le stesse informazioni di connettività per ciascun vertice), puoi semplicemente "cucire" quell'insieme di contorni in una singola striscia triangolare. A seconda dell'effetto che stai cercando, potresti dover aggiungere ulteriori vertici al contorno esterno per renderlo più esteticamente gradevole. Questo non è un problema reale, a parte il fatto che la striscia triangolare che collega i contorni è un po 'più complicata.

+0

Ho già i vertici sia dell'originale che dell'offset. L'offset è un po 'più complicato di così, quindi il numero di punti è diverso. Cucire insieme non è banale, anche se al momento è quello che sto cercando di fare. Ho ancora problemi a curve strette. – aronsatie