|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Andrey Dashkovsky 2:5002/46.4 22 Mar 2002 21:19:23 To : Sergey Khabarov Subject : линии -------------------------------------------------------------------------------- 20 Мар 02 16:35, you wrote to all: SK> У меня есть два вопpоса. Во-пеpвых: подскажите алгоpитм, как SK> pисовать ... толстые линии. Линии в толщину 1 пиксель можно pисовать Очень жаль, но для меня это так и осталось загадкой. SK> А во-втоpых - поделитесь алгоpитмом anti-aliasing'а. Hа всякий SK> случай поясню: когда pисуется какая-то кpивая (не обязательно линия), [...] SK> аппpоксимиpоваться чеpез целочисленную, так сказать, алгебpу, но SK> как-то это все не совеpшенно, неудобно и неустойчиво, излагать их я SK> не SK> вижу смысла. Hадеюсь, кто-нибудь поможет. Hа самом деле это делается немного иначе немного кривоватая реализация, но суть та же: цвет соседних с линией точек вычисляется по пормуле от граничных точек. ..XX.. XX XX ..XX.. те что "XX" - например берётся 1/4, а те, что ".." - берётся 1/8, потом как правила используются не все края, а только лево и верх например, к тому же с 1/4 и 1/8 - я мог ошибиться, лучше книжку полистать, но суть такая, хотя не спорю, может и твой вариант имеет место жить, только ИМХО это будет медленно. Procedure RLine(x1,y1,x2,y2,c:Integer); var dx,dy,sx,sy,d,d1,d2,x,y,i,bCol,iCol:Integer; begin bCol:=(c shr 6)shl 6;iCol:=c and 63; dx:=abs(x2-x1); dy:=abs(y2-y1); if (x2>x1) then sx:=1 else sx:=-1; if (y2>y1) then sy:=1 else sy:=-1; if dy<=dx then begin d:=dy shl 1 - dx; {d :=2*dy- dx} d1:=dy shl 1; {d1:=2*dy } d2:=(dy-dx) shl 1; {d2:=2*dy-2*dx} PutPixel1(x1,y1,c); PutPixel1(x1,y1+sy,LongInt(d-d2)*iCol div (d1-d2)+BCol); x:=x1+sx;y:=y1; for i:=1 to dx do begin {[(-)d2..(+)d1] - d} if (d>0) then begin inc(d,d2);inc(y,sy); end else inc(d,d1); PutPixel1(x,y,c); PutPixel1(x,y-sy,LongInt(d1-d)*iCol div (d1-d2)+BCol); if x<>x2 then PutPixel1(x,y+sy,LongInt(d-d2)*iCol div (d1-d2)+BCol); inc(x,sx); end; end else begin d:=dx shl 1 - dy; d1:=dx shl 1; d2:=(dx-dy) shl 1; PutPixel1(x1,y1,c); PutPixel1(x1+sx,y1,LongInt(d-d2)*iCol div (d1-d2)+BCol); y:=y1+sy;x:=x1; for i:=1 to dy do begin if (d>0) then begin inc(d,d2);inc(x,sx); end else inc(d,d1); PutPixel1(x,y,c); PutPixel1(x-sx,y,LongInt(d1-d)*iCol div (d1-d2)+BCol); if y<>y2 then PutPixel1(x+sx,y,LongInt(d-d2)*iCol div (d1-d2)+BCol); inc(y,sy); end; end; end; procedure REllipse(X,Y,YRad,XRad: integer; Color: byte); var EX,EY: integer; YRadSqr,YRadSqr2,XRadSqr,XRadSqr2,D,DX,DY: longint; bCol,iCol,cc,lc1,lc2:Integer; begin bCol:=(color shr 6)shl 6;iCol:=color and 63; EX:=0; EY:=XRad; YRadSqr:=longint(YRad)*YRad; YRadSqr2:=2*YRadSqr; XRadSqr:=longInt(XRad)*XRad; XRadSqr2:=2*XRadSqr; D:=XRadSqr-YRadSqr*XRad+YRadSqr div 4; {d :=XR*XR-YR*YR*XR+YR*YR/4} DX:=0; {} DY:=YRadSqr2*XRad; {dy:=2*YR*YR*XR} PutPixel1(X,Y-EY,Color); PutPixel1(X,Y+EY,Color); PutPixel1(X-YRad,Y,Color); PutPixel1(X+YRad,Y,Color); cc:=LongInt(DX-D)*iCol div (dx+dy)+BCol; PutPixel1(X,Y+EY+1,cc); PutPixel1(X,Y-EY-1,cc); cc:=LongInt(DY+D)*iCol div (dx+dy)+BCol; PutPixel1(X,Y+EY-1,cc); PutPixel1(X,Y-EY+1,cc); while (DX<DY) do begin if (D>0) then begin Dec(EY); Dec(DY,YRadSqr2); Dec(D,DY); end; Inc(EX); Inc(DX,XRadSqr2); Inc(D,XRadSqr+DX); PutPixel1(X+EX,Y+EY,Color); PutPixel1(X-EX,Y+EY,Color); PutPixel1(X+EX,Y-EY,Color); PutPixel1(X-EX,Y-EY,Color); { cc:=LongInt(XRAdSqr+DX-D)*iCol div (dx+dy+XRadSqr+YRadSqr2)+BCol;lc1:=cc;} cc:=LongInt(XRAdSqr+DX-D)*iCol div (dx+dy+XRadSqr+YRadSqr2)+BCol;lc1:=cc; PutPixel1(X+EX,Y+EY+1,cc); PutPixel1(X-EX,Y+EY+1,cc); PutPixel1(X+EX,Y-EY-1,cc); PutPixel1(X-EX,Y-EY-1,cc); { cc:=LongInt(DY+YRadSqr2+D)*iCol div (dx+dy+XRadSqr2+YRadSqr2)+BCol;lc2:=cc;} cc:=LongInt(DY+YRadSqr2+D)*iCol div (dx+dy+XRadSqr2+YRadSqr2)+BCol;lc2:=cc; PutPixel1(X+EX,Y+EY-1,cc); PutPixel1(X-EX,Y+EY-1,cc); PutPixel1(X+EX,Y-EY+1,cc); PutPixel1(X-EX,Y-EY+1,cc); end; Inc(D,(3*(YRadSqr-XRadSqr) div 2-(DX+DY)) div 2); cc:=LongInt(XRAdSqr+DX-D)*iCol div (dx+dy+XRadSqr+YRadSqr2)+BCol;lc1:=cc; { cc:=LongInt(DX-d)*iCol div (DX+DY)+BCol;cc:=(cc+lc1)shr 1;} PutPixel1(X+EX+1,Y+EY,cc); PutPixel1(X+EX+1,Y-EY,cc); PutPixel1(X-EX-1,Y+EY,cc); PutPixel1(X-EX-1,Y-EY,cc); { cc:=LongInt(d+DY)*iCol div (DX+DY)+BCol;cc:=(cc+lc1)shr 1; PutPixel1(X+EX-1,Y+EY,cc); PutPixel1(X+EX-1,Y-EY,cc); PutPixel1(X-EX+1,Y+EY,cc); PutPixel1(X-EX+1,Y-EY,cc);} while (EY>0) do begin if(D<0) then begin Inc(EX); Inc(DX,XRadSqr2); Inc(D,XRadSqr+DX); end; Dec(EY); Dec(DY,YRadSqr2); Dec(D,DY-YRadSqr); PutPixel1(X+EX,Y+EY,Color); PutPixel1(X-EX,Y+EY,Color); PutPixel1(X+EX,Y-EY,Color); PutPixel1(X-EX,Y-EY,Color); { cc:=((XRadSqr+DX)-d)*iCol div (XRadSqr+DX-YRadSqr+DY)+BCol;} { cc:=LongInt(DX-d)*iCol div (DX+DY)+BCol;} cc:=LongInt(XRAdSqr+DX-D)*iCol div (dx+dy+XRadSqr+YRadSqr2)+BCol;lc1:=cc; PutPixel1(X+EX+1,Y+EY,cc); PutPixel1(X+EX+1,Y-EY,cc); PutPixel1(X-EX-1,Y+EY,cc); PutPixel1(X-EX-1,Y-EY,cc); { cc:=(d+DY-YRadSqr)*iCol div (XRadSqr+DX-YRadSqr+DY)+BCol;} { cc:=LongInt(d+DY)*iCol div (DX+DY)+BCol;} cc:=LongInt(DY+YRadSqr2+D)*iCol div (dx+dy+XRadSqr2+YRadSqr2)+BCol;lc2:=cc; PutPixel1(X+EX-1,Y+EY,cc); PutPixel1(X+EX-1,Y-EY,cc); PutPixel1(X-EX+1,Y+EY,cc); PutPixel1(X-EX+1,Y-EY,cc); end; cc:=LongInt(DX-d)*iCol div (DX+DY)+BCol; PutPixel1(X-YRad-1,Y,Cc); PutPixel1(X+YRad+1,Y,Cc); cc:=LongInt(d+DY)*iCol div (DX+DY)+BCol; PutPixel1(X-YRad+1,Y,Cc); PutPixel1(X+YRad-1,Y,Cc); end; Andrey ... Своя Hаташка ближе к телу. --- GoldED+/386 1.1.4.7 * Origin: Всёфигня кроме пчёл,хотя пчёлы,еслиподумать,тоже фигня (2:5002/46.4) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/143013c9b93fc.html, оценка из 5, голосов 10
|