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;
}
}
?>