AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Punkte verbinden zu einem Polygon

Ein Thema von schnuppe · begonnen am 19. Apr 2007 · letzter Beitrag vom 19. Apr 2007
Antwort Antwort
schnuppe

Registriert seit: 19. Apr 2007
6 Beiträge
 
#1

Punkte verbinden zu einem Polygon

  Alt 19. Apr 2007, 11:10
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.
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Punkte verbinden zu einem Polygon

  Alt 19. Apr 2007, 11:27
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
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

Re: Punkte verbinden zu einem Polygon

  Alt 19. Apr 2007, 11:30
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.
  Mit Zitat antworten Zitat
DelphiKlaus

Registriert seit: 18. Okt 2006
100 Beiträge
 
Delphi 6 Professional
 
#4

Re: Punkte verbinden zu einem Polygon

  Alt 19. Apr 2007, 11:35
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;
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Punkte verbinden zu einem Polygon

  Alt 19. Apr 2007, 11:40
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;
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
schnuppe

Registriert seit: 19. Apr 2007
6 Beiträge
 
#6

Re: Punkte verbinden zu einem Polygon

  Alt 19. Apr 2007, 11:44
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...?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

Re: Punkte verbinden zu einem Polygon

  Alt 19. Apr 2007, 12:24
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.
  Mit Zitat antworten Zitat
schnuppe

Registriert seit: 19. Apr 2007
6 Beiträge
 
#8

Re: Punkte verbinden zu einem Polygon

  Alt 19. Apr 2007, 12:30
@robert!

du bist ja "gold"!!!

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!
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Punkte verbinden zu einem Polygon

  Alt 19. Apr 2007, 12:50
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 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