Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Graphics32 Zeichne Polygon mit größerer Linienbreite (https://www.delphipraxis.net/184027-graphics32-zeichne-polygon-mit-groesserer-linienbreite.html)

Jakson 20. Feb 2015 09:48

Graphics32 Zeichne Polygon mit größerer Linienbreite
 
Nachdem ich mich durch etliche Internet Seiten und Foren gekämpft habe um herauszufinden wie man mit Graphics32 eine Linie zeichnen kann die nicht nur einen Pixel breit ist will ich euch nun das Ergebnis präsentieren.

Standardmäßig unterstützt Graphics32 keine andere Linienbreite als 1!
Benötigt man trotzdem eine breitere Linie so muss man mehrere nebeneinander zeichnen oder die Klasse TPolygon32 bemühen und die gewünschte Linie damit zu verbreitern.

Um die Arbeit zu erleichtern hab ich dafür eine abgeleitete klasse erstellt.
Delphi-Quellcode:
type
 TPolygon32_LineWidth = class(TPolygon32)
 public
   procedure DrawLineXS(Bitmap:TCustomBitmap32;LineWidth:Byte;Color:TColor32;Closed:Boolean);
   procedure DrawLineXSP(Bitmap:TCustomBitmap32;LineWidth:Byte;Closed:Boolean);
 end;

{ TPolygon32_LineWidth }

procedure TPolygon32_LineWidth.DrawLineXS(Bitmap:TCustomBitmap32;LineWidth:Byte;Color:TColor32;Closed:Boolean);
var PolygonOutl,
    PolygonGrow : TPolygon32;
begin
 if LineWidth <= 1
  then PolyPolylineXS(Bitmap,Points,Color,Closed)
  else begin
   Self.Closed := Closed;
   Antialiased := True;
   PolygonOutl := Outline;
   PolygonGrow := PolygonOutl.Grow(Fixed(LineWidth/2));
   try
    PolygonGrow.FillMode := pfWinding;
    PolygonGrow.DrawFill(Bitmap,Color);
   finally
    PolygonGrow.Free;
    PolygonOutl.Free;
   end;
  end;
end;

procedure TPolygon32_LineWidth.DrawLineXSP(Bitmap:TCustomBitmap32;LineWidth:Byte;Closed:Boolean);
var Count1,
    Count2,
    NextNr,
    CountLine,
    Multy,
    DeltaX,
    DeltaY       : Integer;
    Strippl_Start : Extended;
begin
 if LineWidth <= 1
  then PolyPolylineXSP(Bitmap,Points,Closed)
  else begin
   Self.Closed := Closed;
   BuildNormals;
   if Assigned(Points) then
    for Count1 := 0 to High(Points) do
     begin
      if Length(Points[Count1]) > 1 then
       for Count2 := 0 to High(Points[Count1]) do
        begin
         NextNr := Count2+1;
         if Count2 >= High(Points[Count1]) then
          if Closed
           then NextNr := 0
           else Break;          
           
         Strippl_Start := Bitmap.StippleCounter;
         Bitmap.LineXSP(Points[Count1][Count2].X,Points[Count1][Count2].Y,Points[Count1][NextNr].X,Points[Count1][NextNr].Y);

         for CountLine := 0 to LineWidth-2 do
          begin
           Bitmap.StippleCounter := Strippl_Start;
           if Odd(CountLine)
            then Multy := (CountLine DIV 2)+1
            else Multy := (CountLine DIV 2)+1 * -1;

           DeltaX := Normals[Count1][Count2].X * Multy;
           DeltaY := Normals[Count1][Count2].Y * Multy;
           Bitmap.LineXSP(Points[Count1][Count2].X+DeltaX,Points[Count1][Count2].Y+DeltaY,Points[Count1][NextNr].X+DeltaX,Points[Count1][NextNr].Y+DeltaY);
          end;
        end;
     end;
  end;
end;

Jens01 20. Feb 2015 12:23

AW: Graphics32 Zeichne Polygon mit größerer Linienbreite
 
Text und Linien
Davon gibt es auch schon neuere Versionen

Jakson 20. Feb 2015 12:30

AW: Graphics32 Zeichne Polygon mit größerer Linienbreite
 
Danke damit hat sich das erledigt. Die mühe hät ich mir sparen können.

Hab zwar gesucht aber genau die Seite nicht gefunden. :?

Jens01 20. Feb 2015 12:34

AW: Graphics32 Zeichne Polygon mit größerer Linienbreite
 
Die Seite gibt es auch nicht mehr. Das ist so ein absichtlich verwaister Link.
Es wird auch so sein, dass die Lib mit neueren GR32-Versionen nicht funktioniert. In dieser Newsgroup auf graphics32.org gibt es aber von einem Teilnehmer ein Patch, welches die Lib kompatibel macht.

Jens01 20. Feb 2015 12:39

AW: Graphics32 Zeichne Polygon mit größerer Linienbreite
 
Übrigens, ich habe da eine neuere Version, die mit den aktuelleren Funktionen von GR32 arbeitet. Die Version kann aber nicht alles das, was TLines32/TText32 kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz