Интернет магазин китайских планшетных компьютеров



Компьютеры - Алгоритм Брезенхэма - Рисование линий

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;


Просмотров: 8915


<<< Алгоритм Бентли Оттмана
Алгоритм быстрой оболочки >>>