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

Programy - Ostrzeliwanie szybko lecących celów.

nieerotycki - 29-07-2009, 14:14
Temat postu: 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:

adiblol - 29-07-2009, 16:30

Daj wcięcia.
Poza tym daj do tagu [ code ] albo jeszcze lepiej do pastebinu.

--
moderator

pipok - 01-08-2009, 13:05
Temat postu: 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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++ - 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 - 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...

FE4R - 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 - 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.

FE4R - 30-11-2009, 17:15

Berserker napisał/a:
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.

Jeśli użyjesz fire(0.1) zamiast fire(1), wątpię, że robot nie trafi osy, która jest w polu jego zasięgu. Problem jest jedynie, gdy osa leci daleko, przy ok ~30 metrach na godzinie 9 od początkowej orientacji robota. Dlatego ja uruchamiam turn(direction(enemy.position)); gdy cel jest w zasięgu 70 metrów, a strzela dopiero przy 40.

adiblol - 30-11-2009, 18:45

Cytat:
przy ok ~30 metrach na godzinie

Chyba na sekundę ?!?!

FE4R - 30-11-2009, 21:59

adiblol napisał/a:
Cytat:
przy ok ~30 metrach na godzinie

Chyba na sekundę ?!?!

Na godzinie...
Godzinie dziewiątej. Chodzi tutaj o pozycję osy wobec robota.
Czasami mówi się: 'Cel na dziewiątej!', co oznacza 90 stopni w lewo.

No, ale jak już jesteśmy przy prędkości:

Prędkość osy = prędkość robota latającego.

adiblol - 01-12-2009, 16:54

FE4R napisał/a:
Na godzinie...

A, godzinę kątów!

saf - 26-02-2010, 14:45
Temat postu: ;]]
nie wiedze sensu takiego menczenia sie, przecież pisanie programu przez 3h (nie, nie kont tylko czas) a'la pipok niema sensy, gdy w tym czasie można rencznie przejsc cala gre
ja to sie nawet w atan nie bawie tylko pisze

while(this.position.z!=item.position.z)
{
jet(1);
{
i trafiam benz problemu we wszystko, może nie za pierwszym razem ale trafiam

Bartek c++ - 26-02-2010, 15:04

to ma ci trafić?
To tylko unosi ciebie jak wrog jest na równej wysokości co ty.
ty sie lepiej poucz cbot.

[ Dodano: 26-02-2010, 15:04 ]
a jak robot to nie robot latający?
Ten program twoj saf to kit.


Powered by phpBB modified by Przemo & WRIM © 2003 phpBB Group