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

Eliminacja obcych - Kolejny beznadziejny program wybijajacy osy.

Berserker - 03-01-2011, 21:12
Temat postu: Kolejny beznadziejny program wybijajacy osy.
Tym razem (nowosc z mojej strony!) progam dla dziala latajacego. Poniewaz mam brudna spacje, nie jestem fanem robotow latajacych i jestem leniwy, ten program to tylko pokaz, ile mozna wycisnac z celnosci. Srednia skutecznosc to ponad 98%.
Kod:
extern void object::OsaNess()
{
    aim(0);
    object p;
    point dest;
    float dist, dir, angle, spin, prox;
    float speed, time, len, orient, kickback;
    int shots;
    float ground;
    time = abstime();
    shots = 0;
    kickback = 5.18;
    while(true)
    {
        p = radar(AlienWasp);
        if(p == null) break;
        dist = distance(position, p.position);
        if(dist > 350)
        {
            motor(0,0);
            jet(-1);
        }
        else
        {
            ground = 2*(1-altitude/5);
            if(ground < 0) ground = 0;
            speed = p.position.z - (position.z+1);
            speed /= 6;
            jet(speed+ground);
            dest = getDest(p);
            dir = direction(p.position);
            spin = direction(dest)/30;
            if(abs(dir) > 90)
            {
                turn(spin*30);
            }
            prox = (dist-5)/15;
            if(prox > 1) prox = 1;
            motor(prox-spin, prox+spin);
            angle = Angle(dest)-(pitch-kickback);
            aim(angle);
            if(abstime()-time > 1 and abs(spin*30) < 5 and abs(speed*6) < 1 and dist < 45 and abs(angle) < 20)
            {
                aim(angle);
                jet(0);
                motor(1-dir/45, 1+dir/45);
                fire(0.05);
                time = abstime();
            }
        }
    }
    jet(-1);
    wait(3);
   
   
}
float object::Angle(point dest)
{
    float dist, deltaH;
    float angle;
    dist = distance(dest, position);
    deltaH = dest.z-position.z-1;
    angle = asin(deltaH/dist);
    return angle;
}
point object::getDest(object p)
{
    ipf(1000);
    float len, alfa;
    float vo, vb, dist, deltaH;
    float a, b, c, delta;
    point dest;
    vo = velocity(p);
    vb = 53;
    deltaH = p.altitude;
    dist = distance2d(position, p.position);
    alfa = abs(p.orientation-(direction(p.position)+orientation));
    a = 1-pow(vb/vo, 2);
    b = cos(alfa)*dist;
    c = pow(dist, 2);
    delta = pow(b, 2)-4*a*c;
    if(delta >= 0) len = (-b-sqrt(delta))/(2*a);
    else len = -b*0.5/a;
    dest.x = p.position.x+cos(p.orientation)*len;
    dest.y = p.position.y+sin(p.orientation)*len;
    dest.z = topo(dest)+deltaH;
    if(abs(p.orientation-orientation) < 5 or abs(p.orientation-orientation-180) < 5) dest = p.position;
    return dest;
}
float velocity(object p)
{
    point start;
    float time, dtime, dist;
    start = p.position;
    time = abstime();
    wait(0.01);
    dist = distance2d(start, p.position);
    dtime = abstime()-time;
    return dist/dtime;
}

Jest pare niepotrzebnych zmiennych (shots?), ale daje ten program, bo licze, ze spece od aim(direction(dest)) (rotfl) przestana pisac bzdury :P

FE4R - 01-04-2012, 16:49

Heja Berserker.

Mógłbyś wyjaśnić kilka stałych w programie?

Nie wiem za bardzo skąd 5.18 dla kickback oraz 53 dla vb.

Reszty nie sprawdzałem, bo musiałbym sobie narysować diagram, a jestem za leniwy. :P

Berserker - 01-04-2012, 21:27

5.18 to pochylenie robota wynikajace z odrzutu podczas strzelania. Za cholere nie wiem, jak ono wplywa na celowanie, bo uwzglednienie tego nic nie zmienia i robot dalej lubi strzelac za wysoko, ale w teorii jest i psuje.

53 to jest predkosc pocisku wystrzeliwywanego (fajne slowo) przez dzialo. Raczej potrzebne jesli chcemy trafic ose a nie powietrze za nia.

FE4R - 01-04-2012, 22:03

Wydaje mi się, że w tym przypadku prostota wygrywa. :P

Przetestowałem swój i twój programik w Ćwiczeniach, gdzie musisz zabić kilka os.
Z twoim programem średnio 65.2 sekund zajmowało, żeby robot zabił wszystkie osy, a u mnie 42 sekundy. :P

Poza tym mierzenie predkości pocisku jest tak samo zwalone jak mierzenie czegokolwiek w Colobocie, np. prędkości czy przyśpieszenie robota. Też testowałem prędkość pocisku jakiś czas temu. 40 metrów od celu dawało mi 55 m/s, ale bliżej wychodziło prawie 120 m/s.

Tak samo z prędkością opadania robota, gdzie wyliczyłem g = 6.cośtam na maksymalnej wysokości, ale przy 15 metrach już g = 14... Także słabo to wychodzi.

Aktualnie pracuję z wektorami, żeby trochę polepszyć ten programik. Może wreszcie te wredne osy nie będą takie trudne do zestrzelenia. ^^

Berserker - 01-04-2012, 22:28

Co do czasu sredniego, ja nie liczylem bo to jest tak losowe, ze nic w sumie nie odzwierciedla. Ja liczylem ile strzalow potrzebowalem srednio na 1 ose i ile energii zmarnowalem.

Co do predkosci, dlatego tak staram sie, zeby ktos zaimplementowal wektory w Colobocie, tak jak jest w Ceebocie. Nawet chcialem zaimplementowac wszystkie moje programy w Ceebocie korzystajac z wektora speed, ale tak malo osob interesuje sie tymi programami, a jeszcze mniej potrzebuje i rozumie cos takiego, ze az mi sie nie chce i wracam do ogladania Dakanna.

Pamietaj, ze w Colobocie wszystko jest mierzone do 2 miejsca po przecinku. Wiec na krotsze dystanse mozesz miec rozstrzal wyniku rzedu 50%, bo np. czas moze skakac miedzy 0.04 a 0.05 przy roznicy odleglosci rzedu 1m (Wymyslone dane: 2m w ciagu 0.04s i 3m w ciagu 0.05s. Daje nam to 50m/s i 60m/s. 10m/s przy takich wynikach to 20%, a to duzo). Na dluzsze dystanse masz np. skakanie miedzy 0.49 a 0.50, co daje bardziej ujednolicony wynik. Dobrze jest wykorzystywac znajomosc rodzajow zaleznosci i ruchow (predkosc pocisku wystrzelonego przez dzialo organiczne badz zwykle jest stala, wiec im wiekszy dystans bedzie tym bedzie wieksza dokladnosc, natomiast dzialo fazowe strzela pociskami ktore poruszaja sie de facto z przyspieszeniem wzdluz Oy i tutaj trzeba sie naglowic). Dobrym przykladem jest twoj blad:
Cytat:
Tak samo z prędkością opadania robota, gdzie wyliczyłem g = 6.cośtam na maksymalnej wysokości, ale przy 15 metrach już g = 14... Także słabo to wychodzi.

Otoz nie wiem czemu, ale roboty opadaja z stala predkoscia 15m/s. Przyspieszenie grawitacyjne ma zastosowanie (chyba, w Ceebocie na pewno) tylko do obiektow zrzucanych przez osy.

FE4R - 03-04-2012, 23:52

Berserker napisał/a:
Co do czasu sredniego, ja nie liczylem bo to jest tak losowe, ze nic w sumie nie odzwierciedla. Ja liczylem ile strzalow potrzebowalem srednio na 1 ose i ile energii zmarnowalem.

O ile ruch os jest dość losowy, czas w jakim robot jest w stanie zestrzelić osy ma jednak znaczenie. Chociażby dlatego, że bez względu na ich ruch robot potrafi się dostosować do sytuacji i odpowiednio się poruszać.

Mimo wszystko, energetycznie wychodziło tak samo, chociaż to też jest losowe, bo zależy od tego ile robot jest w powietrzu.

Cytat:
Co do predkosci, dlatego tak staram sie, zeby ktos zaimplementowal wektory w Colobocie, tak jak jest w Ceebocie. Nawet chcialem zaimplementowac wszystkie moje programy w Ceebocie korzystajac z wektora speed, ale tak malo osob interesuje sie tymi programami, a jeszcze mniej potrzebuje i rozumie cos takiego, ze az mi sie nie chce i wracam do ogladania Dakanna.


Ja akurat myślałem o użyciu wektorów do obliczenia jaką pozycję miałaby osa w danej chwili po wystrzeleniu pocisku i użycie tej informacji do policzenia odpowiednich kątów.

Co prawda stosowałem już wektory wcześniej na fizyce i matematyce, również w 3 wymiarach, ale nie jestem w stanie dokładnie zanalizować problemu.

Cytat:
Dobrze jest wykorzystywac znajomosc rodzajow zaleznosci i ruchow (predkosc pocisku wystrzelonego przez dzialo organiczne badz zwykle jest stala, wiec im wiekszy dystans bedzie tym bedzie wieksza dokladnosc, natomiast dzialo fazowe strzela pociskami ktore poruszaja sie de facto z przyspieszeniem wzdluz Oy i tutaj trzeba sie naglowic). Dobrym przykladem jest twoj blad.


Owszem, procentowa dokładność ma tutaj duże znaczenie przy mierzeniu. Chciałem jednak tylko zwrócić uwagę na paradoks, gdzie różnica w 2 miejscach po przecinku ma prawie 200% różnicę w końcowym wyniku. Mówię tutaj o przyśpieszeniu, które starałem się policzyć, i które powinno wynosić 0, jak powiedziałeś.

O ile nie chce Ci się głowić nad takimi programami, ja bardzo lubię ulepszać tego typu programy. Widzę, że prace nad sequelem Colobota idą powoli, nawet z wolną licencją. Oczywiście nie mam zielonego pojęcia o takich pracach, jednak myślałem, iż pasjonaci będą bardzo zaangażowani. Dlatego też znalazłem swoje miejsce w takich programach, gdzie bezbłędne napisanie programu, który lepiej zestrzeliwuje osy niż człowiek jest nie lada wyzwaniem.

Póki co nadal pracuję nad swoim kodem, może później coś przedstawię.

Berserker - 04-04-2012, 14:01

Cytat:
O ile ruch os jest dość losowy, czas w jakim robot jest w stanie zestrzelić osy ma jednak znaczenie. Chociażby dlatego, że bez względu na ich ruch robot potrafi się dostosować do sytuacji i odpowiednio się poruszać.

Mimo wszystko, energetycznie wychodziło tak samo, chociaż to też jest losowe, bo zależy od tego ile robot jest w powietrzu.

Dlatego skupilem sie na celnosci. Jesli sie glowiles, po co strzelam przez 0.05s co 2s, to wlasnie po to, by zmierzyc celnosc. Rzadko kiedy potrzebowalem wiecej niz 4 strzalow by zakonczyc cwiczenie, co uwazam za sukces.
Cytat:
Ja akurat myślałem o użyciu wektorów do obliczenia jaką pozycję miałaby osa w danej chwili po wystrzeleniu pocisku i użycie tej informacji do policzenia odpowiednich kątów.

Co prawda stosowałem już wektory wcześniej na fizyce i matematyce, również w 3 wymiarach, ale nie jestem w stanie dokładnie zanalizować problemu.

Jesli wystarczajaco duzo osob sie zainteresuje, to nawet zrobie caly temat z objasnieniem, jak takie cos zrobic. W ktoryms poscie w dziale od Ceebota pokazalem, jak ogolnie powinno sie takie rzeczy robic.

Cytat:
procentowa dokładność ma tutaj duże znaczenie przy mierzeniu. Chciałem jednak tylko zwrócić uwagę na paradoks, gdzie różnica w 2 miejscach po przecinku ma prawie 200% różnicę w końcowym wyniku.

To nie jest paradoks, to czysta matematyka.

Cytat:
Mówię tutaj o przyśpieszeniu, które starałem się policzyć, i które powinno wynosić 0, jak powiedziałeś.

Powinno wyjsc 0. Ba, nawet wychodzi. Nie wiem jak to liczyles, jedyny blad jaki mogles zrobic to zalozyc, ze predkosc poczatkowa jest rowna 0. Ale wtedy przyspieszenie powinno malec, a nie rosnac.
Cytat:
O ile nie chce Ci się głowić nad takimi programami, ja bardzo lubię ulepszać tego typu programy.

Tez lubie, jednak mi sie juz skonczyly pomysly/mozliwosci. Z motywacja tez ciezko, daje program na forum, a tu komentarz:
Cytat:
Fajna rozróba z tym programem!!!!

Jakbym dostal do reki narzedzie w Cbocie pozwalajace dokladnie odczytac predkosc, to moglbym sie pobawic z uwzglednieniem przyspieszenia, dzieki czemu osa zataczajaca kolo lub hamujaca ciagle bylaby trafialna. Jednak deal "wy robicie sequel, ja robie programy pod niego" cos nie wychodzi :)

Cytat:
Póki co nadal pracuję nad swoim kodem, może później coś przedstawię.

A dawaj, bedziemy miec o co sie klocic :)

FE4R - 07-04-2012, 19:11
Temat postu: Re: Kolejny beznadziejny program wybijajacy osy.
Berserker napisał/a:
Kod:

a = 1-pow(vb/vo, 2);
b = cos(alfa)*dist;
c = pow(dist, 2);

Hej, mógłbyś mi wyjaśnić pochodzenie tej funkcji kwadratowej?

Berserker - 07-04-2012, 20:14

@up
Kartke z obliczeniami zgubilem juz dawno temu. Teraz moglbym znowu wyprowadzic, ale mi sie nie chce. Pamietam tylko, ze wszystko sprowadzilo sie do wypisania danych i niewiadomych i zastosowania sprytnego twierdzenia cosinusow.

FE4R - 07-04-2012, 20:21

Masz na myśli

(a^2) = (b^2) + (c^2) - 2bc.cosA ?

Berserker - 07-04-2012, 21:14

Dokladnie

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