2010-06-15 5 views
4

J'utilise l'algorithme du cercle médian (cercle de bresenham) pour dessiner efficacement des cercles entiers. Y at-il quelque chose de similaire à dessiner des arcs de cercle? Je voudrais spécifier un angle de départ et un angle de fin et avoir seulement cette partie du cercle dessinée.algorithme efficace pour dessiner des arcs de cercle?

Merci d'avance!

EDIT: Je voudrais aussi dessiner des arcs de cercle pleins, c'est-à-dire des tranches de tarte. :)

+1

Avez-vous vu la section correspondante dans wikipedia? http://en.wikipedia.org/wiki/Midpoint_circle_algorithm#Drawing_incomplete_octants –

+0

Regardez cette solution: http://www.daniweb.com/forums/thread321181.html –

Répondre

1

Votre plate-forme ne dispose-t-elle pas déjà d'une bibliothèque permettant de dessiner ce type de formes?

Dessin d'une pie-tranche remplie:

d'abord, la pie couper verticalement et horizontalement, en quartiers. Si votre tranche de tarte correspond exactement à l'un de ces quartiers, ou correspond entièrement à l'intérieur de l'un de ces quartiers, utilisez la procédure suivante une fois. Sinon, votre tranche de tarte a été coupée en morceaux - cela peut arriver même pour des épissures très fines - répétez les étapes suivantes pour chaque morceau.

Je vais décrire une tranche de tarte qui se situe dans le quart supérieur-droit - les autres quartiers sont similaires. Trouvez le pixel de début et de fin de l'arc (cela peut nécessiter un certain trig). Je suppose que le pixel "débutant" de cet arc dans le quart supérieur-droit est le plus haut et le plus à gauche du pixel "final" - sinon, échangez-les pour qu'il en soit ainsi. Utilisez l'algorithme du cercle de Bresenham pour trouver tous les pixels sur la jante de ce quart du cercle, en commençant par le haut. Ignorez les valeurs jusqu'à ce que vous obteniez le pixel "début" - les pixels "actifs" sont les points sur la jante du cercle du pixel début au pixel final. Utilisez l'algorithme de la ligne Bresenham pour trouver des pixels sur la ligne "gauche" (la ligne qui commence au pixel "début" de l'arc, et va directement au centre du cercle).

Pour chaque ligne de balayage (chaque valeur y) de l'arc, tracez une ligne horizontale pour couvrir tous les pixels horizontaux du pixel le plus à gauche de la ligne gauche au pixel actif le plus à droite de l'arc. (Près du haut du quart de cercle, il peut y avoir beaucoup de pixels sur la jante qui sont sur la même valeur y scan en ligne)

Une fois que vous avez traité tous les pixels actifs dans la jante de cercle, Remplissez le triangle restant, le cas échéant. Unidirectionnel: Pour chaque ligne de numérisation (chaque valeur y), tracez une ligne horizontale de haut en bas pour couvrir tous les pixels horizontaux du pixel le plus à gauche de la ligne gauche au pixel le plus à droite de la ligne droite, jusqu'à ce que vous atteigniez le centre du cercle. (Si le pixel de début est proche du bas de ce quart de cercle, il peut y avoir plusieurs pixels sur la ligne gauche et la ligne droite sur la même valeur y de la ligne de balayage).

2

Calculer le début et la fin de l'arc et terminer lorsque ce point a été atteint. Voir par exemple http://en.wikipedia.org/wiki/Midpoint_circle_algorithm

+0

merci, mais que faire si j'ai besoin d'un arc rempli? (comme une tarte-tranche) – horseyguy

+0

Voir cette question précédente http://stackoverflow.com/questions/1201200/fast-algorithm-for-drawing-filled-circles – Krumelur

Questions connexes