Einzelnen Beitrag anzeigen

Benutzerbild von TOC
TOC

Registriert seit: 5. Jan 2005
Ort: Trier
248 Beiträge
 
Delphi 7 Personal
 
#4

Re: Schnittpunkt zweier Linen berechnen mit Delphi?

  Alt 23. Jun 2006, 16:26
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 !
Lars Uwe Hohmann
"Wäre die Erde eine Bank, ihr hättet sie längst gerettet!"
(Zitat GreenPeace)
  Mit Zitat antworten Zitat