Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Алгоритм Брезенхэма - Рисование линий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 PascalProcedure 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; Просмотров: 9543
|