Как выглядит алгоритм растровой развертки КРУГА по алгоритму Брезенхема? На просторах интернета могу найти только алгоритм развертки окружности :(
--
Как сместить цент?
public void Draw(int R, int _x, int _y)
{
int y = _y;
int x = R;
int d = 3 - 2 * R;
while (x > -y)
{
int tempx = _x, tempy = _y;
int i = 0;
while (i < x)
{
PutPixel(GetX(x - tempx), GetY(y));
PutPixel(GetX(-x + tempx), GetY(y));
i++;
tempx++;
}
i = 0;
tempx = _x;
while (i < x)
{
PutPixel(GetX(x - tempx), GetY(-y));
PutPixel(GetX(-x + tempx), GetY(-y));
i++;
tempx++;
}
if (d < 0)
d = d - 4 * y + 6;
else
{
tempy = _y;
i = 0;
while (i < -y)
{
PutPixel(GetX(y - tempy), GetY(x));
PutPixel(GetX(-y + tempy), GetY(x));
i++;
tempy--;
}
i = 0;
tempy = _y;
while (i < -y)
{
PutPixel(GetX(y - tempy), GetY(-x));
PutPixel(GetX(-y + tempy), GetY(-x));
i++;
tempy--;
}
d = d - 4 * (y + x) + 10;
x--;
}
Form1.Wait(0.03);
y--;
}
}
Классический алгоритм Брезенхема генерирует точки для четвертинки окружности. Остальные точки получаются отражением сгенерированной точки относительно осей координат. Таким образом вы на каждом шаге алгоритма получаете четыре точки - начала и концы двух горизонтальных диапазонов пикселов, которые нужно закрасить. Вот и получился алгоритм растеризации круга.
void draw_pixels(int x1, int x2, int y)
{
line(x1, y, x2, y);
}
void BresenhamCircle(int cx, int cy, int radius)
{
int x = radius, y = 0;
int D = 2 * (1 - radius);
while (x >= 0)
{
draw_pixels(cx - x, cx + x, cy + y);
draw_pixels(cx - x, cx + x, cy - y);
if (D < 0 && 2 * D + 2 * x - 1 <= 0)
{
++y;
D += 2 * y + 1;
}
else if (D > 0 && 2 * D - 2 * y - 1 >= 0)
{
--x;
D -= 2 * x - 1;
}
else
{
--x, ++y;
D += 2 * y - 2 * x + 2;
}
}
}
Вариант Мичнера генерирует точки для одной осьмушки окружности, а остальные точки получаются отражением относительно осей координат и диагоналей. На каждом шаге вы получаете восемь точек - начала и концы четырех горизонтальных диапазонов пикселов, которые нужно закрасить. Снова получился алгоритм растеризации круга.
void MichenerCircle(int cx, int cy, int radius)
{
int x = radius, y = 0;
int d = 3 - 2 * radius;
while (y <= x)
{
draw_pixels(cx - x, cx + x, cy - y);
draw_pixels(cx - x, cx + x, cy + y);
draw_pixels(cx - y, cx + y, cy + x);
draw_pixels(cx - y, cx + y, cy - x);
if (d <= 0)
{
d += 4 * y + 6;
++y;
}
else
{
d += 4 * (y - x) + 10;
--x, ++y;
}
}
}
Выбирайте, что вам больше нравится.
как в C# в массив string[] добавить значения типа многомерного как в php типа такого
При нажатии кнопки "указать", указывается путь к папке с файлами, получается список файлов и по очередной загружается в picturebox и параллельно...
Все объекты являются неуправляемыми за исключением некоторых типов
Просто как заблокировать клавиатуру и мышь? Уже смотрел эту страницу http://wwwcyberforum