![]() |
Punkte verbinden zu einem Polygon
Hallo!
Ich würde, nach dem ich hier lange umsonst experimentiert habe, gerne wissen wie ich Punkte auf dem Image per Druck auf einen Button zu einem Polygon verbinde. Wäre dankbar für Hilfe. Hier mein Versuch. Aber was das Verbinden der Punkte betrifft meckert er immer rum. Ich bin mir nicht im klaren mit welchem Befehl ich starten und enden soll, da die punkte ja nicht fest definiert sind sondern einfach so auf dem Image angeklickt werden. Wäre dankbar für Hilfe.
Delphi-Quellcode:
implementation
{$R *.dfm} var n,x,y,i:integer; xp,yp:array [1..30] of integer; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if button=mbleft then image1.Canvas.Rectangle(x-7,y-7,x+7,y+7); n:=n+1; xp[n]:=x; yp[n]:=y; end; procedure TForm1.Button1Click(Sender: TObject); begin for i:=1 to n do begin with image1.canvas do begin pen.color:=clblack; pen.Style:=pssolid; move to (xp,yp); line to (x1;y1); end; end; end. |
Re: Punkte verbinden zu einem Polygon
Zitat:
// und um die den Spaß zu verderben: Oh: Drawpolygon :) |
Re: Punkte verbinden zu einem Polygon
Erst mal auf TPoint und ein dynamisches Array umstellen. Zweitens gibt es eine Polygon-Methode von TCanvas. Drittens willst du wahrscheinlich eine Polyline malen (ebenfalls eine Methode von TCanvas). Der Unterschied ist das ein Polygon eine Flaeche ist und daher innen und aussen besitzt (entsprechend wird auch beim Malen der Innenbereich gefuellt). Eine Polyline ist nur ein Linienzug. Ein Polygon wird auch geschlossen, indem vom letzten zum ersten Punkt eine Verbindung impliziert wird.
Delphi-Quellcode:
implementation
{$R *.dfm} var N: integer; Points: array of TPoint; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if button = mbleft then image1.Canvas.Rectangle(x-7,y-7,x+7,y+7); n := n+1; SetLength(Points, n); Points[n-1].X := X; Points[n-1].Y := Y; end; procedure TForm1.Button1Click(Sender: TObject); begin image1.Canvas.Polygon(Points); end; end. |
Re: Punkte verbinden zu einem Polygon
Versuch's doch mal so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i : integer; begin with image1.canvas do begin pen.color:=clblack; pen.Style:=pssolid; moveto (xp [1], yp [1]) end; for i := 2 to n do lineto (xp [i], yp [i]); lineto (xp [1], yp [1]) end; |
Re: Punkte verbinden zu einem Polygon
Zitat:
Oder du benutzt kein N und machst es über Length(Points).
Delphi-Quellcode:
SetLength(Points, Length(Points) + 1);
Points[High(Points)].X := X; Points[High(Points)].Y := Y; |
Re: Punkte verbinden zu einem Polygon
danke für die hilfe.
an robert: jetzt verbindet er sie mir aber nicht komplett. das heißt er findet nicht zum ausgangspunkt zurück...? |
Re: Punkte verbinden zu einem Polygon
n muss man nicht auf 0 setzen, da es eine globale Variable ist. die wird automatisch beim Programmstart auf 0 gesetzt.
Hast du die Version mit Polyline oder mit Polygon benutzt? Ich habe das nochmal im Edit umgestellt gehabt.
Delphi-Quellcode:
Hier mal die getestete Version mit Polygon.
implementation
{$R *.dfm} var N: integer; Points: array of TPoint; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if button = mbleft then begin Image1.Canvas.Brush.Color := clBlack; Image1.Canvas.FrameRect(Rect(x-7, y-7, x+7, y+7)); n := n+1; SetLength(Points, n); Points[n-1].X := X; Points[n-1].Y := Y; end; end; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.FillRect(Rect(0, 0, Image1.Width, Image1.Height)); Image1.Canvas.Pen.Color := clBlue; Image1.Canvas.Brush.Color := clGreen; Image1.Canvas.Polygon(Points); Image1.Canvas.Brush.Color := clBlack; for I := 0 to Length(Points) - 1 do Image1.Canvas.FrameRect(Rect(Points[I].x-7,Points[I].y-7,Points[I].x+7,Points[I].y+7)); end; end. Verbesserungen: Farbe setzen, damit man sieht was bei einem Polygon innen und aussen ist. Trennung in Punkte setzen und Polygon malen. Beim Malen des Polygons wird das Image geloescht und die Punkte nach dem Polygon nochmals gemalt, damit sie vor dem Polygon erscheinen. Die Punkte werden nur als Umriss gemalt, damit man die Ecken des polygons nicht ueberdeckt. |
Re: Punkte verbinden zu einem Polygon
@robert!
du bist ja "gold"!!! :lol: Nur leider kann ich mit folgenden begriffen nicht so richtig umgehen: var N: integer; Points: array of TPoint; (was heißt dieses array of tpoint?) procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if button = mbleft then begin Image1.Canvas.Brush.Color := clBlack; Image1.Canvas.FrameRect(Rect(x-7, y-7, x+7, y+7)); (Frame Rect?) n := n+1; SetLength(Points, n); Points[n-1].X := X; Points[n-1].Y := Y; end; end; Tausend Dank! |
Re: Punkte verbinden zu einem Polygon
TPoint ist ein Typ aus der VCL-Unit Types. Es ist ein Record und enthaelt ein Paar von Integern X und Y. Sprich es beschreibt jeweils einen Punkt.
"array of" deklariert ein array variabler Laenge. SetLength() setzt diese Laenge. Der Index fuer die Elemente beginnt immer bei 0. FrameRect ist letztlich eine Windows-Funktion (Rectangle, Polyline und Polygon ebenfalls). Windows behandelt Malfunktionen als etwas das mit Pinsel (Brush) und Stift (Pen) gemalt wird. Linien werden mit dem Pen gemalt und Flaechen mit dem Brush ausgefuellt und mit dem Pen umrandet. FrameRect malt nur die Umrandung eines Rechtecks, nicht die Innenflaeche. Es gilt aber als Brush-Operation (das ist glaube ich ein Fehler in Delphi). Rectangle malt ein Rechteck als Flaeche, fuellt also den Innenraum mit dem Brush. Polygon malt einen Linienzug (Liste von Punkten) Polygon als Flaeche. Polyline malt einen Linienzug. Konsequenterweise daher nur mit dem Pen, denn es soll ja keine Flaeche sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr. |
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