AGB  ·  Datenschutz  ·  Impressum  







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

Punkt in Dreieck?

Ein Thema von BUG · begonnen am 25. Mai 2008 · letzter Beitrag vom 26. Mai 2008
 
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#1

Punkt in Dreieck?

  Alt 25. Mai 2008, 20:42
Da ich mich zur Zeit eh in Mathe mit Vektoren herumschlagen muss, wollte ich gleich was nützliches machen

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
Angehängte Dateien
Dateityp: zip pointintriangle_123.zip (98,8 KB, 16x aufgerufen)
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
 


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 23:18 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