Comment compenser une courbe de bézier cubique?

j'essaie de créer une courbe "parrallel" bezier. Dans mes tentatives, j'ai pris de près, mais pas de cigare. J'essaie de garder un bon décalage de 1px entre les 2 courbes (rouge,bleu).

current attempt

mon but principal est d'utiliser un algorithme de compensation de bord pour élargir/rétrécir un chemin svg.


Solution

pour toute autre personne qui cherche un solution, j'ai créé une version AS3.

http://seant23.wordpress.com/2010/11/12/offset-bezier-curves /

20
demandé sur Community 2010-11-10 23:38:45

4 réponses

de wikipedia: ( http://en.wikipedia.org/wiki/B%C3%A9zier_curve )

la courbe à un déport fixe d'une courbe Bézier donnée, souvent appelée une courbe déport ("parallèle" à la courbe originale, comme le déport entre les rails dans une voie de chemin de fer), ne peut pas être formé exactement par une courbe Bézier (sauf dans certains cas triviaux). Cependant, il y a des méthodes heuristiques qui donnent habituellement une approximation adéquate pour des buts pratiques.

vous pourriez aussi voir le papier indiqué ici: Tracé de la courbe cubique de bezier

9
répondu erkmene 2017-05-23 11:54:34

il n'est pas possible en général de représenter le déport d'une courbe de Bézier cubique comme une courbe de Bézier cubique (en particulier, cela pose problème lorsque vous avez des cuspides ou un rayon de courbure proche de la distance de déport). Cependant, vous pouvez approximer le décalage à n'importe quel niveau de précision.

Essayez ce qui suit:

  • Compenser les Beziers en question (ce que vous avez déjà semble assez décent)
  • mesurer la différence entre chaque courbe originale et les courbes de décalage correspondantes. Je vais essayer quelque chose comme 10 échantillons et voir si ça marche bien.
  • pour tout décalage hors tolérance, subdiviser (en utilisant l'algorithme de deCastlejau pour les Béziers) et itérer.

Je n'ai pas implémenté d'offset (parce que les noyaux que j'utilise en ont déjà un), mais cela ressemble à quelque chose à essayer.

7
répondu tfinniga 2010-11-12 05:06:05

j'espère que vous avez trouvé mon papier de mathématiques utile enter image description here

compensation de Bézier quadratique avec subdivision sélective http://microbians.com/?page=math

4
répondu microbians 2014-04-02 22:36:05

ce que vous demandez est appelé un courbe parallèle ou offset en mathématiques. L'article de Wikipedia (cité ci-dessus par d'autres) sur les courbes de Bezier n'a pas réussi à faire le lien vers le bon article pour "offset curve", mais j'ai corrigé cela il y a quelques secondes. Dans le monde des graphismes vectoriels, cette même notion est appelée caresser le chemin.

en général, pour la courbe cubique / Bezier, la courbe offset est un polynôme de 10e ordre! Source: Kilgard, p. 28

si tout ce que vous voulez faire est de brosser de telles courbes d'offset, plutôt que de calculer leur forme analytique, vous pouvez par exemple regarder les sources de ghostscript. Vous pouvez aussi regarder cette demande de brevet pour voir comment NV_path_rendering le fait.

si vous voulez couvrir / rapprocher les courbes de décalage, alors le papier sur remorqueur sur MetaFog pour couvrir METAFONT à Les polices PostScript sont une bonne lecture. Le système METAFONT, qui a précédé PostScript, a permis de décrire les polices par l'opération (plus complexe sur le plan mathématique) de stroking, mais les polices de type 1 de PostScript ne permettent que le remplissage (contrairement aux dessins PostScript en général) pour des raisons de vitesse.

un autre algorithme pour approximer les offsets comme (seulement deux) Béziers (un de chaque côté), avec le code en PostScript, est donné dans la section 7 de ce papier de Gernot Hoffmann . (Astuce chapeau à quelqu'un sur l'OpenGL forum pour le trouver.)

il y a en fait beaucoup de tels algorithmes. J'ai trouvé un 1997 enquête de divers algorithmes pour l'approximation des courbes d'offset. Ils supposent que les courbes progéniteurs sont des Béziers ou des NURBES.

4
répondu Fizz 2014-08-15 04:13:46