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
jak zrobić goto
Autor Wiadomość
sajmon313 
Jedi Master


Wiek: 28
Dołączył: 16 Gru 2009
Posty: 42
Skąd: /dev/uarndom
Wysłany: 24-12-2009, 22:00   jak zrobić goto

Problem jest następujący:
jak zrobić funkcje działającą identycznie jak goto(), z użyciem move() i turn(), lub motor().

Po co?
Żeby dodać fajne rzeczy do goto, np. omijanie obcych, nie lądowanie w wodzie, nie wpadanie do dziur o stromych scianach i inne tego typu przydatne rzeczy.
_________________
Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10
 
 
     
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: 24-12-2009, 22:22   

Moim zdaniem przy uzyciu CBot to jest niemozliwe. Dlaczego? goto() (przynajmniej z domyslnymi parametrami) wybierajac droge uwzglednia pochylenie terenu, objetosc obiektow i pare takich innych bzdur, ktore sa niemozliwe do sprawdzenia przy uzyciu CBota (pochylenia terenu nie sprawdzi sie nie wjezdzajac samemu, nie mozna sprawdzic czy sie zahaczy o budynek bo pozycja budynku zwraca tylko srodek). Jesli wierzysz, ze ci sie uda, to proponuje zaczac rozgryzanie goto() od zagadki: dlaczego jesli robotowi kaze sie podjechac na pozycje identyczna z pozycja robota to robot musi z niej zjechac, obrocic sie i wrocic? :)
_________________
 
 
     
sajmon313 
Jedi Master


Wiek: 28
Dołączył: 16 Gru 2009
Posty: 42
Skąd: /dev/uarndom
Wysłany: 24-12-2009, 22:41   

Berserker napisał/a:
Moim zdaniem przy uzyciu CBot to jest niemozliwe.

Planuję dokładnie to zbadać
Berserker napisał/a:
pochylenia terenu nie sprawdzi sie nie wjezdzajac samemu

Da się!
Kod:
point pos1,pos2;
pos1=position;
pos2=pos1;
pos2.x=pos1.x+0.5;
pos1.x=pos1.x-0.5;

teraz można porównac topo(pos1) i topo(pos2) i mamy pochylenie w x
oczywiście musiałoby to być bardziej rozbudowane.
Berserker napisał/a:
nie mozna sprawdzic czy sie zahaczy o budynek bo pozycja budynku zwraca tylko srodek

ale znamy też kategorię - a więc mozna sporządzić tablice z wymiarami wszystkich możliwych obiektów
Berserker napisał/a:
Jesli wierzysz, ze ci sie uda, to proponuje zaczac rozgryzanie goto() od zagadki: dlaczego jesli robotowi kaze sie podjechac na pozycje identyczna z pozycja robota to robot musi z niej zjechac, obrocic sie i wrocic? :)

moje nowe lepsze goto nie będzie się zachowywało w ten sposób. ;P
_________________
Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10
 
 
     
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: 25-12-2009, 02:30   

Hm, najtrudniejsze moim zdaniem jest znalezienie drogi do podazania. No i jeszcze jest piekna Matka Natura, ktora sadzi rozne grzyby nie wykrywalne przez radar. O tym sie pomysli.

Proponuje za pomoca tablic ustalic szereg punktow, ktore trzeba osiagnac by dojsc do celu. Jak znajde w sobie checi to sprobuje cos takiego napisac. Podejrzewam, ze takie cos bedzie wcale dlugo liczylo te punkty (dla pozycji odleglej o 50m zakladajac, ze takie punkty liczymy co metr bedzie ich ponad 50). Trzeba bedzie rowniez napisac cos, aby robot potrafil sam wjechac np. do odgromnika (jadac na wprost ma 50% szansy, ze zahaczy o ten smieszny slupek), ale to da sie zalatwic. Fajnie by tez bylo, by robot omijal slepe uliczki. I to chyba wszystko.
_________________
 
 
     
sajmon313 
Jedi Master


Wiek: 28
Dołączył: 16 Gru 2009
Posty: 42
Skąd: /dev/uarndom
Wysłany: 25-12-2009, 09:58   

możnaby zacząć od czegoś takieggo:
Kod:
 p1=position;
 move(x);
 p2=position;
 if(p1==p2) turn(d);

przy czym d byłoby ustalane przez robota po dokładnym zbadaniu najbliższej okolicy: pochyłość terenu, inne obiekty.
_________________
Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10
 
 
     
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: 25-12-2009, 12:43   

