Thema: Delphi Abfangkurs berechnen

Einzelnen Beitrag anzeigen

wuschel41

Registriert seit: 5. Mär 2005
2 Beiträge
 
#9

Re: Abfangkurs berechnen

  Alt 5. Mär 2005, 19:11
hiho, ich war auch grad dabei nen abfangkurs zu berechnen, aber da ich grad zu faul bin, bekommt ihr den code in php und nich in delphi, wird ja wohl kein prob für euch sein den zu übersetzen.

geschwindigkeiten beider punkte sind konstant

die idee ist, ein lot auf die flugbahn des zieles zu legen, entfernung zu berechnen, dann die strecke zum startpunkt des ziels und dann den treffpunkt beider. es würd auch mit kreisen gehn, aber ich fands so leichter. der code is noch nich ganz fertig, gleiche geschwindigkeiten führen zu div by zero aber dann kann mans ja auch einfach ausrechnen. ich hoff es ich konnt euch en bissle helfen.

noch was zur erklärung:
ziel fliegt von $a nach $c mit der geschwindugkeit $v und abfänger startet in $b mit $u

habs jetzt doch nochmal kommentiert
Delphi-Quellcode:
<?
   function calcVekLen($a, $b){
      return sqrt($a*$a + $b*$b);
   }


   $a = array(1,2);
   $b = array(3,1);
   $c = array(6,4);

   $v = 1;
   $u = 5;
      
   if($u == $v){
      
   }
 else {
      //vektoren ziel-start -> ziel-ende , länge; vektor ziel-start -> abfänger-start
      $ac = array($c[0]-$a[0], $c[1]-$a[1]);
      $acLen = calcVekLen($ac[0], $ac[1]);
      $ab = array($b[0]-$a[0], $b[1]-$a[1]);
      
      //falls ziel bereits angekommen
      if($acLen == 0) return FALSE;
      
      //Abstand abfänger-start - ziel(-flug)-gerade
      $d = abs($ac[0]*$ab[1] - $ac[1]*$ab[0]) / $acLen;
      
      //fußpunkt
      $t0 = ($ab[0]*$ac[0] + $ab[1]*$ac[1]) / ($ac[0]*$ac[0] + $ac[1]*$ac[1]);
      $p = array($a[0] + $t0*$ac[0], $a[1] + $t0*$ac[1]);
      
      //vektor ziel-start -> fußpunkt, länge
      $ap = array($p[0]-$a[0], $p[1]-$a[1]);
      $x = calcVekLen($ap[0], $ap[1]);
      
      //hilfsvars   $o kann nicht 1 werden da geschwindigkeiten verschieden
      $o = $v/$u;
      $ph = (2*$x) / (1 - $o*$o);
      $qh = ($x*$x - ($o*$d)*($o*$d)) / (1 - $o*$o);
      
      //quadr. gleichung
      $y1 = -$ph/2 + sqrt(($ph/2)*($ph/2) -  $qh);
      $y2 = -$ph/2 - sqrt(($ph/2)*($ph/2) -  $qh);
      $y3 = -$y1;
      $y4 = -$y2;

      //einheits vektor des ziels in zielrichtung
      $e = array($ac[0]/$acLen, $ac[1]/$acLen);
      
      //2 mögliche schnittpunkte berechnen
      $schnitt1 = array($p[0] + $y1*$ac[0]/$acLen, $p[1] + $y1*$ac[1]/$acLen);
      $schnitt2 = array($p[0] + $y2*$ac[0]/$acLen, $p[1] + $y2*$ac[1]/$acLen);
      
      //prüfen ob in zielrichtung oder -zielrichtung
      if(!is_nan($schnitt1[0]) && !is_nan($schnitt1[1]) && (($schnitt1[0]-$a[0]) / $e[0] >= 0)){
         $targetX = $schnitt1[0];
         $targetY = $schnitt1[1];
         
         //code zum schiff losschicken
         return TRUE;
      }
 elseif(!is_nan($schnitt2[0]) && !is_nan($schnitt2[1]) && (($schnitt2[0]-$a[0]) / $e[0] >= 0)){
         $targetX = $schnitt2[0];
         $targetY = $schnitt2[1];
         
         //code zum schiff losschicken
         return TRUE;
      }
 elseif(!is_nan($schnitt3[0]) && !is_nan($schnitt3[1]) && (($schnitt3[0]-$a[0]) / $e[0] >= 0)){
         $targetX = $schnitt3[0];
         $targetY = $schnitt3[1];
         
         //code zum schiff losschicken
         return TRUE;
      }
 elseif(!is_nan($schnitt4[0]) && !is_nan($schnitt4[1]) && (($schnitt4[0]-$a[0]) / $e[0] >= 0)){
         $targetX = $schnitt4[0];
         $targetY = $schnitt4[1];
         
         //code zum schiff losschicken
         return TRUE;
      }
 else {
         echo "<pre>Abfangkurs kann nicht gesetzt werden !!\n";
         print_r($schnitt1);
         print_r($schnitt2);
         die("</pre>");
         return FALSE;
      }

   }
?>
  Mit Zitat antworten Zitat