![]() |
Punkt in Dreieck?
Liste der Anhänge anzeigen (Anzahl: 1)
Da ich mich zur Zeit eh in Mathe mit Vektoren herumschlagen muss, wollte ich gleich was nützliches machen :nerd:
Mit dem folgenden Code kann man herausfinden, ob ein Punkt in einem Dreieck liegt:
Delphi-Quellcode:
function pointInTriangle( x, y,
triangleX1, triangleY1, triangleX2, triangleY2, triangleX3, triangleY3: double): boolean; var a, b: double; begin // change points to vectors // (triangleX1|triangleY1) is position vectors // the rest are direction vectors triangleX3 := triangleX3 - triangleX2; triangleY3 := triangleY3 - triangleY2; triangleX2 := triangleX2 - triangleX1; triangleY2 := triangleY2 - triangleY1; x := x - triangleX1; y := y - triangleY1; // Check if (triangleY3*triangleX2-triangleX3*triangleY2) is 0 to prevent dividing by 0 // If you are sure that your input is a triangle, you could remove it. if not (abs(triangleY3*triangleX2-triangleX3*triangleY2)>0) then begin result := false; exit; end; // calculate for which a and b //-> (x|y) = a*(triangleX2|triangleY2) + b(triangleX3|triangleY3) is true b := (y*triangleX2-x*triangleY2) /(triangleY3*triangleX2-triangleX3*triangleY2); if triangleX2 <> 0 then begin a := (x-b*triangleX3)/triangleX2; end else begin a := (y*triangleX3-x*triangleY3) /(triangleY2*triangleX3-triangleX2*triangleY3); end; // a will be smaller then 1 and // bigger than/equal to b being being bigger than/equal to 0 // if the point is in the triangle. result := not((a>1) or (a<b) or (b<0)); end; Wichtig: Die Funktion kann sollte nur angewendet werden, wenn das "Dreieck" auch wirklich eines ist, d.h. die drei Dreiecks-Punkte dürfen nicht alle drei auf einer Geraden liegen., ansonsten ist eine Division durch Null vorprogrammiert. Aus Gründen der Übersicht wurde auf diese Überprüfung verzichtet! Eine Demoanwendung (o.g. Fehler tritt noch auf) mit Source liegt bei, klicke um 3mal um das Dreieck festzulegen. Viel Spaß damit! MfG, Bug |
Re: Punkt in Dreieck?
Ich will Deine Leistung nicht schmälern, aber wäre das mit einer Region nicht auch gegangen?
|
Re: Punkt in Dreieck?
Bei den meisten Anwendungsfällen schon, aber IMHO gibt es Regionen nur mit Ganzzahlen.
MfG, Bug |
Re: Punkt in Dreieck?
Zitat:
Verwunderte Grüsse Thorsten |
Re: Punkt in Dreieck?
Zitat:
![]() Aber im Ernst, die angehängte Anwendung ist nur ein Beispiel, es sollte die Problematik nicht auf die Pixel festnageln. Es ist ja nicht so, als würde die ganze Welt aus Pixeln bestehen. (Oder doch :drunken: ) MfG, Bug |
Re: Punkt in Dreieck?
Kann z.B. dann nützlich sein wenn man programmintern mit einer anderen Auflösung rechnet als letzten Endes auf dem Bildschirm erscheint. Davon einmal abgesehen: Optimal wäre der Code wenn noch ein kurzer Kommentar den mathematischen Hintergrund kurz erklärt. So in etwa "Der Punkt liegt innerhalb des Dreieck wenn ... und ... gegeben sind..." - nix wildes, aber eine ganz kurze Beschreibung. Darauf hat mich der Kommentar zu Hypot() in Math.pas gebracht. Dort steht zwar eine in Assembler geschriebene Funktion, aber auch die zugrundeliegende mathematische Formel und eine Pascal-Implementation dazu als Kommentar.
|
Re: Punkt in Dreieck?
zwei punkte fallen wir mal kurz auf, zum einen solltest du den typ TPunkt verwenden und damit die einzelkoordninaten zusammenliegen, zum zweiten, sollte deine routine solche kleinigkeiten wie 'n DIV/0 abfangen...
|
Re: Punkt in Dreieck?
[quote="BUG"]
Zitat:
![]() |
Re: Punkt in Dreieck?
Meinst du:
Delphi-Quellcode:
Dann wäre das Merkmal Gleitkommazahlen weg -> man könnte auch Regionen nehmen.
type TPoint = record
X: Longint; // also nicht double Y: Longint; // also nicht double end; Und nur für einen Funktionsaufruf einen eigenen Typen zu basteln, finde ich eigentlich übertrieben. Die Division durch Null tritt nur aus, wenn alle Dreieckspunkte auf einer Linie liegen, aber ok, ich werde noch eine Überprüfung einbauen. @OldGrumpy Jup, wäre schön ...
Behauptungen 1 & 2 sind ja auch noch logisch, wenn die Beträge der Vektoren gleich der der Länge der entsprechenden Strecke ist. Aber bei Behauptung 4 war eine Vermutung meinerseits, die für die ich aber (heute/23:50) noch keine Begründung ausformulieren kann. MfG, Bug |
Re: Punkt in Dreieck?
Zitat:
für die skalierung, ist ja sowieso der user resp. der programmierer zuständig. und IMHO ist mir eine schöne routine erheblich lieber, als eine, welche (aufgrund des datentyps) sowieso nicht genau sein kann. noch 'n schönen abend GG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 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