int dx = x2 - x1; int dy = y2 - y1; int d = 0; int d1 = dy « 1; int d2 = - ( dx « 1 ); putpixel ( x1, y1, color); for (int x = x1, у = y1, i = 1; i <= dx + dy; i++ ) { if ( d > 0 )
{
d += d2; У += 1;
}
else
{
d+=d1; x += 1;
}
putpixel ( x, y, color);
}
}
Общий случай произвольного отрезка легко сводится к рассмотренному выше; следует только иметь в виду, что при выполнении неравенства |Ау) ^ |Лх| необходимо х и у поменять местами. Полный текст соответствующей программы приводится ниже.
2) // File Ппеб.срр // Bresenhames alg.
6. Растровые алгоритмы
Void line (int x1, int y1, int x2, int y2, int color) {
int dx = abs ( x2 - x1 ); int dy = abs (y2 - y1 ); int sx = x2 >= x1 ? 1 : -1; int sy = y2 >= y1 ? 1 : -1;
if ( dy <= dx ) {
int d = ( dy « 1 ) - dx;
int d1 = dy « 1;
int d2 = ( dy - dx ) « 1;
putpixel ( x1, y1, color);
for (int x=x1 +sx, y=y1, i=1; i <= dx; i++, x+=sx) {
if (d > 0 ) {
d += d2; y += sy;
}
else
d+=d1; putpixel ( x, y, color);
}
}
else
{
int d = ( dx « 1 ) - dy;
int d1 = dx «1;
int d2 = (dx-dy)«1;
putpixel ( x1, y1, color);
for (int x=x1, y=y1+sy, i=1; i <= dy; i++, y+=sy) {
if ( d > 0 ) {
d += d2; x += sx;
}
else
d +=d1; putpixel ( x, y, color);
}
}
}
6.2. Растровая развертка окружности Для упрощения алгоритма растровой развертки стандартной окружности можно пользоваться ее симметрией относительно координатных осей и прямых у = і*
Компьютерная графика. Полигональные модели
(в случае, когда центр окружности не совпадает с началом координат, эти прямые необходимо сдвинуть параллельно так, чтобы они прошли через центр окружности). Тем самым достаточно построить растровое представление для 1/8 части окружности, а все оставшиеся точки получить симметрией. С этой целью введем следующую процедуру:
2] static void circlePoints (int x, int y, int color) {
putpixel ( xCenter + x, yCenter + y, color); putpixel ( xCenter + y, yCenter + x, color); putpixel ( xCenter + y, yCenter - x, color); putpixel ( xCenter + x, yCenter - y, color); putpixel ( xCenter - x, yCenter - y, color); putpixel ( xCenter - y, yCenter - x, color); putpixel ( xCenter - y, yCenter + x, color); putpixel ( xCenter - x, yCenter + y, color);