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

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 :shock:

[ Dodano: 27-09-2011, 22:47 ]
Zaimponowałeś mi. Szacunek :shock:

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.

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