Hi!
Hey, vielen vielen Dank nochmal an
dfried für die beiden Links
. Ich hab so diese Seite gefunden :
Schnittpunk berechnen. Ein Freund hat mir geholfen die für mich völlig unverständlichen Matrizen-Funktion zu übersetzen. Mein neuestes Programm das ich am schreiben bin ist dadurch wahnsinnig viel schneller geworden und braucht endlich keinen virtuellen Speicher mehr!
Herausgekommen ist dabei diese kompakte Funktion:
Delphi-Quellcode:
{
Diese Funktion berechnet den Schnittpunkt von Line A
und Linie B. Haben beide Linien keinen Schnittpunkt
dann ist das Ergebnis 'false', sonst werden die
Koordinaten des Schnittpunktes in den Var-Paramtern X
und Y zurückgegeben und das Ergebnis ist 'true'
}
Function CrossingPoint(AX1,AY1,AX2,AY2, BX1,BY1,BX2,BY2:Integer; Var X,Y:Integer):Boolean;
Var
T,S,N:Extended;
Begin
Result:=false;
// Nenner berechnen (Matrize)
N:=AX1*BY2 + BX2*AY2 + AX2*BY1 + BX1*AY1 - BX2*AY1 - AX1*BY1 - BX1*AY2 - AX2*BY2;
// Möglicherweise Abruch wegen Divison durch Null
If N=0 then Exit;
// T berechnen (Matrize)
T:=(AX1*AY2 + AX2*BY1 + BX1*AY1 - AX2*AY1 - BX1*AY2 - AX1*BY1) / N;
// Wenn T nicht im Intervall [0,1] liegt dann haben
// beide Linien keinen Schnittpunkt
If (T<0) or (T>1) then Exit;
// S berechnen (Matrize)
S:=(AX1*BY2 + BX2*BY1 + BX1*AY1 - BX2*AY1 - BX1*BY2 - AX1*BY1) / N;
// Wenn S nicht im Intervall [0,1] liegt dann haben
// beide Linien keinen Schnittpunkt
If (S<0) or (S>1) then Exit;
// Berechnung mit T
X:=Round(BX1+T*(BX2-BX1));
Y:=Round(BY1+T*(BY2-BY1));
// Berechnung mit S
// X:=Round(AX1+S*(AX2-AX1));
// Y:=Round(AY1+S*(AY2-AY1));
Result:=true;
End;
Wenn, wie in meinem Programm, definitiv fest steht das sich beide Linien kreuzen dann gehts noch einfacher und schneller:
Delphi-Quellcode:
{
Diese Prozedur berechnet den Schnittpunkt von Line A
und Linie B. Haben beide Linien keinen Schnittpunkt
dann ergeben X und Y den Punkt an dem sich
beide Linien überschneiden würden, wenn man sie
entsprechend verlängert!
}
Procedure CrossingPointQuick(AX1,AY1,AX2,AY2, BX1,BY1,BX2,BY2:Integer; Var X,Y:Integer);
Var
T,N:Extended;
Begin
// Nenner berechnen (Matrize)
N:=AX1*BY2 + BX2*AY2 + AX2*BY1 + BX1*AY1 - BX2*AY1 - AX1*BY1 - BX1*AY2 - AX2*BY2;
// T berechnen (Matrize)
T:=(AX1*AY2 + AX2*BY1 + BX1*AY1 - AX2*AY1 - BX1*AY2 - AX1*BY1) / N;
// Berechnung mit T
X:=Round(BX1+T*(BX2-BX1));
Y:=Round(BY1+T*(BY2-BY1));
End;
Das war´s schon!
Im Anhang findest Du jetzt zwei Demoprogramme, jeweils für Delphi 3.0 oder 7.0 .
Du kannst im Programm zwei Linien zeichnen und den Schnittpunkt berechnen lassen.
Die Programme sind FreeWare + OpenSource!
[Edit] Du findest sie jetzt ganz oben im Beitrag!
Vielen Dank nochmal!
Grüsse von TOC
!