54 votes

algorithme rapide pour dessiner des cercles remplis?

J'utilise l' algorithme de cercle de Bresenham pour le dessin de cercle rapide. Cependant, je souhaite également (à la demande de l'utilisateur) dessiner un cercle plein.

Existe-t-il un moyen rapide et efficace de le faire? Quelque chose dans le même sens que Bresenham?

La langue que j'utilise est C.

88voto

AakashM Points 32891

Après avoir lu la page Wikipedia sur Bresenham (aussi 'Milieu') cercle de l'algorithme, il semblerait que la meilleure chose à faire serait de modifier ses actions, tels que, au lieu de

setPixel(x0 + x, y0 + y);
setPixel(x0 - x, y0 + y);

et de même, chaque fois que vous au lieu de faire

lineFrom(x0 - x, y0 + y, x0 + x, y0 + y);

C'est, pour chaque paire de points (avec le même y) que Bresenham auriez-vous, vous intrigue, vous, au lieu de se connecter avec un ligne.

73voto

palm3D Points 1991

Utilisez simplement la force brute. Cette méthode itère sur quelques pixels de trop, mais elle utilise uniquement des multiplications et des ajouts entiers. Vous évitez complètement la complexité de Bresenham et le goulot d'étranglement possible de sqrt.

 for(int y=-radius; y<=radius; y++)
    for(int x=-radius; x<=radius; x++)
        if(x*x+y*y <= radius*radius)
            setpixel(origin.x+x, origin.y+y);
 

26voto

Daniel Earwicker Points 63298

Voici un guide approximatif en C # (cela ne devrait pas être si difficile de se faire une bonne idée pour C) - c'est la forme "brute" sans utiliser Bresenham pour éliminer les racines carrées répétées.

 Bitmap bmp = new Bitmap(200, 200);

int r = 50; // radius
int ox = 100, oy = 100; // origin

for (int x = -r; x < r ; x++)
{
    int height = (int)Math.Sqrt(r * r - x * x);

    for (int y = -height; y < height; y++)
        bmp.SetPixel(x + ox, y + oy, Color.Red);
}

bmp.Save(@"c:\users\dearwicker\Desktop\circle.bmp");
 

14voto

Leszek S Points 331

Vous pouvez utiliser ceci:

 void DrawFilledCircle(int x0, int y0, int radius)
{
    int x = radius;
    int y = 0;
    int xChange = 1 - (radius << 1);
    int yChange = 0;
    int radiusError = 0;

    while (x >= y)
    {
        for (int i = x0 - x; i <= x0 + x; i++)
        {
            SetPixel(i, y0 + y);
            SetPixel(i, y0 - y);
        }
        for (int i = x0 - y; i <= x0 + y; i++)
        {
            SetPixel(i, y0 + x);
            SetPixel(i, y0 - x);
        }

        y++;
        radiusError += yChange;
        yChange += 2;
        if (((radiusError << 1) + xChange) > 0)
        {
            x--;
            radiusError += xChange;
            xChange += 2;
        }
    }
}
 

0voto

KPexEA Points 6188

Je voudrais simplement générer une liste de points, puis utiliser une fonction de dessin de polygone pour le rendu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X