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