|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Maxim Lanovoy 2:463/1124.6 18 Jun 2003 20:58:52 To : Andry Chyiko Subject : помогите, это пpосто! :) -------------------------------------------------------------------------------- YB>> Hаpисyйте лиHию плиз.. YB>> !!! только точками Hадо pисовать а Hе фyHкцией LineTo :-) AC> в школу ходи. [...] AC> for x := 10 to 100 do AC> PutPixel(x, 2.11111*x - 11.11111); AC> сделано по памяти, за ошибки не пинать. но имхо все верно AC> 2Юра Балык: читай книжки - они руль. Тебе бы это тоже не помешало. Во-первых, как ты себе представлешь отрисовку строго вертикальных линий (x=a), во-вторых, в твоем алгоритме много вычислений можно вынести за цикл: float k = (float)(y2-y1)/(float)(x2-x1); y=y1; for(x=x1; x<=x2; x++) { putpixel(x,y); y=y+k; } В-третьих, есть куда более быстрые инкрементные алгоритмы. Hапример, алгоритм Брезенхейма и его модификации. 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); } } } Паскаль: Procedure Line(SX,SY,EX,EY:Integer); Var t,dist,Xerr,Yerr,DX,DY,INCX,INCY:Integer; Begin Xerr:=0; Yerr:=0; DX:=EX-SX; DY:=EY-SY; INCX:=1; INCY:=1; if DX=0 then INCX:=0; if DX<0then INCX:=-1; if DY=0 then INCY:=0; if DY<0then INCY:=-1; DX:=ABS(DX); DY:=ABS(DY); if DX>DYThen Dist:=DX; else Dist:=DY; Xerr:=DX; Yerr:=DY; for t:=0 to dist do begin PutPixel(Sx,Sy,Color); Xerr:=Xerr+DX; Yerr:=Yerr+DY; if Xerr>Distthen begin Xerr:=Xerr-dist; Sx:=Sx+INCX; end; if Yerr>Distthen begin Yerr:=Yerr-dist; Sy:=Sy+INCY; end; end; End; WBR, Максим Лановой mailto: lanovoy(_эт_)ln.ua --- ... * Origin: Qui non est nobiscum, adversus non est (2:463/1124.6) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/33223ef0d4ad.html, оценка из 5, голосов 10
|