Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Punkte verbinden zu einem Polygon (https://www.delphipraxis.net/90546-punkte-verbinden-zu-einem-polygon.html)

schnuppe 19. Apr 2007 11:10


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.

Nikolas 19. Apr 2007 11:27

Re: Punkte verbinden zu einem Polygon
 
Zitat:

pen.Style:=pssolid;
move to (xp,yp);
line to (x1;y1);
Warum schaust du nicht einfach in die OH? Einfach kurz moveto eingeben, markieren, F1 drücken, und sehen, dass deine Syntax zwar nett klingt, aber falsch ist. (kennst du einen Befehl, bei dem Einfach so ein (x,y) alleine im Raum steht??)

// und um die den Spaß zu verderben: Oh: Drawpolygon :)

Robert Marquardt 19. Apr 2007 11:30

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.

DelphiKlaus 19. Apr 2007 11:35

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;

xZise 19. Apr 2007 11:40

Re: Punkte verbinden zu einem Polygon
 
Zitat:

Zitat von Robert Marquardt
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.

Wichtig! Im Create (doppelklick auf die Form) "N" auf 0 setzen!
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;

schnuppe 19. Apr 2007 11:44

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...?

Robert Marquardt 19. Apr 2007 12:24

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:
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.
Hier mal die getestete Version mit Polygon.
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.

schnuppe 19. Apr 2007 12:30

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!

Robert Marquardt 19. Apr 2007 12:50

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