Ja myslalem, zeby najpierw ustalic cala sciezke, a dopiero pozniej nia isc, a nie chodzic tak po kawalku. Fajnie by bylo gdyby rowniez ktos oswoil instrukcje search(), bo ona mnie sie nie slucha :(

Prosba:
Ma ktos spis obiektow w taki sposob:
Kod:

list[UraniumOre] = UraniumOre;

Albo ktos ma duzo czasu i moglby zrobic?
 
 
     
FE4R 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 25-12-2009, 13:28   

Twoje pytanie jest bez sensu, gdyż funkcja goto(); omija wszystkie przeszkody, omija wodę, budynki, ląduje robotem latającym, gdy silnik się przegrzeje. Gdy wpiszesz daną kategorię, podchodzi pod odpowiednie miejsce. Gdy wpiszesz Converter, podejdzie tak, aby postawić coś na środku. Nie stanie na środku. Gdy wpiszesz WheeledGrabber, stanie za robotem, by zmieni baterię. Nie będzie starał się na niego wjechać. A mimo to, pozycja robota, do którego podchodzisz to środek.

A omijanie obcych? Nie wpadanie do wody?
Nie lepiej najpierw obcych zabić? Można również wykorzystać program z Wyzwania -> Przetrwanie we wrogim środowisku
A co do wpadania do wody, to Berserker miał dobry pomysł w temacie AlienKiller2.
 
     
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: 25-12-2009, 14:02   

@up
Moze nie jest to mozliwe, ale jestem bardzo ciekaw, ile uda nam sie zrobic.

@topic
Jeszcze jedna prosba: jak wyliczyc orientacje wymagana w danej pozycji by zwrocic sie w kierunku pozycji docelowej? :|
_________________
 
 
     
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: 25-12-2009, 18:51   

Berserker napisał/a:
jak wyliczyc orientacje wymagana w danej pozycji by zwrocic sie w kierunku pozycji docelowej?

Kod:
direction(siedziba_microsoftu.position);
_________________
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: 25-12-2009, 20:42   

Berserker napisał/a:
Jeszcze jedna prosba: jak wyliczyc orientacje wymagana w danej pozycji by zwrocic sie w kierunku pozycji docelowej? :|

Też się zastanawiam, o co chodzi z tą zmienną 'orientation'. Dwa roboty ustawione koło siebie i skierowane w tym samym kierunku. Jeden ma orientation 43, a drugi 400 coś... myślałem, że max to jakieś 180 albo 360...
 
     
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: 25-12-2009, 21:27   

Cytat:
direction(siedziba_microsoftu.position);

Naprawde uwazasz mnie za tak glupiego, ze bym na to nie wpadl? Raz, to pokazuje kierunek a nie orientacje, a dwa, ja chce znac orientacje bez podjezdzania robotem w dane miejsce, sprawdzania kierunku i wracania...

Cytat:
Też się zastanawiam, o co chodzi z tą zmienną 'orientation'. Dwa roboty ustawione koło siebie i skierowane w tym samym kierunku. Jeden ma orientation 43, a drugi 400 coś... myślałem, że max to jakieś 180 albo 360...

Orientacja to jest "kierunek bezwzgledny", pokazuje o ile stopni jest odchylony kierunek patrzenia robota od osi x (czyli od kierunku wschodniego). Dodanie/odjecie od tej wartosci 360° w praktyce nie zmienia jej, wiec 3600° = 0°, tylko prawdopodobnie pierwszy robot zrobil 10 obrotow w lewo.
_________________
 
 
     
sajmon313 
Jedi Master


Wiek: 28
Dołączył: 16 Gru 2009
Posty: 42
Skąd: /dev/uarndom
Wysłany: 26-12-2009, 00:11   

Berserker napisał/a:
Cytat:
direction(siedziba_microsoftu.position);

Naprawde uwazasz mnie za tak glupiego, ze bym na to nie wpadl? Raz, to pokazuje kierunek a nie orientacje, a dwa, ja chce znac orientacje bez podjezdzania robotem w dane miejsce, sprawdzania kierunku i wracania...

Cytat:
Też się zastanawiam, o co chodzi z tą zmienną 'orientation'. Dwa roboty ustawione koło siebie i skierowane w tym samym kierunku. Jeden ma orientation 43, a drugi 400 coś... myślałem, że max to jakieś 180 albo 360...

Orientacja to jest "kierunek bezwzgledny", pokazuje o ile stopni jest odchylony kierunek patrzenia robota od osi x (czyli od kierunku wschodniego). Dodanie/odjecie od tej wartosci 360° w praktyce nie zmienia jej, wiec 3600° = 0°, tylko prawdopodobnie pierwszy robot zrobil 10 obrotow w lewo.

możnaby podjechac 1m do przodu, i zobaczyć jak się zmieniły x i y
Kod:

point p1,p2;
dloat dir;
p1=position;
move(1);
p2=position;
dir=atatn((p1.x-p2.x)/(p1.y-p2.y));

i kontynuując możemy dojść do wartości takiej jak w CreateObject.
_________________
Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10
 
 
     
FE4R 


Twoja ulubiona misja: Saari - Inwazja
Pomógł: 4 razy
Wiek: 24
Dołączył: 21 Paź 2009
Posty: 144
Wysłany: 26-12-2009, 00:53   

Berserker napisał/a:
Orientacja to jest "kierunek bezwzgledny", pokazuje o ile stopni jest odchylony kierunek patrzenia robota od osi x (czyli od kierunku wschodniego). Dodanie/odjecie od tej wartosci 360° w praktyce nie zmienia jej, wiec 3600° = 0°, tylko prawdopodobnie pierwszy robot zrobil 10 obrotow w lewo.

Doszedłem do tego, że 0 / 360 stopni to kierunek wschodni, ale dwa roboty prosto z fabryki skierowane w tym samym kierunku? Robiłem testy na PracticeBot, to orientation się resetowało po przekroczeniu zera / 360 stopni.

A co do sposobu sajmona, to chyba jest jakiś sposób, aby sprawdzać ten kąt bez użycia move();, np. mierzyć go na bieżąco, prawda? Jest trochę późno, więc nie mogę nic konkretnego napisać.
 
     
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: 26-12-2009, 02:35   

Cytat:
Doszedłem do tego, że 0 / 360 stopni to kierunek wschodni, ale dwa roboty prosto z fabryki skierowane w tym samym kierunku? Robiłem testy na PracticeBot, to orientation się resetowało po przekroczeniu zera / 360 stopni.

Mi sie wydaje, ze w pewnych momentach po prostu gra nie zauwaza, ze przekroczono magiczna granice pelnego kata i liczy dalej. Jesli chodzi o orientacje, to po wystarczajaco dlugim dodawaniu/odejmowaniu 360 w koncu sie wyrownaja.

Cytat:
kontynuując możemy dojść do wartości takiej jak w CreateObject.

Moze to przez godzine o ktorej pisze, ale za cholere nie rozumiem co ty napisales :P .

Chodzi mi o to, ze napisalem funkcje (ktora nie dziala, ale nvm). Wyglada ona tak:
Kod:
int object::Goto(point pos)
{
point center, dest[], F, R, L, adest;
int list[], i;
float dist, len;
float dir, orient, angle, pMax;
orient = orientation;
center = position;
pMax = 30;
len = 0.5;
pos.z = topo(pos);
do
{
F.x = center.x + cos(orient) * len;
F.y = center.y + sin(orient) * len;
F.z = topo(F);
if(atan((topo(F)-topo(center))/len) < pMax)
{
adest = F;
}
else
{
i = 0;
do
{
i++;
L.x = center.x + cos(orient+i*5) * len;
L.y = center.y + sin(orient+i*5) * len;
L.z = topo(L);
R.x = center.x + cos(orient-i*5) * len;
R.y = center.y + sin(orient-i*5) * len;
R.z = topo(R);
}
while(atan((topo(L)-topo(center))/len) > pMax and atan((topo(R)-topo(center))/len) > pMax);
if(topo(L) < topo(R)) adest = L;
else adest = R;
}
center = adest;
dest[sizeof(dest)] = adest;
if(sizeof(dest) > 1000) return 1;
dir = acos((pos.x-center.x)/distance2d(center, pos));
orient = dir+orient;

}
while(distance2d(center, pos) > 1);
i = 0;
while(distance2d(pos, position) > 1)
{
adest = dest[i++];
while(distance2d(position, adest) > 1)
{
dir = direction(adest);
motor(1-dir/90, 1+dir/90);
}
}
return 0;
}

Dziala ona tak: sprawdza ona punkt na pol metra w kierunku punktu docelowego. Jesli jest on zdatny do uzytku (wjechanie na niego jest mozliwe i nie powoduje katastrofy) to robot zapisuje go w tablicy dest. Jesli nie, sprawdza punkty na lewo i prawo, dopoki ktorys bedzie zdatny do uzytku. Teraz jednak pojawia sie problem. Od zatwierdzonego jako 'adest' punktu liczymy kolejny punkt. I w tym momencie potrzebna jest mi ta orientacja, bo nie wiem w ktorym kierunku mam zaczac liczyc kolejny punkt. Sprawdzilem za pomoca message() dystans kazdego punktu od pozycji docelowej. Zwieksza sie O_O z kazdym nowym punktem.
_________________
 
 
     
sajmon313 
Jedi Master


Wiek: 28
Dołączył: 16 Gru 2009
Posty: 42
Skąd: /dev/uarndom
Wysłany: 26-12-2009, 10:16   

Berserker napisał/a:
Moze to przez godzine o ktorej pisze, ale za cholere nie rozumiem co ty napisales

Chodzi o to że można prosto dojść do wartości np. 1.5, 1.2
A jeszcze lepiej zamiast się ruszac robotem policzyć pozycje baterii względem robota.

Znamy oriantacje bezwzględną robota (taka same jak w punkcie startowym). W pkt startowym oriantacje obliczamy porównując position robota i jego baterii
(Pożniej w kolejnym punkcie orientacja będzie taka jak obliczona w poprzednim)
I znamy pozycję do której chcemy dotrzeć, więc mozemy obliczyć orientację bezwzględną w jakiej musi znajdować się robot żeby patrzył w tę stronę.

W tej chwili nie mam czasu, ale jeszcze potestuje ten sposób w grze.
_________________
Validator CBot - Prace Trwają
Ostatnia Aktualizacja: 02.01.10
 
 
     
Wyświetl posty z ostatnich:   

Wersja do druku

Skocz do:  

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