Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Polygon schraffieren (ohne Canvas.Polygon) (https://www.delphipraxis.net/178179-polygon-schraffieren-ohne-canvas-polygon.html)

Neutral General 22. Dez 2013 17:38

AW: Polygon schraffieren (ohne Canvas.Polygon)
 
Ich denke mal das ist ihm klar, Er frag sich wahrscheinlich nur was der Sinn sein soll es so zu machen statt einfach Canvas.Polygon zu benutzen

Aphton 22. Dez 2013 21:00

AW: Polygon schraffieren (ohne Canvas.Polygon)
 
Die Antwort zu seiner Frage ist - man muss nicht die Schnittpunkte der Schraffurlinien mit dem Polygon berechnen. Man kann die Schraffur einfach auf die Schablone/Clipbereich draufmalen - ohne irgendwelche jeglichen Sorgen -- diese werden sich dann durchs Clipping im Polygon befinden!

Uwe Raabe 22. Dez 2013 22:32

AW: Polygon schraffieren (ohne Canvas.Polygon)
 
Um das nochmal zu verdeutlichen: wenn die Schraffur mit dem Brush.Style gemacht wird, kann man direkt Canvas Polygon verwenden. Will man die Schraffur direkt zeichnen, weil es die passende nicht gibt und einem die Erstellung einer Bitmap zu aufwändig ist (oder das Bild von der Oma als Schraffur herhalten soll), kann man das Clipping verwenden.

Bjoerk 22. Dez 2013 22:49

AW: Polygon schraffieren (ohne Canvas.Polygon)
 
Genauso so sieht's aus, Ihr habt vollkommen recht. :thumb:
Beispiel:

Delphi-Quellcode:
procedure HatchSolidDash(Canvas: TCanvas; const Polygon: array of TPoint;
  HatchColor: TColor; Frequency: integer);
var
  I, J: integer;
  ClipRgn: HRGN;
  CanvasWidth, CanvasHeight: integer;
begin
  ClipRgn := CreatePolygonRgn(Polygon[0], Length(Polygon), WINDING);
  try
    SelectClipRgn(Canvas.Handle, ClipRgn);
    CanvasWidth := Canvas.ClipRect.Right - Canvas.ClipRect.Left;
    CanvasHeight := Canvas.ClipRect.Bottom - Canvas.ClipRect.Top;
    Canvas.Pen.Color := HatchColor;
    Canvas.Pen.Width := 1;
    I := 0;
    J := 0;
    while (I < CanvasHeight) or (I < CanvasWidth) do
    begin
      Canvas.MoveTo(0, I * Frequency);
      Canvas.LineTo(I * Frequency, 0);
      Inc(I, Frequency);
      Inc(J);
      if Odd(J) then
        Canvas.Pen.Style := psSolid
      else
        Canvas.Pen.Style := psDash;
    end;
  finally
    DeleteObject(ClipRgn);
    SelectClipRgn(Canvas.Handle, 0);
  end;
end;

procedure TForm2.Button4Click(Sender: TObject);
var
  Points: array of TPoint;
begin
  SetLength(Points, 12);
  Points[0] := Point(100, 150);
  Points[1] := Point(200, 150);
  Points[2] := Point(250, 200);
  Points[3] := Point(200, 350);
  Points[4] := Point(100, 350);
  Points[5] := Point(50, 400);
  Points[6] := Point(400, 150);
  Points[7] := Point(500, 50);
  Points[8] := Point(55, 100);
  Points[9] := Point(500, 250);
  Points[10] := Point(400, 350);
  Points[11] := Point(350, 400);
  HatchSolidDash(Canvas, Points, clRed, 3);
  Canvas.Pen.Width := 1;
  Canvas.Brush.Style := bsClear;
  Canvas.Pen.Style := psSolid;
  Canvas.Pen.Color := clBlack;
  Canvas.Polygon(Points);
end;

Bjoerk 23. Dez 2013 14:08

AW: Polygon schraffieren (ohne Canvas.Polygon)
 
BTW, bei mir (D2007) macht er psDash, psDot und Co. nur bei Pen.Width 1. Ist das normal? :gruebel:

Uwe Raabe 23. Dez 2013 14:27

AW: Polygon schraffieren (ohne Canvas.Polygon)
 
Jupp! http://docwiki.embarcadero.com/RADSt...en_%C3%A4ndern

Zitat:

Anmerkung: Unter Windows werden breitere Strichstärken als 1 immer als durchgezogene Linien gezeichnet, unabhängig vom Wert der Eigenschaft Style.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 Uhr.
Seite 2 von 2     12   

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