Hallo,
zu der Frage, wo der Schnittpunkt ist, habe ich eine Lösung ausgearbeitet, die bewusst ohne Vektorrechnung auskommt und mit skalarer Algebra nachvollziehbar ist.
Dabei habe ich eine line von x1,y1 nach x2,y2.
Die senkrecte Linie darauf verläuft vom Clickpunkt x3,y3 nach x4,y4.
Wobei wie gesagt x4:=x3+(y2-y1); und y4:=y3-(x2-x1);
Der Schnittpunkt x,y berechnet sich nun so:
Delphi-Quellcode:
dxa:=x2-x1;
dya:=y2-y1;
dxb:=x4-x3;
dyb:=y4-y3;
x:=round(((y3-y1)*dxa*dxb+x1*dya*dxb-x3*dyb*dxa)/(dya*dxb-dyb*dxa));
if abs(dxa)>abs(dxb) then
y:=round(((x-x1)*dya+y1*dxa)/dxa)
else
y:=round(((x-x3)*dyb+y3*dxb)/dxb);
// die genauere Variante wird gewählt und /0 vermieden
Die Distanz vom Clickpunkt zur Geraden, die durch die line verläuft beträgt:
dist:=round(sqrt(sqr(x3-x)+sqr(y3-y)));
Mit der folgenden Bedingung kann noch abgefragt werden, ob die senkrechte Gerade die line trifft, oder ob der Schnittpunkt ausserhalb der Endpunkte liegt:
Delphi-Quellcode:
if not((((x<=x1)and(x>=x2))or((x>=x1)and(x<=x2)))
and (((y<=y1)and(y>=y2))or((y>=y1)and(y<=y2)))) then
dist:=-1;
Wenns Fragen gibt, nur her damit. Der code ist übrigens gut ausgetestet.
grüsse,
der flossinger