алгоритм FAST для того, чтобы нарисовать заполненные круги?

@Nidonocu

Для добавления другого флага к существующему набору значений используйте ИЛИ оператор присваивания.

Mode = Mode.Read;
//Add Mode.Write
Mode |= Mode.Write;
Assert.True(((Mode & Mode.Write) == Mode.Write)
  && ((Mode & Mode.Read) == Mode.Read)));
46
задан colithium 29 July 2009 в 16:06
поделиться

4 ответа

Прочитав страницу в Википедии об алгоритме круга Брезенхэма (также «Средняя точка») , кажется, что проще всего было бы изменить его действия, чтобы вместо

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

и тому подобное, каждый раз, когда вы вместо этого делаете

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

То есть для каждой пары точек (с тем же y ), которые Брезенхэм хотел бы, чтобы вы построили , вместо этого вы подключаетесь к линии .

79
ответ дан 26 November 2019 в 19:59
поделиться

Вот приблизительное руководство по C # (не должно быть так сложно понять правильную идею для C) - это «сырая» форма без использования Брезенхема для устранения повторяющихся квадратных корней.

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");
22
ответ дан 26 November 2019 в 19:59
поделиться

Я бы просто сгенерировал список точек, а затем использовал бы функцию рисования многоугольника для визуализации.

0
ответ дан 26 November 2019 в 19:59
поделиться

Просто используйте грубую силу. Этот метод перебирает слишком много пикселей, но использует только целочисленные умножения и сложения. Вы полностью избегаете сложности Брезенхема и возможного узкого места 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);
56
ответ дан 26 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: