|
Forum - Polski Portal COLOBOTa |
|
|
Ostrzeliwanie szybko lecących celów. |
Autor |
Wiadomość |
nieerotycki
Wiek: 29 Dołączył: 26 Lip 2009 Posty: 3 Skąd: Olkusz
|
Wysłany: 29-07-2009, 14:14 Ostrzeliwanie szybko lecących celów.
|
|
|
Siedziałem troszkę nad tym programem. Nie jest on super dokładny bo przyjąłem pewne uproszczenia. Ale zawsze można poprawić.
Liczę ile leci pocisk do miejsca w którym jest obecnie cel.
Następnie obliczam gdzie będzie cel za czas w jaki doleci do niego pocisk.
Zakładam że niewiele się zmieni czas lotu pocisku i mogę się posługiwać dalej tą wartością dla nowego miejsca (choć na pewno zmniejsza to celność ale upraszcza a ja przez ponad rok nie miałem z geometrią do czynienia od matury dokładnie).
Użyłem kawałka kodu z tematu 'Cel Pal' (nie chciało mi się samemu tego rozpracowywać). Mam nadzieję że Pipok się nie obrazi.
Czekam na komentarze i uwagi
Kod: | extern void object::Obrona()
{
object wrog; // informacje o obiekcie
aim(0); // celuj w poziomie
int RodzajWrog=Me; // kogo atakowac
point cel,A,B,C; // gdzie jest wrog
float azymut,alfa,beta,pitchK,rollK,gamma,e,f,epsilon,delta;
float odleglosc,ILP;
while ( true ){ // powtarzaj w nieskonczonosc
while((wrog = radar(RodzajWrog, 0, 360, 0, 50))==null) wait(0.5); //szukaj wroga
//gdzie bedzie za ILP;
A=wrog.position;
wait(0.2);
B=wrog.position;
odleglosc=distance(position,wrog.position);
ILP=1.08*odleglosc/8; // w 0.2 sekundy
C.x=B.x+ILP*(B.x-A.x);
C.y=B.y+ILP*(B.y-A.y);
C.z=B.z+ILP*(B.z-A.z);
if ( wrog != null ){
cel=C; // namierz wroga
azymut = direction(cel); // jaki w plaszczyznie kat do wroga
alfa = atan( (cel.z-position.z)/distance2d(position, cel) );
// -- poprawka na nachylenie terenu
pitchK = pitch*cos(azymut) - roll*sin(azymut);
rollK = roll*cos(azymut) + pitch*sin(azymut);
alfa = alfa - pitchK;
beta = rollK;
gamma = asin( sin(alfa)*cos(beta) );
e = acos ( cos(alfa)/cos(gamma) );
if (alfa<0) e = -e;
//etid
epsilon = acos( cos(alfa)/cos(gamma) );
//edit
f = asin( sin(beta)*sin(epsilon) );
delta=0;
if (cos(f)!=0)
delta = acos( cos(epsilon)/cos(f) );
if (f<0) delta = -delta;
alfa=gamma; // -- koniec poprawki
turn(azymut);
aim(alfa);
if ((alfa > -20) && (alfa < 20) && (distance(C,position)<=40)) fire(0.2);
}
}
} |
Mam zamiar dodać od siebie sprawdzanie czy cel nie jest za przeszkodą ale na razie nie mam czasu. |
Ostatnio zmieniony przez nieerotycki 29-07-2009, 17:28, w całości zmieniany 1 raz |
|
|
|
|
adiblol
Administrator forum FLOSS FTW!
Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy Dołączył: 21 Kwi 2008 Posty: 1313 Skąd: pokój odsłuchowy
|
Wysłany: 29-07-2009, 16:30
|
|
|
Daj wcięcia.
Poza tym daj do tagu [ code ] albo jeszcze lepiej do pastebinu.
--
moderator |
_________________ 1Tbps Project && Telecomix Network
|
|
|
|
|
pipok
Dołączył: 24 Cze 2009 Posty: 53
|
Wysłany: 01-08-2009, 13:05 Re: Ostrzeliwanie szybko lecących celów.
|
|
|
nieerotycki napisał/a: | Użyłem kawałka kodu z tematu 'Cel Pal' (nie chciało mi się samemu tego rozpracowywać). Mam nadzieję że Pipok się nie obrazi. | "Nie zapala się światła i nie stawia pod garncem, ale na świeczniku, aby świeciło wszystkim" |
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 18-11-2009, 20:39
|
|
|
Kod: |
float dir1, dir2, dir;
point pos1, pos2;
pos1 = p.position;
wait(0.2);
pos.2 = p.position;
dir1 = direction(pos1);
dir2 = direction(pos2);
dir = 2 * dir2 - dir1
motor(-dir/90, dir/90);
|
Moj program do celowania "w przyszlosc" napisany w 3min Wiem, ze to nie jest ruch po okregu, ale zasieg 40m pozwala na pare przyblizen.
Podziwiam, ze chcialo ci sie robic program, ktorego dzialania praktycznie nie zauwazysz ze wzgledu na szybkosc strzalow w colobocie.
Roll ma duzy wplyw na celowanie? Ja nigdy go nie zauwazalem, tylko pitch dla robotow latajacych. |
_________________
|
|
|
|
|
pipok
Dołączył: 24 Cze 2009 Posty: 53
|
Wysłany: 19-11-2009, 08:52
|
|
|
Berserker napisał/a: | Moj program do celowania "w przyszlosc" napisany w 3min | To widać Bo to jest program do obracania się w tę samą stronę, w którą niedawno ruszył się cel, a nie do celowania
Berserker napisał/a: | Podziwiam, ze chcialo ci sie robic program, ktorego dzialania praktycznie nie zauwazysz ze wzgledu na szybkosc strzalow w colobocie. | Przed oddaniem strzału bot ustawia się na cel przez obrót w kierunku pozycji mrówki w chwili pomiaru położenia. Ale w czasie, kiedy się obracał w stronę tego punktu, mrówka się przesuwała. To znaczy, że już w chwili, kiedy bot oddaje strzał, pocisk nie leci dokładnie w kierunku aktualnego położenia mrówki.
Nawet bez uwzględniania tej równicy:
Prędkość pocisku to około 50m/s. Jednostki latające mają prędkość ok.7m/s (w locie), kołowe 5m/s, a wyposażone w nogi - ok.4m/s. To znaczy, że mrówka oddalona o 40 metrów zdąży się przesunąć o 40/50*4, czyli ok. 3m, zanim pocisk dotrze na miejsce. Rozmiar mrówki to około 2m. Zmiana położenia o 3m celu mającego wielkość 2m wystarczy, żeby uniknął trafienia.
Berserker napisał/a: | Roll ma duzy wplyw na celowanie? Ja nigdy go nie zauwazalem, tylko pitch dla robotow latajacych. |
pipok, 10-07-2009, 09:54 napisał/a: | Jeśli przy wypoziomowanym bocie cel był widoczny pod kątem 20 stopni [w pionie], to po obróceniu się bota o 20 stopni na bok cel jest widoczny pod kątem 18,7 stopni. Co przy odległości do celu równej 40 metrów daje metr różnicy w pionie. | W poziomie różnica będzie większa, azymut zmieni się o 6-7stopni, co daje około 4-5m. |
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 19-11-2009, 13:48
|
|
|
Cytat: | Prędkość pocisku to około 50m/s. Jednostki latające mają prędkość ok.7m/s (w locie), |
13-14m/s zaleznie od czasu jaki sie wezmie do obliczen. Przynajmniej tyle porusza sie osa.
Tyle w teorii. 1/5 sekundy nie wystarcza, by dokladnie obliczyc zmiane polozenia. Dla pomiaru predkosci potrzeba przynajmniej jednej sekundy, inaczej program potrafi otrzymac predkosc rzedu 30-70m/s (SIC!).
Ale jak juz jestesmy przy celowaniu z dokladnoscia do pol metra, pociski to nie jest liniowy strumien czastek, lecz cos, co moze ostrzeliwywac pewna powierzchnie. Tak wiec tuz przy robocie salwa obejmie z 0.5m^2, a na koncu bym sie nie zdziwil, gdyby to bylo 3-4m^2 (zwlaszcza dla dzial organicznych), co daje 2m szerokosci.
Jesli chodzi o osy, to nawet ta piata czesc sekundy pozwala jej znacznie zmienic wysokosc i kierunek lotu.
Wiec dalej pozostane przy zdaniu, ze program ciekawy ale daje niewielka roznice (poza nachyleniem terenu, chociaz rzadko zauwazam, zeby robot nie trafil z powodu przechylenia na bok) |
_________________
|
|
|
|
|
pipok
Dołączył: 24 Cze 2009 Posty: 53
|
Wysłany: 19-11-2009, 14:20
|
|
|
Berserker napisał/a: | 1/5 sekundy nie wystarcza, by dokladnie obliczyc zmiane polozenia. Dla pomiaru predkosci potrzeba przynajmniej jednej sekundy, inaczej program potrafi otrzymac predkosc rzedu 30-70m/s (SIC!). | Nie zetknąłem się z takim przypadkiem. Z mojego doświadczenia wynika, że 0,2 sekundy wystarczy na sensowny pomiar.
Berserker napisał/a: | na koncu bym sie nie zdziwil, gdyby to bylo 3-4m^2 (zwlaszcza dla dzial organicznych), co daje 2m szerokosci. | Właśnie. Te 2m to wymiar mrówki. A jeśli mrówka podczas strzału przesunie się o 3m, to może spokojnie uniknąć pocisku.
Berserker napisał/a: | Wiec dalej pozostane przy zdaniu, ze program ciekawy ale daje niewielka roznice | Przy trudnej, zaciętej walce, mała różnica decyduje o życiu lub śmierci. Dodatkowa energia, potrzebna na oddanie poprawkowego strzału, również może zdecydować. Kiedy sytuacja jest prosta, wystarczy prosty kod. |
|
|
|
|
FE4R
Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy Wiek: 24 Dołączył: 21 Paź 2009 Posty: 144
|
Wysłany: 22-11-2009, 16:06
|
|
|
pipok napisał/a: | Przy trudnej, zaciętej walce, mała różnica decyduje o życiu lub śmierci. Dodatkowa energia, potrzebna na oddanie poprawkowego strzału, również może zdecydować. Kiedy sytuacja jest prosta, wystarczy prosty kod. |
Daj spokój. Twój najprostszy program, z którym sam się męczyłem pozwolił mi zabić wszystkie osy na mapie używając może 2% energii atomowego ogniwa. |
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 22-11-2009, 19:13
|
|
|
Tez zalezy od programu jaki ma przeciwnik. Piszemy wszyscy programy pod roboty a malo jest dobrych programow dla obych |
_________________
|
|
|
|
|
FE4R
Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy Wiek: 24 Dołączył: 21 Paź 2009 Posty: 144
|
Wysłany: 22-11-2009, 21:18
|
|
|
Berserker napisał/a: | Tez zalezy od programu jaki ma przeciwnik. Piszemy wszyscy programy pod roboty a malo jest dobrych programow dla obych |
Wystarczy fire(item.position)... i przed tym sie nie obronisz, jak walczysz z mrowka... potrafi przestrzelic cala mape i zniszczyc wszystkie twoje budynki... |
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 22-11-2009, 22:51
|
|
|
Kiedys sprawdzalem, calej mapy nie przestrzeli, zasieg to 100-120m, co i tak daje duzaa przewage, ale wracajac do tematu o wiele latwiej jest zestrzelic ose ktora leci w jednym kierunku na jednej wysokosci, a o wiele trudniej zestrzelic ose ktora ma stuningowany program wyciagniety z cwiczen. |
_________________
|
|
|
|
|
Bartek c++
Twoja ulubiona misja: Tropica - Czas na atak
Pomógł: 6 razy Wiek: 20 Dołączył: 07 Lip 2009 Posty: 390
|
Wysłany: 26-11-2009, 10:10
|
|
|
Najlepiej ustawić bota wstawić mu if i turn(direction(... Kiedy będzie 40 m w twoim zasięgu Zestrzeli go. |
_________________
|
|
|
|
|
adiblol
Administrator forum FLOSS FTW!
Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy Dołączył: 21 Kwi 2008 Posty: 1313 Skąd: pokój odsłuchowy
|
Wysłany: 29-11-2009, 20:14
|
|
|
Bartek c++ napisał/a: | Najlepiej ustawić bota wstawić mu if i turn(direction(... Kiedy będzie 40 m w twoim zasięgu Zestrzeli go. |
Nic nie zrozumiałem z Twojego postu... |
_________________ 1Tbps Project && Telecomix Network
|
|
|
|
|
FE4R
Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy Wiek: 24 Dołączył: 21 Paź 2009 Posty: 144
|
Wysłany: 29-11-2009, 20:44
|
|
|
Ja znam odpowiedź na pytanie!
Zamiast tworzyć programy tak zaawansowane, że Sam ich nie rozumiesz (pipok-style ) - wystarczy mieć budynki blisko siebie i postawić robota w jakiejś 'inteligentnej pozycji'. Osa przez chwile czeka, zanim zrzuca bombę.
Zbyt hipotetyczne sytuacje nie mają sensu... |
|
|
|
|
Berserker
Dark Ness
Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy Wiek: 24 Dołączył: 24 Mar 2009 Posty: 496 Skąd: Bigos
|
Wysłany: 30-11-2009, 13:55
|
|
|
Cytat: | Ja znam odpowiedź na pytanie!
Zamiast tworzyć programy tak zaawansowane, że Sam ich nie rozumiesz (pipok-style ) - wystarczy mieć budynki blisko siebie i postawić robota w jakiejś 'inteligentnej pozycji'. Osa przez chwile czeka, zanim zrzuca bombę. |
Tylko jesli osa dziala wg standardowego programu i przemieszcza sie do pozycji za pomoca instrukcji goto(). Wystarczy zamienic goto() na motor() i juz masz problem. Pare dodatkowych modyfikacji i taki robot nawet tej osy nie trafi. |
_________________
|
|
|
|
|
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|