Thema: FreePascal Vektoriales Rechnen

Einzelnen Beitrag anzeigen

Maurooon
Online

Registriert seit: 7. Dez 2016
70 Beiträge
 
#16

AW: Vektoriales Rechnen

  Alt 13. Mai 2017, 13:11
Okay, also ich habe mir jetzt eine Funktion gebaut, die jede Millisekunde die Geradengleichung durch die Punkte Figur1 und Figur2 berechnet. Durch meine Hindernisse hab ich nun auch geraden gelegt. Jetzt muss ich nur noch die Schnittpunkte berechnen und dann überprüfen ob die Schnittpunkte innerhalb der Hindernisse liegen (weil diese ja eigentlich nur Strecken sind) und falls ja, siehen die Figuren sich nicht und falls nein sehen sie sich.

Ich habe mir den Link einmal angeschaut, nur verstehe ich die Funktion nicht ganz und verwende sehr ungern Code den ich nicht versthe... Könntest du mir erklären, was dort jeweils passiert? Hier nochmal die Funktion:

Zitat:
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;
Was bedeutet Matrize, was für einen Nenner berechnet man da? Und sind dann AX1 und AY1 die Koordinaten von Figur 1 z.B. und AX2 und AY2 die von Figur 2 und BX1, BY1, BX2 und BY2 Punkte auf dem Hindernis?

Ich hoffe mir kann jemand helfen.

LG
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat