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
Kolejny beznadziejny program wybijajacy osy.
Autor Wiadomość
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: 03-01-2011, 21:12   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 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 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 
Dark Ness


Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy
Wiek: 24
Dołączył: 24 Mar 2009
Posty: 496
Skąd: Bigos
Wysłany: 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 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 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 
Dark Ness


Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy
Wiek: 24
Dołączył: 24 Mar 2009
Posty: 496
Skąd: Bigos
Wysłany: 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 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 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 
Dark Ness


Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy
Wiek: 24
Dołączył: 24 Mar 2009
Posty: 496
Skąd: Bigos
Wysłany: 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 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 07-04-2012, 19:11   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 
Dark Ness


Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy
Wiek: 24
Dołączył: 24 Mar 2009
Posty: 496
Skąd: Bigos
Wysłany: 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 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 07-04-2012, 20:21   

Masz na myśli

(a^2) = (b^2) + (c^2) - 2bc.cosA ?
 
     
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: 07-04-2012, 21:14   

Dokladnie
_________________
 
 
     
Wyświetl posty z ostatnich:   
Nie możesz pisać nowych tematów
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum

Wersja do druku

Skocz do:  

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