Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Алгоритм Брезенхэма - Рисование линий23 января 2011Оглавление: 1. Алгоритм Брезенхэма 2. Рисование линий 3. Рисование окружностей Реализация на C++:
void drawLine
{
int deltaX = abs;
int deltaY = abs;
int signX = x1 < x2 ? 1 : -1;
int signY = y1 < y2 ? 1 : -1;
int error = deltaX - deltaY;
for
{
setPixel;
if
break;
int error2 = error * 2;
if
{
error -= deltaY;
x1 += signX;
}
if
{
error += deltaX;
y1 += signY;
}
}
}
Реализация на Java:
// Этот код "рисует" все 9 видов отрезков. Наклонные, вертикальный и горизонтальный - тоже из начала в конец и из конца в начало, и точку.
private int sign {
return ? 1 : ? -1 : 0;
//возвращает 0, если аргумент равен нулю; -1, если x < 0 и 1, если x > 0.
}
public void drawBresenhamLine
/**
* xstart, ystart - начало;
* xend, yend - конец;
* "g.drawLine;" используем в качестве "setPixel;"
* Можно писать что-нибудь вроде g.fillRect;
*/
{
int x, y, dx, dy, incx, incy, pdx, pdy, es, el, err;
dx = xend - xstart;//проекция на ось икс
dy = yend - ystart;//проекция на ось игрек
incx = sign;
/*
* Определяем, в какую сторону нужно будет сдвигаться. Если dx < 0, т.е. отрезок идёт
* справа налево по иксу, то incx будет равен -1.
* Это будет использоваться в цикле постороения.
*/
incy = sign;
/*
* Аналогично. Если рисуем отрезок снизу вверх -
* это будет отрицательный сдвиг для y.
*/
if dx = -dx;//далее мы будем сравнивать: "if"
if dy = -dy;//поэтому необходимо сделать dx = |dx|; dy = |dy|
//эти две строчки можно записать и так: dx = Math.abs; dy = Math.abs;
if
//определяем наклон отрезка:
{
/*
* Если dx > dy, то значит отрезок "вытянут" вдоль оси икс, т.е. он скорее длинный, чем высокий.
* Значит в цикле нужно будет идти по икс, значит "протягивать" прямую по иксу
* надо в соответствии с тем, слева направо и справа налево она идёт, при этом
* по y сдвиг такой отсутствует.
*/
pdx = incx; pdy = 0;
es = dy; el = dx;
}
else//случай, когда прямая скорее "высокая", чем длинная, т.е. вытянута по оси y
{
pdx = 0; pdy = incy;
es = dx; el = dy;//тогда в цикле будем двигаться по y
}
x = xstart;
y = ystart;
err = el/2;
g.drawLine ;//ставим первую точку
//все последующие точки возможно надо сдвигать, поэтому первую ставим вне цикла
for //идём по всем точкам, начиная со второй и до последней
{
err -= es;
if
{
err += el;
x += incx;//сдвинуть прямую
y += incy;//или сместить влево-вправо, если цикл проходит по y
}
else
{
x += pdx;//продолжить тянуть прямую дальше, т.е. сдвинуть влево или вправо, если
y += pdy;//цикл идёт по иксу; сдвинуть вверх или вниз, если по y
}
g.drawLine ;
}
}
Реализация на Object Pascal
Procedure Swap;
var t:Integer;
begin
t:=x;x:=y;y:=t;
end;
Procedure Line;
var dx,dy,i,sx,sy,check,e,x,y:integer;
begin
dx:=abs;
dy:=abs;
sx:=Sign;
sy:=Sign;
x:=x1;
y:=y1;
check:=0;
if dy>dx then begin
Swap;
check:=1;
end;
e:= 2*dy - dx;
for i:=0 to dx do begin
Canvas.Pixels:=clBlack;
if e>=0 then begin
if check=1 then inc else inc;
dec;
end;
if check=1 then inc else inc;
inc;
end;
end;
Просмотров: 10611
|