Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Polygon - Punkte im Uhrzeigersinn (https://www.delphipraxis.net/193594-polygon-punkte-im-uhrzeigersinn.html)

e-gon 18. Aug 2017 10:35

Polygon - Punkte im Uhrzeigersinn
 
Hallo!

Im Moment versuche ich mich an einem Raumskizzenprogramm. Zunächst gibt der Benutzer die Eckpunkte eines Raumes per Mausklick an, woraus dann ein Polygon erstellt wird. Anschließend kann man an den Wänden per Klick Fenster und Türen einfügen. Ansich funktioniert auch alles, allerdings müssen für die Türen die Punkte des Polygons im Uhrzeigersinn gegeben sein, weil die Türen sonst nach Außen statt nach Innen zeigen.

Gibt es eine einfache Möglichkeit herauszufinden, ob die Punkte im Uhrzeigersinn oder entgegen erstellt wurden? Kann mir jemand ein Stichwort dafür nennen wonach ich da suchen muss? Ich finde einfach nichts dazu...

Gruß
e-gon

Sherlock 18. Aug 2017 10:48

AW: Polygon - Punkte im Uhrzeigersinn
 
VCL oder FMX?

Sherlock

hstreicher 18. Aug 2017 11:35

AW: Polygon - Punkte im Uhrzeigersinn
 
evtl hilf das weiter , ganz unten

http://www.matheboard.de/archive/419771/thread.html

mfg Hannes

ibp 18. Aug 2017 11:43

AW: Polygon - Punkte im Uhrzeigersinn
 
Gaußsche Trapezformel sollte zum Ziel führen

e-gon 18. Aug 2017 11:48

AW: Polygon - Punkte im Uhrzeigersinn
 
@Sherlock
Ich verstehe die Frage nicht. Die Punkte liegen als dynamisches Array von Points vor, die der Funktion
Delphi-Quellcode:
Canvas.Polygon
übergeben werden.

@Hannes
Das muss ich mir mal genauer anschauen.

@ibp
Danke für den Tipp.

himitsu 18. Aug 2017 12:31

AW: Polygon - Punkte im Uhrzeigersinn
 
Hätte einfach gedacht
* Mittelpunkt berechnen
* Winkel des des jeweils ersten und zweiten Punktes vom Mittelpunkt aus berechnen
* Differenz der beiten Winkel
* wenn 0-180° dann sorum und ansonsten andersrum

e-gon 18. Aug 2017 12:45

AW: Polygon - Punkte im Uhrzeigersinn
 
Die Lösung war die Gaußsche Trapezformel.

Delphi-Quellcode:
var
  P: Array of TPoint;
  n,i: Word;
  Summe: Extended;

...

Summe:= 0;
n:= Length(P);
for i:= 0 to n-1 do Summe:= Summe+(P[i].Y+P[(i+1) mod n].Y)*(P[i].X+P[(i+1) mod n].X);
Wenn Summe>0 dann Uhrzeigersinn, sonst Gegenuhrzeigersinn.

Gruß und Danke an alle!
e-gon

Sherlock 18. Aug 2017 13:27

AW: Polygon - Punkte im Uhrzeigersinn
 
Zitat:

Zitat von e-gon (Beitrag 1378983)
@Sherlock
Ich verstehe die Frage nicht. Die Punkte liegen als dynamisches Array von Points vor, die der Funktion
Delphi-Quellcode:
Canvas.Polygon
übergeben werden.

FMX liefert einiges mit, daß bei der Arbeit mit 3D-Objekten hilft. VCL... nicht so sehr, wie du siehst. Das ist alles worauf meine Frage hinaus wollte.

Sherlock

Rollo62 18. Aug 2017 14:15

AW: Polygon - Punkte im Uhrzeigersinn
 
Die Frage wäre vielleicht auch ob sich die Polygone selbst schneiden und zerteilen, oder nicht.
Bei so komplexen Polygonen kann es ganz schön unübersichtlich werden.
Funktioniert die Gaußsche Formel da auch noch 100% sicher ?

Rollo

Uwe Raabe 18. Aug 2017 14:23

AW: Polygon - Punkte im Uhrzeigersinn
 
Zitat:

Zitat von Rollo62 (Beitrag 1379004)
Die Frage wäre vielleicht auch ob sich die Polygone selbst schneiden und zerteilen, oder nicht.
Bei so komplexen Polygonen kann es ganz schön unübersichtlich werden.
Funktioniert die Gaußsche Formel da auch noch 100% sicher ?

Solange die Definition von rechts/links mit Flache > 0 oder < 0 definiert ist, funktioniert das schon.

Nimmt man z.B. ein Polygon, daß eine Acht bildet: Was ist denn da links/rechts rum?

Jens01 18. Aug 2017 16:30

AW: Polygon - Punkte im Uhrzeigersinn
 
Zitat:

Nimmt man z.B. ein Polygon, daß eine Acht bildet: Was ist denn da links/rechts rum?
Bei Räumen wäre sowas schlecht. Vllt sollte man das Polygon vorher auf einen Überschlag prüfen.

Bjoerk 18. Aug 2017 17:34

AW: Polygon - Punkte im Uhrzeigersinn
 
Für meinem Polyeder hatte ich mir das überlegt. Ich verwende es nicht, aber wenn ich noch recht erinnere, funktioniert das nur, wenn die Ebenen parallel einer globalen Bezugsebene liegen.

Das sollte bei deiner Tür aber der Fall sein.

Prüfen tut man drei aufeinanderfolgende Punkte. Wenn die Tür 4 Punkte hat dann (P1, P2, P3), (P2, P3, P4), (P3, P4, P1) und (P4, P1, P2) prüfen. Alle müssen Counterclockwise sein.

Delphi-Quellcode:
function TPolyeder.Counterclockwise(const A, B, C: integer;
  const Align: TPlaneAlign): boolean;
var
  AB, AC, N, E: TPolyederPoint;
begin
  AB.X := FPoints[B].X - FPoints[A].X;
  AB.Y := FPoints[B].Y - FPoints[A].Y;
  AB.Z := FPoints[B].Z - FPoints[A].Z;
  AC.X := FPoints[C].X - FPoints[A].X;
  AC.Y := FPoints[C].Y - FPoints[A].Y;
  AC.Z := FPoints[C].Z - FPoints[A].Z;
  N.X := AB.Y * AC.Z - AB.Z * AC.Y; // PlaneNormal
  N.Y := AB.Z * AC.X - AB.X * AC.Z; // ..
  N.Z := AB.X * AC.Y - AB.Y * AC.X; // ..
  E.X := 0;
  E.Y := 0;
  E.Z := 0;
  case Align of
    paPlusX: E.X := 1;
    paPlusY: E.Y := 1;
    paPlusZ: E.Z := 1;
    paMinusX: E.X := -1;
    paMinusY: E.Y := -1;
    paMinusZ: E.Z := -1;
  end;
  if (E.X * N.X < 0) or (E.Y * N.Y < 0) or (E.Z * N.Z < 0) then
    Result := false
  else
    Result := true;
end;
Code:
 Z
 |
 | /Y
-/-------X
Wenn das globake KOO so ist, und die Tür in X-Z Ebene liegt dann wäre PlaneAlign paPlusY oder paMinusY.

Kannst ja mal probieren?

LG Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 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