Comment éviter l'auto-intersection lors de l'application d'un trait à une courbe?

11

J'ai plusieurs objets Spline2D dans mon code, chacun ayant une méthode Position, Velocity et Acceleration qui renvoie un vecteur de la quantité spécifiée à un moment particulier. J'ai utilisé ces vecteurs afin de construire une géométrie pour créer des traits de dégradé pour les courbes, mais j'ai des problèmes avec les auto-intersections aux courbes raides. À titre d'exemple, voici une courbe où je rencontre cela:

Filaire: http://twitpic.com/2zplw1/full
Rempli: http://twitpic.com/2zpmnt/full

Comme vous pouvez le voir, au deuxième virage, la partie intérieure se croise, ce qui provoque cet artefact laid. Existe-t-il un bon algorithme / méthode pour tracer des courbes sans provoquer cette auto-intersection?

EDIT : Des exemples plus extrêmes, plus une maquette de ce que j'aimerais réaliser:

Filaire: http://twitpic.com/2ztwzi/full
Rempli: http://twitpic.com/2ztwkt/full
Idéal Résultat (maquette): http://twitpic.com/2ztxa8/full

ThatsGobbles
la source
Wow, je n'avais même pas réalisé la connotation du titre quand je l'ai écrit. :)
ThatsGobbles

Réponses:

3

Si vous les restituez avec le GPU et toute API 3D moderne (par exemple, OpenGL / D3D), il me semble que vous pouvez vous en débarrasser avec des tests de profondeur. Si vous affectez vos verts extérieurs à z = FAR et vos verts intérieurs à z = NEAR, le test de profondeur doit empêcher le chevauchement de s'afficher. Avec 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: cela ne fonctionnera pas si vous avez besoin de traits translucides.

jpaver
la source
1
Excellente réponse, juste ce que je pensais, cependant, vous avez tort que cela ne fonctionne pas pour les traits translucides si vous autorisez l'écriture du zbuffer en une seule passe, puis faites la couleur dans la seconde.
Richard Fabian
Merci, mes traits sont en effet opaques, donc cela a fonctionné très simplement et merveilleusement!
ThatsGobbles
1

Le "Fix" va dépendre de ce à quoi vous voulez que la sortie résultante ressemble. Le problème n'a pas vraiment été suffisamment bien défini ici: à quoi doit-il ressembler?

Je vous suggère d'abord d'essayer de créer un exemple encore plus extrême du problème, puis d'utiliser Photoshop / Paint pour le corriger, vous pourriez trouver l'inspiration pour une solution.

Voulez-vous qu'il se replie? Se chevauchent avec le bord? Tirez jusqu'à ce qu'il ne se chevauche pas?

Richard Fabian
la source
Bon point, je vais concocter une courbe plus nette et une courbe "idéale" dans Illustrator ou Inkscape plus tard dans la journée.
ThatsGobbles
Message original modifié!
ThatsGobbles