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