Come evitare l'autointersezione quando si applica il tratto a una curva?


11

Ho diversi oggetti Spline2D nel mio codice, ognuno dei quali ha un metodo Posizione, Velocità e Accelerazione che restituisce un vettore della quantità specificata in un determinato momento. Ho usato questi vettori per costruire la geometria per creare tratti sfumati per le curve, ma ho problemi con autointersezioni su curve ripide. Ad esempio, ecco una curva in cui sto accadendo:

Wireframe: http://twitpic.com/2zplw1/full
Riempito: http://twitpic.com/2zpmnt/full

Come puoi vedere, nella seconda curva, la parte interna si interseca, causando quel brutto manufatto. Esiste un buon algoritmo / metodo per tracciare curve senza causare l'autointersezione?

EDIT : esempi più estremi, oltre a un modello di ciò che vorrei ottenere:

Wireframe: http://twitpic.com/2ztwzi/full
Riempito: http://twitpic.com/2ztwkt/full
Risultato ideale (Mock-Up): http://twitpic.com/2ztxa8/full


Caspita, non avevo nemmeno realizzato la connotazione del titolo quando l'ho scritto. :)
ThatsGobbles il

Risposte:


3

Se stai eseguendo il rendering di questi con la GPU e qualsiasi moderna API 3D (ad esempio OpenGL / D3D), mi sembra che puoi liberartene con i test di profondità. Se si assegnano i verts esterni a z = FAR e i verts interni a z = NEAR, il test di profondità dovrebbe impedire la visualizzazione della sovrapposizione. Con OpenGL:


  // don't forget to clear depth buffer to 1.0f at beginning of frame.
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // enable depth testing.
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);

// draw the Spline2D for each segment in spline for each vert in segment if (vert is an outer vert), set vert.z = 1.0, otherwise set vert.z=0.0

Caveat emptor: questo non funzionerà se hai bisogno di tratti traslucidi.


1
Ottima risposta, proprio quello che stavo pensando, tuttavia, ti sbagli sul fatto che non funziona per tratti traslucidi se permetti di scrivere lo zbuffer in un passaggio, quindi fare il colore nel secondo.
Richard Fabian,

Grazie, i miei tratti sono davvero opachi, quindi ha funzionato in modo molto semplice e meraviglioso!
Quello è Gobbles il

1

La "correzione" dipenderà dall'aspetto che si otterrà dall'output risultante. Il problema non è stato realmente definito abbastanza bene qui: come dovrebbe apparire?

Ti suggerirei prima di provare a fare un esempio ancora più estremo del glitch, quindi usando Photoshop / Paint per risolverlo potresti trovare l'ispirazione per una soluzione.

Vuoi che si pieghi? Si sovrappongono al bordo? Tirare fino a quando non si sovrappone?


Bene, creerò una curva più nitida e una curva "ideale" in Illustrator o Inkscape più tardi oggi.
Quello è Gobbles il

Post originale modificato!
Quello è Gobbles il
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.