Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 Polski Portal COLOBOTa - COLOBOT Polish Portal
Forum - Polski Portal COLOBOTa
Strona głównaStrona główna UżytkownicyUżytkownicy GrupyGrupy StatystykiStatystyki


Poprzedni temat «» Następny temat
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.
Kod:
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" :-D
 
     
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 :P 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 :P
To widać :P 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 8-) ) - 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.
_________________
 
 
     
Wyświetl posty z ostatnich:   

Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Polski Portal COLOBOTa © 2008 - 2012