Non ti darò una risposta, sono sicuro che sia utile o addirittura corretto, ma ecco qui:
Dopo aver giocato un po 'di più con i file matematici (controlla la fine della risposta per notebook / notebook pubblicato), questa soluzione sembra essere corretta, anche se potrebbe non essere la migliore in termini di efficienza.
L'ho scritto in matematica che corrisponde al tuo problema. Fondamentalmente risolve le equazioni / disuguaglianze al fine della variabile OA che è quello che dobbiamo scoprire. L'output ci fornirà le possibili soluzioni che OA può avere e le condizioni che devono essere verificate affinché ciascuna soluzione sia valida:
Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
{BPx, BPy} è la posizione attuale del blu
{BVx, BVy} è il vettore di velocità del blu
{OPx, OPy} è la posizione del proiettile di orange
OV è la norma del vettore di velocità del proiettile di orange (velocità totale)
OA è l'angolo del proiettile arancione (angolo del vettore di velocità)
t è il tempo necessario affinché il proiettile colpisca in blu
Ho provato a mettere t> 0 && OV> 0 nelle condizioni ma la matematica impiegherebbe un'eternità quindi ho usato t! = 0 && OV! = 0. Quindi le soluzioni che darò qui funzionano solo quando il blu non è esatto stessa posizione dell'arancia e quando il proiettile dell'arancia si muove davvero (invece di rimanere fermo)
L'output è gigantesco: http://freetexthost.com/xzhhpr5e2w
Tuttavia, se estraiamo le parti OA == _, otteniamo questo:
http://freetexthost.com/iyrhqoymfo
Questi sono i valori che OA può avere (ognuno richiede condizioni diverse per essere valido).
Con alcune ulteriori analisi che eliminano le soluzioni che richiedono che OV sia negativo e che non vogliamo, ho ottenuto questo:
http://freetexthost.com/iy4wxepeb6
Quindi queste sono le possibili soluzioni al problema, ognuna delle quali richiede condizioni diverse per essere valida. Affinché un determinato angolo OA sia una soluzione valida, devono soddisfare le seguenti condizioni:
Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]
Produzione:
(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) && BPy OV - OPy OV != 0) ||
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) ||
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)
Quindi considera solo le soluzioni in cui ciò si verifica (non è necessario verificare le parti t == _. Sono quelle che ti danno il tempo necessario affinché il proiettile colpisca il veicolo se le altre condizioni sono valide. Nota che se t risulta in un valore negativo, non puoi considerare un determinato OA come una soluzione valida, anche se verifica le altre condizioni (questo perché abbiamo usato t! = 0 invece di t> 0 per ridurre)).
Potrebbe anche essere una buona idea chiedere in /math// di questo.
modificare
Sono cresciuto l'interesse per questa domanda, quindi ho creato un taccuino commentato con una dimostrazione grafica di tutto ciò che ho spiegato. Scaricalo qui:
http://www.2shared.com/file/pXhYyhN1/towerBullets.html
O qui:
http://www.2shared.com/file/W01g4sST/towerBullets.html
(questa è la versione pubblicata, e hai solo bisogno del lettore di matematica - che è gratuito - per vederla. Se non hai la matematica questa è la strada da percorrere)
Immagine dello schermo: