@Nidonocu
Для добавления другого флага к существующему набору значений используйте ИЛИ оператор присваивания.
Mode = Mode.Read;
//Add Mode.Write
Mode |= Mode.Write;
Assert.True(((Mode & Mode.Write) == Mode.Write)
&& ((Mode & Mode.Read) == Mode.Read)));
Прочитав страницу в Википедии об алгоритме круга Брезенхэма (также «Средняя точка») , кажется, что проще всего было бы изменить его действия, чтобы вместо
setPixel(x0 + x, y0 + y);
setPixel(x0 - x, y0 + y);
и тому подобное, каждый раз, когда вы вместо этого делаете
lineFrom(x0 - x, y0 + y, x0 + x, y0 + y);
То есть для каждой пары точек (с тем же y
), которые Брезенхэм хотел бы, чтобы вы построили , вместо этого вы подключаетесь к линии .
Вот приблизительное руководство по 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");
Я бы просто сгенерировал список точек, а затем использовал бы функцию рисования многоугольника для визуализации.
Просто используйте грубую силу. Этот метод перебирает слишком много пикселей, но использует только целочисленные умножения и сложения. Вы полностью избегаете сложности Брезенхема и возможного узкого места 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);