Commentçamarche.net
CodeS-SourceS
Rechercher un code, un tuto, une réponse

Remplissage d'une courbe de bézier

5/5 (24 avis)

Vue 4 700 fois - Téléchargée 291 fois

Description

Il existe une API pour tracer un polygone rempli. Mais pas pour les courbes de Bézier.

En voici une, avec les explications (un peu matheuse...)
En gros, une courbe de Bézier, c'est une série de points, et pour chaque point, deux poignées, indiquant comment la courbe doit arrivé et partir.
Je parle bien d'une courbe fermée, sinon, pas de remplissage bien sur...
Le but étant de savoir si se trouve à l'intérieur de la patate ou à l'extérieur...
Car une simple courbe avec 2 points (et 2 poignées), on peut déjà provoquer une jolie boucle, à l'inverse d'un polygone où le trait droit est un élément simple.
Pour cela, je procède en plusieurs étapes :
1 - je découpe la courbe en arc plus simple, et surtout en arc qui ne change jamais de direction.
En gros, la courbe monte ou descend, mais jamais elle monte puis redescend.
Bien sur, elle peut monter en décrivant un arc.
Pourquoi faire ça ?
Parce que je vais ensuite saucissonner ma patate en tranche de 1 pixel de hauteur, mes arcs ne couperont JAMAIS plus d'une seule fois une ligne donnée (à l'inverse d'une boucle qui peut couper une ligne 2 voir 3 ou 4 fois).
En clair, je dérive ma fonction et je regarde quand elle s'annule. (ce qui signifie que la courbe change de direction)
2 - Pour chaque arc, en le tronçonnant, en tranche de 1 pixel, j'obtiens ainsi un simple segment horizontal d'une certaine largeur, mais UN seul, pas plus. Je considère que le milieu de ce segment est à limite en l'intérieur et l'extérieur.
3 - maintenant que je connais la direction de chaque arc, les segments qui le constitue, et ses limites, je peut tracer l'intérieur et les contours

Vous remarquerez que l'on peut, en plus, tracer le contour en connaissant l'ordre exacte des points entre le départ de la courbe et l'arrivée... Ce que j'ai traduit par un dégradé de couleurs.

Conclusion :


il y a surement quelques optimisations à faire car, dans l'état, on recherche plusieurs fois les solutions d'une même équation du 3ième degré (en extended), ce qui n'est pas forcement très performant... Ou encore la recherche des intersections pourrait être mieux faite...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.