![]() |
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 |
AW: Polygon - Punkte im Uhrzeigersinn
VCL oder FMX?
Sherlock |
AW: Polygon - Punkte im Uhrzeigersinn
|
AW: Polygon - Punkte im Uhrzeigersinn
Gaußsche Trapezformel sollte zum Ziel führen
|
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:
übergeben werden.
Canvas.Polygon
@Hannes Das muss ich mir mal genauer anschauen. @ibp Danke für den Tipp. |
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 |
AW: Polygon - Punkte im Uhrzeigersinn
Die Lösung war die Gaußsche Trapezformel.
Delphi-Quellcode:
Wenn Summe>0 dann Uhrzeigersinn, sonst Gegenuhrzeigersinn.
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); Gruß und Danke an alle! e-gon |
AW: Polygon - Punkte im Uhrzeigersinn
Zitat:
Sherlock |
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 |
AW: Polygon - Punkte im Uhrzeigersinn
Zitat:
Nimmt man z.B. ein Polygon, daß eine Acht bildet: Was ist denn da links/rechts rum? |
AW: Polygon - Punkte im Uhrzeigersinn
Zitat:
|
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:
Wenn das globake KOO so ist, und die Tür in X-Z Ebene liegt dann wäre PlaneAlign paPlusY oder paMinusY.
Z
| | /Y -/-------X Kannst ja mal probieren? LG Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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 by Thomas Breitkreuz