Главная страница


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адеюсь, кто-нибудь поможет.
 самом деле это делается немного иначе
 немного кривоватая реализация, но суть та же:
 цвет соседних с линией точек вычисляется по пормуле от граничных точек.
 ..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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 линии   Sergey Khabarov   20 Mar 2002 17:35:06 
 линии   Andrei Novikov   25 Mar 2002 16:23:57 
 линии   Andrey Dashkovsky   22 Mar 2002 21:19:23 
 Re: линии   Alexey Kudrin   27 Mar 2002 00:00:20 
 Re: линии   Andrey Tarasevich   27 Mar 2002 04:31:22 
 Re: линии   Alexey Kudrin   27 Mar 2002 20:00:09 
 Re: линии   Valentin Davydov   29 Mar 2002 09:28:02 
Архивное /ru.algorithms/143013c9b93fc.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional