PointF in PolygonF

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
wennerer
Beiträge: 515
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

PointF in PolygonF

Beitrag von wennerer »

Hallo,
in einem anderem Beitrag hat Winni untenstehende Funktion gepostet.
siehe viewtopic.php?f=29&t=13252
Leider habe ich keine Ahnung wie man mit PointF umgeht bzw. wie man damit ein Polygon zeichnet.
Welches Package muss ich da benutzen und gibt es da irgendwo eine Wiki? Hab leider nichts gefunden.

Code: Alles auswählen

function PointInPoly(p : TPointF; const poly :  array of TPointF) : Boolean; 
var i,k : integer;

Begin
 result := false;
 k := High(poly);
 For i := 0 to high(poly) do begin
  if (
     ( ((poly[i].y <= p.y) and (p.y < poly[k].y)) or ((poly[k].y <= p.y) and (p.y < poly[i].y)) ) and
        (p.x < ((poly[k].x - poly[i].x) * (p.y - poly[i].y) / (poly[k].y - poly[i].y) + poly[i].x) )
     ) then result := not result;
  k := i
 end;
end;    



Viele Grüße
Bernd

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: PointF in PolygonF

Beitrag von Winni »

Hallo!

Polygone mit Integer Werten zeichnet der LCL Standard Canvas:

Code: Alles auswählen

procedure Polygon(const Points: array of TPoint);
Für Fließkomma Werte gibt es diverse Grafik-Bibliotheken.
Ich bevorzuge das BGRAbitmapPack u.a. vom Online Package Manager.

Code: Alles auswählen

uses ...... BGRABitmap, BGRADefaultBitmap,  BGRABitmapTypes;

Var Poly : arrayOfTPointF;   // = array of TPointF in  BGRABitmapTypes
     bmp : TBGRAbitmap;
.......
bmp := TBGRAbitmap.create (200,150, clAqua);
.....
bmp.DrawPolygonAntialias(Poly, cssBlack,0.5,cssRed) 
....

bmp.draw(Image1.Canvas,0,0,dmset);
bmp.free;
....

BGRA hat ein Tutorial mit ca. 20 Kapiteln:

https://wiki.freepascal.org/BGRABitmap_tutorial_1

Grüße
Winni

wennerer
Beiträge: 515
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: PointF in PolygonF

Beitrag von wennerer »

Danke,
da werd ich dann mal schmökern :D

Viele Grüße Bernd

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: PointF in PolygonF

Beitrag von Winni »

Hi!

Ich mal Dir als einfaches Beispiel mal nen Kreis mit der BGRABitmap.
Mit FliessKommaZahlen. Image1 muss auf der Form vorhanden sein.
Das geht viel einfacher, aber um Dir zu zeigen, wie man ein Polygon bastelt!

Code: Alles auswählen

uses ...... math, BGRABitmap, BGRADefaultBitmap,  BGRABitmapTypes;

Procedure TForm1.Circle;

const Deg2Rad = pi/180;
 
var Wi,radius : integer;
   Center : TPointF;
   sinus, cosinus : single;
  circle : arrayOfTpointF;
  i : integer;
  tmp : TBGRAbitmap;

begin
Wi :=  min(Image1.Width, Image1.height);
tmp := TBGRAbitmap.create (wi, wi, cssNavajoWhite);
radius := wi div 2;
center := PointF (radius, radius);
dec(radius);
setLength(circle, 360);
for i := 0 to 360 - 1 do
  begin
  sincos(i*deg2rad, sinus, cosinus);
  circle[i] := PointF (Cosinus*Radius, Sinus*Radius) + Center;
  end; // i
  tmp.DrawPolyGonAntiAlias(circle, cssBlack, 1.5, cssLawnGreen); 
Tmp.Draw((Image1.Canvas,0,0,true);
tmp.free;
end;
Viel Spaß!
Winni

wennerer
Beiträge: 515
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: PointF in PolygonF

Beitrag von wennerer »

Hallo Winni,
vielen Dank für dein Beispiel!!!

Viele Grüße
Bernd

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: PointF in PolygonF

Beitrag von Winni »

Hi!

Ich hab noch mal in meinen BGRA-Spielereien gewühlt.

In den BGRA Units findet man auch einem s/w Scanner, der Polygone produziert.
Der wird eigentlich benutzt, um die Glyphs der Fonts (sprich: Buchstaben, Zahlen, Zeichen)
in Vektor-Form zu erhalten, um dann zu rotieren, stretchen etc.

Ich "misshandle" diesen Scanner, um das Cheetah-Icon in allen möglichen Farben darzustellen.
Ich möchte das hier nicht verglichen haben mit z.B. der Umwandlung con Bitmaps in SVG in Inkscape -
die haben bis zu 32 Layer.

Nur um zu zeigen, was alles in den BGRA Units steckt.
Immer was Neues zu entdecken.

Source & Screenshot angehängt.

Winni
Dateianhänge
CheetahScan.zip
(168.97 KiB) 64-mal heruntergeladen
CheetahScan.png
CheetahScan.png (62.22 KiB) 1238 mal betrachtet

Antworten