Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Нарисовать линию без зазубринок

Delphi , Графика и Игры , Canvas

Нарисовать линию без зазубринок

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
 This code draws an anti-aliased line on a bitmap 
 This means that the line is not jagged like the 
 lines drawn using the LineTo() function 
}

 uses
   Graphics, Windows;

 type
   TRGBTripleArray = array[0..1000] of TRGBTriple;
   PRGBTripleArray = ^TRGBTripleArray;

 // anti-aliased line 
procedure WuLine(ABitmap : TBitmap ; Point1, Point2 : TPoint ; AColor : TColor);
 var
   deltax, deltay, loop, start, finish : integer;
   dx, dy, dydx : single; // fractional parts 
  LR, LG, LB : byte;
   x1, x2, y1, y2 : integer;
 begin
   x1 := Point1.X; y1 := Point1.Y;
   x2 := Point2.X; y2 := Point2.Y;
   deltax := abs(x2 - x1); // Calculate deltax and deltay for initialisation 
  deltay := abs(y2 - y1);
   if (deltax = 0) or (deltay = 0) then begin // straight lines 
    ABitmap.Canvas.Pen.Color := AColor;
     ABitmap.Canvas.MoveTo(x1, y1);
     ABitmap.Canvas.LineTo(x2, y2);
     exit;
   end;
   LR := (AColor and $000000FF);
   LG := (AColor and $0000FF00) shr 8;
   LB := (AColor and $00FF0000) shr 16;
   if deltax > deltay then
   begin // horizontal or vertical 
    if y2 > y1 then // determine rise and run 
      dydx := -(deltay / deltax)
     else
       dydx := deltay / deltax;
     if x2 < x1 then
     begin
       start := x2; // right to left 
      finish := x1;
       dy := y2;
     end else
     begin
       start := x1; // left to right 
      finish := x2;
       dy := y1;
       dydx := -dydx; // inverse slope 
    end;
     for loop := start to finish do
     begin
       AlphaBlendPixel(ABitmap, loop, trunc(dy), LR, LG, LB, 1 - frac(dy));
       AlphaBlendPixel(ABitmap, loop, trunc(dy) + 1, LR, LG, LB, frac(dy));
       dy := dy + dydx; // next point 
    end;
   end else
   begin
     if x2 > x1 then // determine rise and run 
      dydx := -(deltax / deltay)
     else
       dydx := deltax / deltay;
     if y2 < y1 then
     begin
       start := y2; // right to left 
      finish := y1;
       dx := x2;
     end else
     begin
       start := y1; // left to right 
      finish := y2;
       dx := x1;
       dydx := -dydx; // inverse slope 
    end;
     for loop := start to finish do
     begin
       AlphaBlendPixel(ABitmap, trunc(dx), loop, LR, LG, LB, 1 - frac(dx));
       AlphaBlendPixel(ABitmap, trunc(dx) + 1, loop, LR, LG, LB, frac(dx));
       dx := dx + dydx; // next point 
    end;
   end;
 end;

 // blend a pixel with the current colour 
procedure AlphaBlendPixel(ABitmap : TBitmap ; X, Y : integer ; R, G, B : byte ; ARatio : Real);
 Var
   LBack, LNew : TRGBTriple;
   LMinusRatio : Real;
   LScan : PRGBTripleArray;
 begin
   if (X < 0) or (X > ABitmap.Width - 1) or (Y < 0) or (Y > ABitmap.Height - 1) then
     Exit; // clipping 
  LScan := ABitmap.Scanline[Y];
   LMinusRatio := 1 - ARatio;
   LBack := LScan[X];
   LNew.rgbtBlue := round(B*ARatio + LBack.rgbtBlue*LMinusRatio);
   LNew.rgbtGreen := round(G*ARatio + LBack.rgbtGreen*LMinusRatio);
   LNew.rgbtRed := round(R*ARatio + LBack.rgbtRed*LMinusRatio);
   LScan[X] := LNew;
 end;

Программный код на языке Delphi, который рисует анти-алиасированную линию на битмапе с помощью алгоритма Брезенхэма, простым и эффективным методом для рисования линий без застропов.

Вот разбивка кода:

  1. Процедура WuLine принимает три параметра: ABitmap, Point1 и Point2 (которые представляют начальные и конечные точки линии), а также AColor (который является цветом линии). Она вычисляет начальную величину для линии, включая делта x и делта y, которые используются для определения склонности линии.
  2. Код затем проверяет, горизонтальна или вертикальна линия, и корректирует склонность соответственно.
  3. Для каждого точки на линии он вызывает процедуру AlphaBlendPixel для смешивания пикселя с текущим цветом. Эта процедура принимает пять параметров: ABitmap, X и Y (которые представляют координаты пикселя), R, G и B (которые являются красной, зелёной и синей компонентами цвета), а также ARatio (который является значением между 0 и 1, которое представляет альфа-коэффициент).
  4. Процедура AlphaBlendPixel смешивает пиксель с текущим цветом, вычисляя новые RGB-значения с помощью альфа-коэффициента. Затем она устанавливает соответствующий пиксел в битмапе в новые RGB-значения.
  5. Наконец, код вызывает процедуру AlphaBlendPixel для каждого точки на линии, эффективно рисуя анти-алиасированную линию.

Пример использования этого кода:

var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    WuLine(Bmp, Point(10, 20), Point(30, 40), clRed);
    // ... и т.д.
  finally
    Bmp.Free;
  end;
end.

В этом примере создается объект TBitmap и вызывается процедура WuLine, чтобы рисовать красную линию от (10, 20) до (30, 40). Вы можете изменять координаты и цвет в соответствии с вашими потребностями.

Для улучшения этого кода есть несколько предложений:

  • Рассмотрите добавление обработки ошибок для случаев, когда входные точки являются недопустимыми (например, вне битмапа).
  • Вы также можете добавить поддержку рисования линий с различными толщинами или стилями.
  • Если вы работаете с высокоразрешенными битмапами, вам может потребоваться более эффективный алгоритм для рисования анти-алиасированных линий.

В целом, это хороший пример рисования анти-алиасированной линии в Delphi с помощью алгоритма Брезенхэма. С некоторыми модификациями и добавлениями он может быть даже более полезным для вашей конкретной задачи!

Нарисовать линию без зазубринок, используя алгоритм Ву для антиалиасинга и функцию AlphaBlendPixel для смешивания пикселей.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Canvas ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 23:41:43/0.0037930011749268/0