|
Polski Portal COLOBOTa COLOBOT Polish Portal |
|
Problemy [programowanie] - "Radarowanie" pozycji
colobotwymiiata - 21-02-2009, 10:53 Temat postu: "Radarowanie" pozycji Chodzi mi o coś, co wykrywa w kolistej strefie, dookoła wybranego obiektu, np.: żeby robot sprawdzał czy w pobliżu rudy tytanu nie ma mrówki i czy można tam bezpiecznie pójść. Distance(ruda.position,mrowa.position) tutaj się nie sprawdza, bo mrówa to mrówka najbliżej robota, a nie rudy.
Fajnie by było w funkcji z wynikiem typu float.
Z góry dzięki(Jak się w ogóle da).
///Błędy! - DeiDara
adiblol - 21-02-2009, 13:01
W ogóle się da, ale będzie to dość wolno działać. Poszukaj na oficjalnej stronie Colobota.
COLOBOT - 09-02-2010, 16:33
Odświeżam, stary temat, ale pomysł zawsze się przyda. Można w łatwy sposób manipulować parametrami polecenia radar. Myślę, że obrazek wszystko wyjaśnia.
Nie jest to kolista strefa, ale i tak jest to obszar w pobliżu danego obiektu (czerwona kropka). Parametry odległości nie są trudne do określenia, jeśli chodzi o kąty to trzeba by wykombinować jakiś wzór dzięki któremu strefa działania radaru będzie jak najbardziej podobna do kwadratu.
FE4R - 09-02-2010, 19:24
COLOBOT, ludzie odkryli już funkcję search.
Wystarczy zastosować kod:
Kod: | object cel = radar(TitaniumOre);
object wrog = search(cel.position, AlienAnt);
if(distance(cel.position, wrog.position) < 35) instrukcje... |
Mrocza - 24-09-2011, 21:40
Czy instrukcja search może korzystać z tablicy?
Ostatnio miałem z tym problemy przy tworzeniu programu GrabersDefender
http://www.colobot.cba.pl...p?p=17599#17599
Berserker - 25-09-2011, 14:21
Nie, nie moze. Funkcja search() jest napisana tylko dla argumentow (int, point), funkcja radar ma zarowno (int, float, float, float, float, int, int) jak i ([] int, float float, float, float, int, int). Mozesz zawsze zdefiniowac wlasna funkcje search() (Przynajmniej powinienes moc, nie sprawdzalem w praktyce)
Mrocza - 25-09-2011, 17:02
Chyba łatwiej byłoby po prostu użyć tej funkcji kilkukrotnie. Jeżeli w tablicy elementów jest niewiele.
Berserker - 25-09-2011, 19:57
Pomysl w ten sposob: jesli pojdziesz ta trudniejsza droga to wiecej sie nauczysz. Pozniej bedziesz mogl znalezc jeszcze latwiejsza droge dzieki temu, ze wczesniej poszedles trudniejsza. Zreszta kazda osobna funkcja oznacza duzo czytelniejszy program.
Mrocza - 27-09-2011, 17:34
Nie wiem nawet jak mam się zabrać za robienie takiej funkcji.
Berserker - 27-09-2011, 21:37
2min ze stoperem w reku:
Kod: | extern void object::Rotfl()
{
object p;
int list[];
list[0] = Me;
list[1] = AlienSpider;
while(SA(list, position) != null)
{
p = SA(list, position);
turn(direction(p.position));
fire(1);
}
}
object SA(int [] list, point c)
{
object p = null;
object res = null;
int i;
float d = 1000;
for(i = 0; i < sizeof(list); i++)
{
if(list[i] == nan) continue;
p = search(list[i], c);
if(p != null)
{
if(distance2d(p.position, c) < d)
{
d = distance2d(p.position, c);
res = p;
}
}
}
return res;
}
|
Dobry przyklad jak uzywac tablic jako parametrow funkcji. Zapisac, oprawic i codziennie calowac.
Mrocza - 27-09-2011, 22:47
Zaimponowałeś mi. Szacunk
[ Dodano: 27-09-2011, 22:47 ]
Zaimponowałeś mi. Szacunek
adiblol - 28-09-2011, 00:48
Akurat to co Berserker napisał to jest łatwiejszy sposób. Trudniejszym ale możliwym jest wyznaczenie fragmentu koła.
angle = direction(pos);
dist = distance2d(pos);
I podstawiamy do radar(...) dodając jakiś margines, zależny od tego jak daleko ma to działać. Jednak to w dalszym ciągu podaje najbliższą robotowi a nie danemu punktowi. Jedyne wyjście to retobject(...) ale to jeszcze mniej wydajne niż search(...).
Berserker napisał/a: | Zapisac, oprawic i codziennie calowac. | Na pierwszy rzut oka przeczytałem "całkować"...
Berserker - 28-09-2011, 15:35
Ja przedstawilem droge trudniejsza jesli chodzi o uzyte struktury. Jak ktos tego nie rozumie to moze sie meczyc wykorzystujac narzedzia od trygonometrii po calki, zeby w radarze sie bawic, co jest latwiejsze ale bardziej czasochlonne :S A tak to jest elegancka funkcja.
Mrocza - 29-09-2011, 09:58
Ja jestem za rozwiązaniem Berserkera.
Kiedyś stanie się ono integralną częścią programu GrabersDefender.
Oczywiście za zgodą autora.
Berserker - 29-09-2011, 15:37
E? Prawa autorskie? Do jednej funkcji? A bierz, co chcesz.
|
|