Конференция "Media" » Как красиво ( без зазубрин ) нарисовать наклонную линию ? [D6, WinXP]
 
  • YuProhorov © (26.02.09 16:21) [0]
    Добрый день всем !

    Как красиво ( без зазубрин ) нарисовать наклонную линию ?

    Мне подсказали, что где-то в настройках надо установить флажек GDI Aliasing , но я ничего подобного не нашел.

    Помогите, пожалуйста нарисовать линию.

    Прохоров Юрий                         star716@mail.ru
  • Vetal (26.02.09 17:31) [1]
    Если с использованием GDI - то вручную, если с GDI+, то используя свойство объекта TGPGraphics.SetSmoothingMode.
  • MBo © (26.02.09 17:32) [2]
    Есть такой алгоритм Ву (Wu) рисования линий с антиалиасингом
  • DVM © (26.02.09 19:10) [3]
    Вот, только это сравнительно медленно:



    TYPE
     TFColor  = record b,g,r:Byte end;
     PFColor  =^TFColor;

    procedure SmoothLine(dc: HDC; x1, y1, x2, y2: Integer; c: TFColor);
    var
     dx,dy,d,s,ci,ea,ec: Integer;
     p: tFColor;
    begin
     if(y1=y2)or(x1=x2)then
     begin
       MoveToEx(dc, X1, Y1, nil);
       LineTo(dc, X2,y2);
     end
       else
     begin
       if y1>y2 then
       begin
         d:=y1; y1:=y2; y2:=d;
         d:=x1; x1:=x2; x2:=d;
       end;
       dx:=x2-x1;
       dy:=y2-y1;
       if dx>-1 then s:=1 else
       begin
         s:=-1;
         dx:=-dx;
       end;
       ec:=0;
       if dy>dx then
       begin
         ea:=(dx shl 16)div dy;
         while dy>1 do
         begin
           Dec(dy);
           d:=ec;
           Inc(ec,ea);
           ec:=ec and $FFFF;
           if ec<=d then Inc(x1,s);
           Inc(y1);
           ci:=ec shr 8;
           p.r:=GetRValue(GetPixel(DC,X1,Y1));
           p.g:=GetgValue(GetPixel(DC,X1,Y1));
           p.b:=GetbValue(GetPixel(DC,X1,Y1));
           p.b:=(p.b-c.b)*ci shr 8 + c.b;
           p.g:=(p.g-c.g)*ci shr 8 + c.g;
           p.r:=(p.r-c.r)*ci shr 8 + c.r;
           SetPixel(dc, x1, y1, Rgb(p.r, p.g, p.b));
           p.r:=GetRValue(GetPixel(DC,X1+s,Y1));
           p.g:=GetgValue(GetPixel(DC,X1+s,Y1));
           p.b:=GetbValue(GetPixel(DC,X1+s,Y1));
           p.b:=(c.b-p.b)*ci shr 8 + p.b;
           p.g:=(c.g-p.g)*ci shr 8 + p.g;
           p.r:=(c.r-p.r)*ci shr 8 + p.r;
           SetPixel(dc, x1+s, y1, Rgb(p.r, p.g, p.b));
         end;
       end else
       begin
         ea:=(dy shl 16)div dx;
         while dx>1 do
         begin
           Dec(dx);
           d:=ec;
           Inc(ec,ea);
           ec:=ec and $FFFF;
           if ec<=d then Inc(y1);
           Inc(x1,s);
           ci:=ec shr 8;
           p.r:=GetRValue(GetPixel(DC,X1,Y1));
           p.g:=GetgValue(GetPixel(DC,X1,Y1));
           p.b:=GetbValue(GetPixel(DC,X1,Y1));
           p.b:=(p.b-c.b)*ci shr 8 + c.b;
           p.g:=(p.g-c.g)*ci shr 8 + c.g;
           p.r:=(p.r-c.r)*ci shr 8 + c.r;
           SetPixel(dc, x1, y1, Rgb(p.r, p.g, p.b));
           p.r:=GetRValue(GetPixel(DC,X1,Y1+1));
           p.g:=GetgValue(GetPixel(DC,X1,Y1+1));
           p.b:=GetbValue(GetPixel(DC,X1,Y1+1));;
           p.b:=(c.b-p.b)*ci shr 8 + p.b;
           p.g:=(c.g-p.g)*ci shr 8 + p.g;
           p.r:=(c.r-p.r)*ci shr 8 + p.r;
           SetPixel(dc, x1, y1+1, Rgb(p.r, p.g, p.b));
         end;
       end;
     end;
    end;

  • DVM © (26.02.09 19:11) [4]
    Оптимизируешь сам. Там много чего можно улучшить.
  • antonn © (26.02.09 22:06) [5]

    > DVM ©  

    fastlib? :)
  • DVM © (27.02.09 00:56) [6]

    > antonn ©   (26.02.09 22:06) [5]


    > fastlib? :)

    Точно. Только это там оно было "Fast", здесь же из-за GetPixel/SetPixel совсем не фаст.
  • brother © (27.02.09 04:36) [7]
    > Точно. Только это там оно было "Fast", здесь же из-за GetPixel/SetPixel
    > совсем не фаст.

    оптимизация - домашнее задание автору топика ;)
  • Б (05.03.09 10:25) [8]
  • antonn © (08.03.09 00:36) [9]
    кстати, выше код - случайно не он? :)
  • Jeer © (17.03.09 18:22) [10]
    Без зазубрин нарисовать нельзя, можно только снизить их заметность.
 
Конференция "Media" » Как красиво ( без зазубрин ) нарисовать наклонную линию ? [D6, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.003]