Nie dam ci odpowiedzi, jestem pewien, że jest przydatna, a nawet poprawna, ale oto:
Po odrobinie zabawy z matematyką (sprawdź koniec odpowiedzi dla notebooka / opublikowanego notebooka) to rozwiązanie wydaje się być poprawne, nawet sądząc, że może nie być najlepsze pod względem wydajności.
Napisałem to w matematyce, co odpowiada twojemu problemowi. Zasadniczo rozwiązuje równania / nierówności w celu uzyskania zmiennej OA, której musimy się dowiedzieć. Dane wyjściowe podadzą nam możliwe rozwiązania, jakie może mieć OA, oraz warunki, które należy zweryfikować, aby każde rozwiązanie było ważne:
Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
{BPx, BPy} to aktualna pozycja niebieskiego
{BVx, BVy} to wektor prędkości niebieskiego
{OPx, OPy} to pozycja kuli pomarańczy
OV jest normą wektora prędkości pocisku pomarańczy (prędkość całkowita)
OA jest kątem pocisku pomarańczy (kąt wektora prędkości)
t jest czasem potrzebnym, aby pocisk trafił w niebieski
Próbowałem umieścić t> 0 i & OV> 0 w warunkach, ale matematyka potrwałaby wieczność, więc po prostu użyłem t! = 0 i & OV! ta sama pozycja co pomarańczowy i kiedy kula pomarańczy naprawdę się porusza (zamiast pozostać w bezruchu)
Dane wyjściowe są gigantyczne: http://freetexthost.com/xzhhpr5e2w
Jeśli jednak wyodrębnimy części OA == _, otrzymamy:
http://freetexthost.com/iyrhqoymfo
Są to wartości, które może mieć OA (każda z nich wymaga innych warunków, aby była ważna).
Po kilku dalszych analizach, które eliminują rozwiązania, które wymagają OV, a których nie chcemy, otrzymałem:
http://freetexthost.com/iy4wxepeb6
Są to możliwe rozwiązania problemu, z których każdy wymaga różnych warunków, aby był ważny. Aby określony kąt OA był prawidłowym rozwiązaniem, muszą być spełnione następujące warunki:
Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]
Wynik:
(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)
Więc rozważ tylko rozwiązania, w których to weryfikuje (nie musisz weryfikować części t == _. Są to te, które dają ci czas potrzebny na uderzenie pocisku w pojazd, jeśli inne warunki są prawidłowe. Zauważ, że jeśli t daje wartość ujemną, nie można uznać danego OA za prawidłowe rozwiązanie, nawet jeśli weryfikuje on inne warunki (dzieje się tak, ponieważ użyliśmy t! = 0 zamiast t> 0 w redukcji).
Warto również zapytać o to na /math// .
Edytować
Zainteresowałem się tym pytaniem, więc stworzyłem skomentowany notatnik z graficzną prezentacją wszystkiego, co wyjaśniłem. Pobierz to tutaj:
http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Lub tutaj:
http://www.2shared.com/file/W01g4sST/towerBullets.html
(jest to opublikowana wersja i potrzebujesz tylko odtwarzacza matematyki - który jest darmowy - aby go zobaczyć. Jeśli nie masz matematyki, jest to odpowiedni sposób)
Zrzut ekranu: