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] - Cel - pal!

pipok - 09-07-2009, 09:33
Temat postu: Cel - pal!
Cel - pal!
Dla początkujących


Jeśli chcemy strzelać do wroga lub innego celu:
Kod:
object wrog=radar(AlienAnt);
point cel=wrog.position;
powinniśmy upewnić się, że - prócz wystarczającego zapasu energii - spełnione są przynajmniej trzy warunki:
* cel jest w zasięgu strzału
* lufa bota jest w poziomie skierowana na cel
* lufa bota jest w pionie skierowana na cel

1. Zasięg strzału
Wystarczy sprawdzić odległość między botem a celem
Kod:
if (distance(position, cel) < 30)
{
  // cel w zasięgu
}

2. Kierunek lufy w poziomie
Nie ma możliwości programowego obrotu lufy w poziomie, dlatego konieczne jest obrócenie całego bota w kierunku celu
Kod:
turn(direction(cel));

3. Kierunek lufy w pionie
Na niewielkich odległościach tor lotu pocisku można uznać za linię prostą, wtedy lufa powinna być skierowana w pionie prosto na cel.
Odpowiedni kąt nachylenia można policzyć z prostej zależności geometrycznej, po czym obrócić lufę w pionie:
Kod:
H = cel.z - position.z;
L = distance2d(cel, position);
alfa = atan(H/L);
aim(alfa);


Warto jednak pamiętać, że powyższe trzy warunki są warunkami podstawowymi. Prócz tego warto rozważyć:
    * ograniczenie kąta obrotu lufy (można obrócić lufę o kąt od -10 do +20 stopni względem podstawy, dla działa fazowego od -20 do +45 stopni);
    * nie jest konieczne dokładne ustawienie bota na wprost celu (cel nie jest punktem geometrycznym tylko bryłą, dokładność 2 stopni w poziomie i pionie powinna wystarczyć)
    * działo nie jest botem (position.z to wysokość podstawy bota nad poziomem morza; działo jest zamontowane 1,5-2 metrów wyżej, 1-2 metry do przodu od środka podstawy, FIXME!);
    * nachylenie bota (często bot jest przechylony, np. spoczywa na nachylonym terenie, więc jego podstawa jest nachylona pod pewnym kątem; tym samym lufa ustawiona w położeniu "zero stopni" nie jest wycelowana poziomo. Ponadto, nawet kiedy bot jest skierowany w poziomie w kierunku celu, to jego przechylenie na bok (lewa/prawa) powoduje, że znajdująca się ponad podstawą lufa nie jest skierowana dokładnie w kierunku celu, ale nieco w bok);
    * widoczność celu (co jeśli cel będzie w odpowiedniej odległości, ale za górką?);
    * ruch celu (należy brać poprawkę na zmianę położenia celu: w momencie, kiedy pocisk doleci na odpowiednią odległość, ruchomy cel już nie znajduje się w miejscu, w którym był w momencie celowania)
    * linia prosta to tylko przybliżenie toru lotu pocisku (szczególnie dla działa fazowego, które może strzelać pod kątem 45 stopni; wtedy dokładniejszym modelem ruchu pocisku jest rzut ukośny, w jednolitym polu grawitacyjnym, którego torem jest parabola).
Jeśli kogoś interesuje rozwinięcie któregoś z tych tematów, niech śmiało pyta.

adiblol - 09-07-2009, 11:55

przechylenie na bok lewa/prawa mnie interesuje. Byłbym wdzięczny za przedstawienie sposobu obliczania.
pipok - 10-07-2009, 10:54

Ech! Niestety, z tym jest najwięcej rysowania, więc sporo czasu...

Przechylenie (roll)
Zacznijmy od sytuacji już rozwiązanej: bot jest skierowany na wprost celu. Znamy odległość w pionie oraz w poziomie pomiędzy botem a celem, policzyliśmy kąt, pod jakim należy podnieść lufę, żeby cel znalazł się na przedłużeniu jej osi. Tym razem spójrzmy na schemat tej sytuacji nie z boku, lecz zza bota, z tyłu (lewa część rysunku). W rzucie na płaszczyznę rysunku cel leży na pionowej osi przechodzącej przez podstawę bota, na wysokości H.

Wyobraźmy sobie teraz, że bot się przechylił na prawy bok. Wówczas cel znajdzie się po lewej stronie osi lufy i nieco niżej niż poprzednio (prawa część rysunku). Bez zmiany układu odniesienia, związanego z poziomą płaszczyzną powierzchni morza, możemy wyliczyć nową wysokość celu względem płaszczyzny podstawy bota oraz odchylenie w poziomie. Kąt beta to roll, kąt przechylenia bota.
Kod:
H1 = H*cos(beta)
Y1 = H*sin(beta)
Dla wygody dalszych kroków zmieńmy teraz układ odniesienia, tak żeby oś pionowa znowu pokrywała się z pionowa osią bota (zob. lewa część rysunku poniżej):

Ponieważ wysokość celu względem bota uległa zmianie i wynosi teraz H' zamiast H, powinniśmy policzyć nowy kąt pionowy między botem a celem (prawa część rysunku, kąt gamma), czyli pożądane nachylenie lufy. Odległość D pomiędzy botem a celem pokazaliśmy już na szkicu zamieszczonym w pierwszej notce, omawiającej najprostszy przypadek, kiedy płaszczyzna podstawy bota jest równoległa do płaszczyzny powierzchni morza. Ponieważ bot się tylko obrócił, odległość D nie uległa zmianie, na podstawie naszego pierwszego szkicu (patrz wyżej, 9 lipca 2009, 9:33) mamy:
Kod:
H/D = sin(alfa)
H = D*sin(alfa)
stąd
Kod:
H1 = H*cos(beta) = D*sin(alfa)*cos(beta)
korzystając z rysunku pokazującego kąt gamma:
Kod:
sin(gamma) = H1/D
sin(gamma) = D*sin(alfa)*cos(beta) / D
Ostatecznie:
Kod:
gamma = asin( sin(alfa)*cos(beta) )
Jak dużo zmienia ta poprawka, przyjęcie kąta nachylenia lufy gamma zamiast kąta alfa, jak poprzednio? Jeśli przy wypoziomowanym bocie cel był widoczny pod kątem 20 stopni, to po obróceniu się bota o 20 stopni na bok cel jest widoczny pod kątem 18,7 stopni. Co przy odległości do celu równej 40 metrów daje metr różnicy w pionie.

Pozostaje nam poziome odchylenie celu od osi lufy. Niestety, w skrypcie nie możemy obracać lufy w płaszczyźnie pionowej względem podstawy, co pozwoliłoby na zniwelowanie odchylenia pojawiającego się w postaci niezerowej wartości Y'. Trzeba będzie obrócić całego bota.
potrzebujemy kąta obrotu w płaszczyźnie podstawy bota.
Z rysunku mamy:
Kod:
X/S = cos(epsilon)

S/D = cos(gamma)
S = D*cos(gamma)
Skąd wziąć brakującą do wyliczenia kąta epsilon długość X? Wystarczy na rysunku umieścić trójkąt o bokach D, L, H, którym zajmowaliśmy się poprzednio (patrz wyżej, 9 lipca 2009, 9:33), zanim bot przechylił się na bok:


X to po prostu dobrze nam znane L - to jest ten sam odcinek. Mamy zatem:
Kod:
L/D = cos(alfa)
L = D*cos(alfa)
skąd:
Kod:
cos(epsilon) = X/S = ( D*cos(alfa) ) / ( D*cos(gamma) )
cos(epsilon) = cos(alfa)/cos(gamma)
epsilon = acos ( cos(alfa)/cos(gamma) )
Mamy więc rozwiązanie? Wystarczy obrócić bota o kąt epsilon? Niestety, niezupełnie. Drobna zagwozdka polega na tym, że epsilon to pożądany kąt obrotu w płaszczyźnie podstawy bota, przechylonej o kąt beta w stosunku do poziomej powierzchni morza. Służąca do obracania bota funkcja turn() obraca bota o zadany kąt, ale... mierzony na poziomej płaszczyźnie morza.
Do rozwiązania tego posłużymy się rysunkiem w układzie związanym z poziomą powierzchnią. Kąt epsilon został znacznie powiększony, dla poprawienia czytelności rysunku:
Kod:
Z1/Y1 = sin(beta)
Y1/S = sin(epsilon)
Z1/S = sin(fi)
stąd:
Kod:
sin(fi) = ( Y1*sin(beta) ) / ( Y1/sin(epsilon) )
sin(fi) = sin(beta)*sin(epsilon)
fi = asin( sin(beta)*sin(epsilon) )

Kod:
R/S = cos(fi)
L/S = cos(epsilon)
L/R = cos(delta)
stąd:
Kod:
cos(delta) = (S*cos(epsilon) ) / ( S*(cos(fi) )
cods(delta) = cos(epsilon)/cos(fi)
delta = acos( cos(epsilon)/cos(fi) )
Otrzymany kąt delta jest poszukiwanym przaz nas rzutem kąta epsilon, leżącego w płaszczyźnie podstawy bota, na płaszczyznę poziomą.

Kod wynikowy
Fragment kodu obsługującego poprzeczne przechylenie bota wygląda zatem tak (z poprawkami wynikającymi z własności funkcji cos()):
Kod:
wrog=radar(AlienAnt);
cel=wrog.position;    // punkt, do ktorego celujemy
turn(direction(cel)); // obroc w kierunku celu
alfa = atan( (cel.z - position.z) / distance2d(position, cel) ); // kat pionowy na cel, wstepnie

beta = roll;   // kąt przechylenia bota na bok (lewa/prawa)

gamma = asin( sin(alfa)*cos(beta) ); // skorygowany kat pionowy na cel
e = acos ( cos(alfa)/cos(gamma) ); if (alfa<0)  e = -e;
f = asin( sin(beta)*sin(epsilon) );
delta=0;
if (cos(fi)!=0)
  delta = acos( cos(epsilon)/cos(fi) );
if (f<0)  delta = -delta;

turn(delta);
aim(gamma);
// jeśli udało się podnieść lufę o zadany kąt, to bot jest już gotowy do strzału
Ważne
Obliczenia przeprowadziliśmy przy dwóch bardzo istotnych założeniach:
* wartość przechylenia roll wzięta w sytuacji, kiedy bot jest obrócony w kierunku celu, tj. gdy direction(cel)==0.
* ignorujemy pochylenie bota w osi przód-tył względem poziomej płaszczyzny, tj. zakładamy, że pitch==0.

Abadon - 10-07-2009, 11:31

Brawo pipok, masz profesjonalne podejście do sprawy. Mam pytanie czy czasem nie uczyłeś się z jakiegoś podręcznika, bo jakoś znajomo wygląda?

P.S Te rysunki robiłeś za pomcą programu "wykresik"?

pipok - 10-07-2009, 11:48

Abadon napisał/a:
czy czasem nie uczyłeś się z jakiegoś podręcznika, bo jakoś znajomo wygląda?
Dawno temu uczyłem się geometrii analitycznej, ale z czego, to już nie pamiętam.
Cytat:
Te rysunki robiłeś za pomcą programu "wykresik"?
GIMP 2.2 plus myszka i klawiatura plus głowa. Wiem, że nieoptymalnie :)
Bartek c++ - 10-07-2009, 21:32

yyyyyyyyyyyyyyyyyyyyyyyyyyyyy! co tu pisze do diabła!!!!!!!!!!!!!


//jest napisane, a nie "co tu pisze"! - Abadon

Schocker - 11-07-2009, 10:24

@Bartek c++: Nie dziwię się, że nie rozumiesz, ale mogłeś nie pisać takiego postu, tylko poprosić o wytłumaczenie. Choć nie jestem pewien, czy da się to łatwiej opisać, to są dość skomplikowane rzeczy, przynajmniej dla kogoś w Twoim wieku.
@Pipok: Mnie natomiast interesuje sprawa widoczności celu. Mógłbyś o niej dokładniej napisać? ^^;

adiblol - 11-07-2009, 11:25

Widoczność celu - trzeba wyliczyć punkty na linii działo-wróg i funkcją topo sprawdzać czy nie zasłaniają one linii strzału; przyda się interpolacja.
Zgadłem?

shoter - 11-07-2009, 11:31

Bartek c++ napisał/a:
yyyyyyyyyyyyyyyyyyyyyyyyyyyyy! co tu pisze do diabła!!!!!!!!!!!!!

Dajcie mu już bana...ja także tego nie rozumiem ale nie pisze durnych postów jak ten debil!
// już ma warna :) -adiblol

karpol - 11-07-2009, 13:54

Ja też 11, a jakoś rozumiem nawet coś.
pipok - 11-07-2009, 14:23

Kierunek (direction), przechylenie (roll) i pochylenie (pitch)
Ogólniejszym przypadkiem jest występujące równoczesnie przechylenie bota na bok (roll) i pochylenie w osi przód-tył (pitch). Po prostu podstawa bota jest na ukos względem poziomej powierzchni morza. Jeśli do tego zażyczymy sobie, żeby obrót bota w kierunku celu był wykonywany raz (por. poprzednie rozwiązanie, dla samego przechylenia), to otrzymamy następujący fragment programu:
Kod:
wrog=radar(AlienAnt);
cel=wrog.position;
azymut = direction(cel);
alfa = atan( (cel.z-position.z)/distance2d(position, cel) );

// -- poprawka na nachylenie terenu
pitchK = pitch*cos(azymut) - roll*sin(azymut);
rollK  = roll*cos(azymut)  + pitch*sin(azymut);
alfa = alfa - pitchK;
beta = rollK;
gamma = asin( sin(alfa)*cos(beta) );
e = acos ( cos(alfa)/cos(gamma) ); if (alfa<0)  e = -e;
f = asin( sin(beta)*sin(epsilon) );
delta=0;
if (cos(fi)!=0)
  delta = acos( cos(epsilon)/cos(fi) );
if (f<0)  delta = -delta;
azymut = azymut + delta;
alfa=gama;
// -- koniec poprawki

turn(azymut);
aim(alfa);

if (alfa > -20) && (alfa < 45) {  // ograniczenia kąta obrotu lufy dla działa fazowego
  fire(0.1);
}

Jak widać, różni się od kodu dla samego przechylenia roll zaledwie kilkoma istotnymi linijkami. Najważniejsze to:
Kod:
pitchK = pitch*cos(azymut) - roll*sin(azymut);
rollK  = roll*cos(azymut)  + pitch*sin(azymut);
alfa = alfa - pitchK;
Pierwsze dwie linijki to przeliczenie kątów pochylenia i przechylenia na takie, jakie będą po obrocie bota w kierunku celu. Zmienią się, bo jeśli spoczywający na ziemi bot jest przechylony np. do góry i na lewy bok (leży na zboczu, skierowany w górę), a cel jest dokładnie za nim, to po obrocie o 180 stopni będzie przechylony w dół i na prawy bok (leży na zboczu, skierowany w dół).
Trzecia linijka to pomniejszenie wysokości kątowej celu o kąt pochylenia bota w osi przód-tył.
Na razie nie dokładam rysunków ani sposobu uzyskania wzorów z tych linijek. Chyba że ktoś będzie naprawdę zainteresowany :)

---------------------------------------------------------------------------------------------------
EDIT: o widoczności
Zgadłeś, adiblol :) Właściwie, nie da się inaczej rozwiązać, bo bot nie ma do dyspozycji modelu całego terenu, w postaci jakiejś siatki wielokątów. Może tylko badać pojedyncze punkty.
---------------------------------------------------------------------------------------------------

pipok - 15-07-2009, 10:30

Widoczność
Mimo że cel jest w zasięgu strzału bota, to może być niedostępny dla pocisku. Taka sytuacja zachodzi, kiedy na linii strzału znajduje się wzniesienie terenu, oddzielające bota od celu. Kiedy zakładamy płaski tor pocisku (odcinek linii prostej), wówczas równie dobrze możemy mówić o problemie widoczności celu. Jak sprawdzić, czy cel jest widoczny?

Posłużymy się szkicem podobnym do pokazanego w części ogólnej:

Jeżeli linia łącząca bota i cel przecina powierzchnię terenu, to mamy do czynienia z brakiem widoczności celu. Niestety, nasz bot nie dysponuje wzorem opisującym teren, może tylko badać pojedyncze punkty przestrzeni. Weźmy kilka punktów leżących na odcinku łączącym pozycję bota z celem. Jeśli chociaż jeden z nich leży poniżej poziomu gruntu, to znaczy, że część toru pocisku przechodzi pod ziemią. Wtedy cel nie jest widoczny, lecz zasłonięty nierównością terenu - pocisk trafi w grunt i nie dotrze do celu.

W jaki sposób dowiedzieć się, czy dany punkt leży na powierzchni terenu, ponad nią czy pod nią? W języku programowania botów istnieje funkcja topo(), zwracająca dla podanej pozycji wysokość gruntu ponad poziomem morza.

Jeżeli współrzędna z danego punktu (wysokość ponad poziomem morza) jest większa niż wysokość gruntu nad poziomem morza w tym miejscu, to punkt leży ponad terenem. Jeśli mniejsza, to pod powierzchnią terenu:
Kod:
if ( pkt.z < topo(pkt) ) // punkt pod powierzchnią terenu
Sprawdzimy ten warunek dla każdego z punktów umieszczonych przez nas na linii bot-cel. Do tego potrzebujemy znać ich położenie, czyli wyznaczyć współrzędne pierwszego punktu, drugiego, trzeciego...
Odległość pomiędzy botem a celem wyznaczamy korzystając z gotowej, dostępnej w języku programowania botów funkcji distance, podającej odległość pomiędzy dwoma punktami w przestrzeni:
Kod:
D = distance(position, cel);
Różnica wysokości pozycji bota i celu to różnica współrzędnych z (wysokości ponad poziomem morza) obu punktów
Kod:
H = cel.z -  position.z;
Powiedzmy, że odległość D pomiędzy botem a celem wynosi 30 metrów, a badane punkty rozmieściliśmy jak na rysunku, dzieląc odcinek na 5 równych części, po 6 metrów każda. Pierwszy punkt leży w 1/5 całkowitej odległości między celem a botem, a więc znajduje się wyżej od bota o 1/5 całkowitej różnicy wysokości między celem a botem. Jeżeli różnica wysokości H wynosi 10 metrów, to pierwszy punkt znajduje się H/5 = 2 metry wyżej niż bot. Jego wysokość nad powiomem morza wynosi więc:
Kod:
pkt1.z = position.z + (H/5);
Dla drugiego punktu:
Kod:
pkt2.z = position.z + 2*(H/5);
dla trzeciego:
Kod:
pkt3.z = position.z + 3*(H/5);
Podobnie zachodzi dla pozostałych współrzędnych.

Możemy już napisać kawałek kodu funkcji badającej widoczność. Jako parametr pobiera punkt, którego widoczność sprawdzamy; jako wynik zwraca wartośc logiczną - czy punkt jest widoczny.
Kod:
public boolean object::widocznosc(point cel)
{
[...]
   // petla po kolejnych punktach, az do osiagniecia celu
   // odleglosc D jest podzielona na 5 rownych czesci
   for (int i=D/5; i < D; i=i+D/5)
   {
      // wspolrzedne badanego punktu
      pkt.x = position.x + (i * (cel.x - position.x) / 5);
      pkt.y = position.y + (i * (cel.y - position.y) / 5);
      pkt.z = position.z + (i * (cel.z - position.z) / 5);
      // sprawdzenie czy punkt lezy nad czy pod gruntem
      if (pkt.z < topo(pkt)) return false;
   }
   return true;
}
Dlaczego dzielić odległość od celu akurat na 5 części? Możemy podzielić na 10 lub 20. Możemy też podzielić odległość D na odcinki metrowej długości, wszystko jedno, ile ich będzie. Właśnie: ile będzie takich odcinków? Jeśli D=25, to 25, jeśli D=40, to 40, oczywiście. W takim razie
Kod:
z1m = H/D = (cel.z-position.z)/D
jest przyrostem wysokości dla odcinka o długości 1 metra. A jeżeli odległość D podzielimy na odcinki 3-metrowe? Wtedy przyrost wysokości będzie 3 razy większy
Kod:
z3m = 3*z1m = 3 * (cel.z-position.z)/D
Przyjmijmy ogólniej, że punkty rozstawiamy co odc metrów, tyle ile zechcemy. Tę liczbę będziemy podawać jako parametr funkcji:
Kod:
// 'odc' - odleglosc pomiędzy kolejnymi sprawdzanymi punktami na linii bot-cel
public boolean object::widocznosc(point cel, int odc)
{
   point pkt;
   float D;
   float x1m, y1m, z1m;
   
   D = distance(position, cel);

   // zmiana współrzędnych na kazdym odcinku
   x1m = (cel.x - position.x) / D;
   y1m = (cel.y - position.y) / D;
   z1m = (cel.z - position.z) / D;
     
   // petla po kolejnych punktach, az do osiagniecia celu
   // punkty dziela odleglosc D na odcinki o dlugosciach
   // 'odc' metrow kazdy
   for (int i=odc; i < D; i=i+odc)
   {
      // wspolrzedne badanego punktu
      pkt.x = position.x + (i * x1m);
      pkt.y = position.y + (i * y1m);
      pkt.z = position.z + (i * z1m);
      // sprawdzenie czy punkt lezy ponizej poziomu gruntu
      if (pkt.z < topo(pkt)) return false;
   }
   return true;
}
Im odc jest mniejsze, tym dokładniejsze będzie sprawdzenie. Dla punktów rozstawionych co 10 metrów wynik "Ok, cel widoczny" może być niezgodny z rzeczywistością. Z drugiej strony, do sprawdzenia punktów w odstępach 1 metra potrzeba więcej obliczeń ogółem, bo po prostu punktów jest więcej. Jeżeli dodatkowo analizowana odległość między botem a celem jest bardzo duża, może się okazać, że wywołanie funkcji spowoduje spowolnienie programu. Możemy wówczas zmniejszyć parametr do 5 metrów, ewentualnie 3 metrów lub użyć funkcji ipf(), zwiększającej szybkość, z jaką bot interpretuje kod programu.

colobotwymiiata - 17-08-2009, 14:37

Jesteś wielki ;)
Reaper - 01-10-2009, 07:23

Schocker napisał/a:
@Bartek c++: Nie dziwię się, że nie rozumiesz, ale mogłeś nie pisać takiego postu, tylko poprosić o wytłumaczenie. Choć nie jestem pewien, czy da się to łatwiej opisać, to są dość skomplikowane rzeczy, przynajmniej dla kogoś w Twoim wieku.
@Pipok: Mnie natomiast interesuje sprawa widoczności celu. Mógłbyś o niej dokładniej napisać? ^^;



No nieee? :<

Ale tak tak, poradnik jest świetny !
'le nadal uważam, że początkujący powinni się uczyć ze starej dobrej SatCom :P 'le 'le dla leniwych to już nic nie mówię ;)

FE4R - 21-10-2009, 20:26

Ja natomiast stworzyłem taki oto program:

Kod:
extern void object::Adjust()
{
while(true)
{
object x;

float h, a, c, n;

x = radar(Me);

h = x.position.z - topo(x.position);

a = distance2d(x.position, position);

c = a/h;

c = tan(n);

aim(n);
}
}


Jego funkcją z założenia było, aby działo organiczne dostosowywało swoją lufę do wysokości i odległości od celu, a w zasięgu 40 metrów po prostu do niego wypaliło cały czas sprawdzając czy poziom lufy jest zgodny. Jednak zmienna nie została zadeklarowana, przynajmniej tak mi mówi komunikat w grze. Nie wiem jaki jest błąd. W teorii to równanie:

c = a/h;
c=tan(n);
aim(n);

jest poprawne, a jednak - nie działa.

Jakieś propozycje?

pipok - 22-10-2009, 14:03

Kod:
x = radar(Me);

h = x.position.z - topo(x.position);

a = distance2d(x.position, position);

c = a/h;
Tutaj zmienna h zawiera wysokość astronauty nad poziomem gruntu, jaki jest w miejscu gdzie się znajduje. To nie jest właściwe celowanie. To powinna być różnica wysokości astronauty i bota, względem tego samego poziomu odniesienia:
Kod:
h = x.position.z - position.z;



FE4R napisał/a:
W teorii to równanie:
c = a/h;
c=tan(n);
jest poprawne
Pomieszałeś matematyczny symbol równości z operatorem przypisania z języka programowania COLOBOTA. Oba zapisuje się znakiem '='.

To jest poprawny układ równań matematycznych :
Kod:
c = a/h
c = tan(n)
ale jako sekwencja instrukcji programu, nakazujących przypisanie wartości zmiennym, jest niedobre. W drugiej linijce nakazujesz, żeby program zmiennej c nadał wartość funkcji tangens dla argumentu n. Tylko że nigdzie wcześniej nie określiłeś, jaką wartość ma to n... Więc co ma wziąć, co ma wpisać do c w tej linijce? Tymczasem to właśnie kąt n masz policzyć, to jest ten nieznany kąt, o jaki trzeba nachylić lufę. Ale nigdzie go nie obliczasz...

Mamy wyliczoną wartość c i wiemy, że
Kod:
c = tan(n)
teraz szukamy n. Trzeba skorzystać z funkcji odwrotnej do funkcji tangens:
Kod:
c=tan(n) => n=atan(c)
Program powinien wyglądać tak:
Kod:
c = a/h;
n = atan(c);
aim(n);
To jest podane gotowe - łącznie z rysunkiem - w pierwszym liście tego tematu. Dokładnie to samo, co próbowałeś nam pokazać swoim programem. Z tą różnicą, że poprawnie zrobione :)

FE4R - 23-10-2009, 15:16

Poniewaz moja trygonometria jest na poziomie gimnazjalnym, czyli dosc niskim, moglbys mi przyblizyc, co dokladnie oznacza funkcja 'atan', zamiast 'tan'?

A celem c=tan(n), bylo aby program obliczyl z jakiego kata tangens rowna sie a/h i ustawil lufe pod tym katem.

PS. Wybrobowalem twoj program w domu na swoim robocie i jest on troche niedokladny, znaczy sie -lufa nie podarza za celem. Dam link do filmu jak wroce ze szkoly(co jest powodem mojego pisania bez polskich znakow, za co przepraszam).

DemoLisH - 23-10-2009, 15:22

atan to arctangens czyli odwrotność tangensa, zamienia wartość tangensa na kąt
FE4R - 23-10-2009, 17:52

A oto i film z problemem
http://www.youtube.com/watch?v=_oZwWoCf1Mc

pipok - 27-10-2009, 06:25

FE4R napisał/a:
moglbys mi przyblizyc, co dokladnie oznacza funkcja 'atan', zamiast 'tan'?
atan() to ARCUS tangens, funkcja odwrotna do funkcji tangens. Czyli: atan(a/h) zwraca kąt, którego tangens równa się a/h.
FE4R napisał/a:
Wybrobowalem twoj program w domu na swoim robocie i jest on troche niedokladny, znaczy sie -lufa nie podarza za celem.
Hej, ale kod, który jest podany w pierwszym liście wątku to kod podstawowy, dla początkujących. Działa poprawnie przy pewnych założeniach. To jest najprostszy kod dla celowania. W szczególności nie obejmuje poprawek na ruch celu ani na przechylenie bota.

W Twojej sytuacji cel się porusza. To znaczy, że po uzyskaniu pozycji celu i obliczeniu kąta wzniesienia lufy, powiedzmy 20º, bot zaczyna wykonywać funkcje aim(20). Ale obrót lufy jest dość powolny. Zanim lufa osiągnie zadane pochylenie, to cel znajdzie się już w innym miejscu. Lufa ugania się za cieniem celu. Postaw bota celującego na płaskim terenie, a bota-cel na jakiejś górce, nieruchomo, i sprawdź czy lufa poprawnie go namierza.

FE4R - 27-10-2009, 10:46

No akurat na nieruchomy cel ten program będzie działał, ale rzadko który cel jest nieruchomy.
Chciałem stworzyć program to obrony przed osami. Mógłbym ustawić działo na najwyższy kąt, ale to będzie chronić jedynie samego robota, a nie wszystkie przyjazne obiekty w promieniu strzału ~40 metrów.
Czy zatem powinienem jakoś zwiększyć precyzję robota? A może przyśpieszyć interpretowanie linijek?

adiblol - 27-10-2009, 14:23

FE4R napisał/a:
A może przyśpieszyć interpretowanie linijek?

To nic nie da, bo nie da się przyspieszyć fizyki w grze.

FE4R - 28-10-2009, 00:19

Chociaż z filmu wynika, iż lufa robota nie podąża za celem ani jego cieniem, bo unosi się na wysokość, na której robot wcale nie był. Więc uważam, że to problem z obliczeniami.
pipok - 28-10-2009, 14:01

FE4R napisał/a:
z filmu wynika, iż lufa robota [...] unosi się na wysokość, na której robot wcale nie był. Więc uważam, że to problem z obliczeniami.
Powiadam Ci - bota śledzącego postaw na płaskim podłożu, a cel utrzymaj w stałym położeniu i upewnij się, że to rzeczywiście problem z obliczeniami. Jeśli celowanie działa poprawnie dla nieruchomego celu, to znaczy, że "obliczenia" są ok. Przełącz kamerę na widok z zewnątrz i strzel, żeby się upewnić. Zawsze programy dla botów bojowych obserwuj z zewnętrznej kamery, a nie z perspektywy bota. Niestety, widok z kamery pokładowej bota powoduje problemy z celowaniem (jeśli dobrze pamiętam, nie jest w nim uwzględniane istnienie pochylenia, pitch).
Bartek c++ - 30-10-2009, 10:18

shoter napisał/a:
Bartek c++ napisał/a:
yyyyyyyyyyyyyyyyyyyyyyyyyyyyy! co tu pisze do diabła!!!!!!!!!!!!!

Dajcie mu już bana...ja także tego nie rozumiem ale nie pisze durnych postów jak ten debil!
// już ma warna :) -adiblol

Nie jestem Debilem Shooter!!!!!!!!!!!!!!!!

adiblol - 30-10-2009, 12:44

Bartek c++ napisał/a:
Nie jestem Debilem Shooter!!!!!!!!!!!!!!!!

Na podstawie powyższego śmiem twierdzić, że jesteś. Shoter z jakiegoś powodu napisał swój nick przez jedno "o" i nie musisz go poprawiać. Poza tym nie używaj tylu wyrzykników. 3..4 wystarczą. Napisałeś "Debilem" z wielkiej litery, dlaczego?

Poza tym poprawiasz się, już wszyscy zapomnieli o tamtym poście, a tu taka plama :roll: .

Bartek c++ - 07-11-2009, 14:56

Wtedy tego nie rozumiałem przepraszam.
Berserker - 18-11-2009, 22:27

Jakby ktos specjalnie dla mnie znalazl odleglosc uderzania w ziemie pocisku dziala fazowego od samego dziala (bez tych wszystkich odbic) to bym nawet sklecil program do obliczania kata nachylenia lufy :)

@edit

Kod:
float object::PhazerAngle(point a, point b)
{
float dist, dist2d, angle;
dist2d = distance2d(a, b)-10;
angle = asin(dist2d/50)/2;
return angle;

}


Wersja nadajaca sie do celowania tylko na plaskim terenie, dzisiaj po poludniu moze zrobie jeszcze dla latajacych, a z reszta mozecie sie pomeczyc sami :)

pipok - 19-11-2009, 09:20

Cytat:
Kod:
float object::PhazerAngle(point a, point b)
{
float dist, dist2d, angle;
dist2d = distance2d(a, b)-10;
angle = asin(dist2d/50)/2;
return angle;

}


Berserker, z czego wynikają wzory w tej funkcji? Skąd jest wzięta stała -10, stała 50, stała 2? Dlaczego jest użyty akurat arcus sinus?
Mnie to wygląda na przypadkowy kod :)

Berserker - 19-11-2009, 13:21

[code]l = Vo^2 * sin2alfa/g[code]
Wzor na zasieg w rzucie ukosnym.
Jak sama nazwa wskazuje, arcus sinus sluzy do obliczania kata posiadajac sinus danego kata.
Za g podstawilem 10 (w koncu testowalem na Ziemi), Vo^2 wyszlo 500, niby wynik kosmiczny ale nie wnikam, stale to stale.
Wiec po przeksztalceniu:
[code]sin2alfa = l * g/Vo^2[/code]
Stala -10 zostala dodana po tescie, pocisk po prostu lecial nad celem i taka mrowke czy robala to by nie trafil. Nauczylem sie nie polegac na stalych w colobocie ze wzgledu na ogromna niedokladnosc wynikow O_O

pipok - 19-11-2009, 13:58

Berserker napisał/a:
Kod:
l = Vo^2 * sin2alfa/g
Wzor na zasieg w rzucie ukosnym.
Ok.
Berserker napisał/a:
Za g podstawilem 10 (w koncu testowalem na Ziemi)
He, he! A skąd wiesz, że przyspieszenie grawitacyjne w Colobocie wynosi chociaż z dokładnością do rzędu wielkości tyle samo?
Berserker napisał/a:
Vo^2 wyszlo 500, niby wynik kosmiczny ale nie wnikam, stale to stale.
Z czego wyszło? ;) Weźże podaj, jak uzyskałeś tę wartość :)

Berserker napisał/a:
Wiec po przeksztalceniu:
Kod:
sin2alfa = l * g/Vo^2
Wzór poprawny.

Berserker napisał/a:
Stala -10 zostala dodana po tescie, pocisk po prostu lecial nad celem i taka mrowke czy robala to by nie trafil.
Znaczy, coś jest nie tak z założeniami. Albo stałe są błędnie przyjęte, albo... Czy wziąłeś pod uwagę, że działo jest jakieś 2m ponad poziomem platformy bota i jakieś 1,5-2m do przodu względem centralnego punktu podstawy? Wszystkie współrzędne bota (.position) odnoszą się do podstawy, nie do działa.

Berserker napisał/a:
Stala -10 zostala dodana po tescie,
No i ślag trafił babcyne gęsi!
Najpierw korzystasz ze wzoru teoretycznego, do którego potrzebujesz znajomości dwóch stałych. Jedną bierzesz z sufitu, drugą - nie wiem skąd? Pewnie z testów? Ale chyba nie... Bo po sprawdzeniu praktycznym dokładasz do wzoru trzecią stałą, modyfikując go sobie w dowolnie (czytaj: z sufitu) wybrany sposób. Bo skąd wiesz, że lepsza poprawką jest odjąć 10 metrów od odległości, a nie np. przemnożyć odległość przez jakąś stałą? Albo przyjąć mniejszą (lub większą) wartość przyspieszenia grawitacyjnego? Albo inną prędkość pocisku? Albo skorygować kąt o jakąś stałą?

Berserker - 19-11-2009, 15:02

Cytat:
Wzór poprawny.

Wytlumacz mi, dlaczego traktujesz mnie jako swojego ucznia (czyt. oceniasz poprawnosc tego co pisze w sposob jakby to byl sprawdzian). Uwierz mi, umiem na tyle matematyke i fizyke, ze nie musisz sprawdzac po kolei poprawnosci tego co pisze ("a moze tu sie pomylil w odejmowaniu! hehehe...")
Cytat:
He, he! A skąd wiesz, że przyspieszenie grawitacyjne w Colobocie wynosi chociaż z dokładnością do rzędu wielkości tyle samo?

Cytat:
Najpierw korzystasz ze wzoru teoretycznego, do którego potrzebujesz znajomości dwóch stałych. Jedną bierzesz z sufitu, drugą - nie wiem skąd? Pewnie z testów?

Nie musze znac dokladnie predkosci ani przyspieszenia, wazny jest sam stosunek tych dwoch stalych. Jedyne co musialem zdobyc to odleglosc na jaka strzela dzialo fazowe przy kacie 45 stopni. Niestety umiem myslec, wiec wymyslilem. Dzialo stanelo w odleglosci 70m od obiektu, jechalo gapiac sie w niebo do przodu i strzelalo az trafilo, wtedy pobieralo odleglosc i ja podawalo. Jesli chcesz wiedziec to jest to 50m.
Mamy:
Kod:

50 = V^2/g
V^2 = 50g

--Po podstawieniu do wzoru--
sin2alfa = l * g/V^2
sin2alfa = l * g/50g
sin2alfa = l/50

Trudne?

Cytat:
Bo po sprawdzeniu praktycznym dokładasz do wzoru trzecią stałą, modyfikując go sobie w dowolnie (czytaj: z sufitu) wybrany sposób.

Jesli wysokosc robaka jest odczytywana przez robota jako mniejsza niz wysokosc astronauty, to spokojnie mozna uznac za wzor:
Kod:
float object::PhazerAngle(point a, point b)
{
float dist, dist2d, angle;
dist2d = distance2d(a, b);
angle = asin(dist2d/50)/2;
return angle;
}

Niektorzy madrzy ludzie, ktorzy umieja zaokraglac zeby ulatwic sobie zycie potrafia zauwazyc, ze pociski fazera sie odbijaja, i wykorzystac to.

Cytat:
Czy wziąłeś pod uwagę, że działo jest jakieś 2m ponad poziomem platformy bota i jakieś 1,5-2m do przodu względem centralnego punktu podstawy? Wszystkie współrzędne bota (.position) odnoszą się do podstawy, nie do działa.

Ciezko nie zauwazyc, skoro piszesz o tym w co drugim swoim poscie.
Na oko oceniajac, dzialo jest 1m wyzej niz 'podstawa' robota i 2.5m do przodu. 2.5m do przodu oznacza, ze od dystansu mozna odjac cale 2.5m (Q__Q); o wiele ciekawiej jest, jesli chodzi o wysokosc, bo dystans program liczy nie uwzgledniajac wspolrzednej z, wiec nalezy jeszcze uwzglednic wysokosc samego robota, kolejne 2m?. Nie chce mi sie tego liczyc, wiec po prostu mozna odjac 3m zakladajac, ze na mniejsze odleglosci nie bedzie to mialo znaczenia, a na wieksze mozna wyliczyc z pitagorasa zakladajac trojkat prostokatny o kacie ostrym 45°.

Btw, liczylem wzor uwzgledniajacy wysokosc (na cele latajace), i patrzac na to co teraz wychodzi, to obawiam sie, ze moge sie nie doliczyc.

pipok - 19-11-2009, 18:49

Berserker napisał/a:
Nie musze znac dokladnie predkosci ani przyspieszenia, wazny jest sam stosunek tych dwoch stalych. Jedyne co musialem zdobyc to odleglosc na jaka strzela dzialo fazowe przy kacie 45 stopni. [...] Jesli chcesz wiedziec to jest to 50m.
Wiem, ile wynosi ta odległość. Wiem też, jaka jest prędkość pocisków w Colobocie, więc wiem także, ile wynosi przyspieszenie. Mam to w notatkach sprzed pięciu lat.

Berserker napisał/a:
Cytat:
Bo po sprawdzeniu praktycznym dokładasz do wzoru trzecią stałą, modyfikując go sobie w dowolnie (czytaj: z sufitu) wybrany sposób.

Jesli wysokosc robaka jest odczytywana przez robota jako mniejsza niz wysokosc astronauty, to spokojnie mozna uznac za wzor:
Kod:
float object::PhazerAngle(point a, point b)
{
float dist, dist2d, angle;
dist2d = distance2d(a, b);
angle = asin(dist2d/50)/2;
return angle;
}

Non sequitur. Przesłanka, pokolorowana przeze mnie na niebiesko, nie ma żadnego logicznego związku wnioskiem, z poprawnością wzoru, która ponoć z niej właśnie wynika. A już zupełnie nijak ma się do mojego zdania, do którego zdaje się być komentarzem.

Berserker napisał/a:
Niektorzy madrzy ludzie, ktorzy umieja zaokraglac zeby ulatwic sobie zycie potrafia zauwazyc, ze pociski fazera sie odbijaja, i wykorzystac to.
Non sequitur. Z umiejętności zaokrąglania nie wynika nic dotyczącego odbijania się pocisków ani na odwrót.

Nadal nie wiadomo, dlaczego poprawkę na rozbieżność eksperymentu z przyjętym wzorem wprowadziłeś akurat przez odjęcie 10 metrów od odległości, a nie w inny sposób? Bo jakoś NIE napisałeś.
Czy w eksperymencie w ogóle była jakaś rozbieżność? Skąd się wzięła?...

Berserker napisał/a:
Uwierz mi, umiem na tyle matematyke i fizyke, ze nie musisz sprawdzac po kolei poprawnosci tego co pisze
A jednak sprawdzę:
Berserker napisał/a:
Nie musze znac dokladnie predkosci ani przyspieszenia, wazny jest sam stosunek tych dwoch stalych. Jedyne co musialem zdobyc to odleglosc na jaka strzela dzialo fazowe przy kacie 45 stopni. Dzialo stanelo w odleglosci 70m od obiektu, jechalo gapiac sie w niebo do przodu i strzelalo az trafilo, wtedy pobieralo odleglosc i ja podawalo. Jesli chcesz wiedziec to jest to 50m.
Mamy:
Kod:

50 = V^2/g
V^2 = 50g

--Po podstawieniu do wzoru--
sin2alfa = l * g/V^2
sin2alfa = l * g/50g
sin2alfa = l/50

Trudne?
Banalnie proste. Tylko dziwne, że nie zauważyłeś, jakie ma KONSEKWENCJE to, co zrobiłeś.
Współczynnik (50) wzoru wyprowadziłeś z eksperymentu, dałeś mu taką wartość, żeby wynik uzyskany ze wzoru był taki sam jak wynik z eksperymentu.
W takim razie
JAKIM CUDEM wynik z tak uzyskanego wzoru nie zgadza się z wynikiem eksperymentu?!?
Cytat:
Kod:
float object::PhazerAngle(point a, point b)
{
float dist, dist2d, angle;
dist2d = distance2d(a, b)-10;
angle = asin(dist2d/50)/2;
return angle;

}

Stala -10 zostala dodana po tescie, pocisk po prostu lecial nad celem i taka mrowke czy robala to by nie trafil.
Skąd się w ogóle wzięła rozbieżność, skoro współczynnik w teoretycznym wzorze został dobrany tak, żeby wynik odpowiadał uzyskanemu eksperymentalnie? Dobrałeś stałą do wzoru tak, żeby pasował do doświadczenia, ale mimo to nie pasuje?!? Ale jaja...

Jeśli po zbadaniu maksymalnego zasięgu (a wiec wielkości stałej V^2/g) przeprowadziłeś inne, kolejne doświadczenie i w nim wyszła jakaś różnica, to SKĄD wiesz, że stała V^2/g ma poprawnie wyznaczoną wartość?!? Po co jakieś z kapelusza wyjęte "poprawianie odległości o 10m", jeśli po takiej poprawce wzór nie jest zgodny z pierwszym doświadczeniem. Tym doświadczeniem, które posłużyło do wyznaczenia zasadniczej stałej wzoru, tej stałej, której występowanie ma solidne uzasadnienie. Ta metoda (jeśli tu jest w ogóle jakaś metoda, w co wątpię) wiązania teorii z praktyką jest kompletnie bez sensu.

Berserker napisał/a:
Cytat:
Czy wziąłeś pod uwagę, że działo jest jakieś 2m ponad poziomem platformy bota i jakieś 1,5-2m do przodu względem centralnego punktu podstawy? Wszystkie współrzędne bota (.position) odnoszą się do podstawy, nie do działa.
Ciezko nie zauwazyc, skoro piszesz o tym w co drugim swoim poscie.
Chyba rzeczywiście ciężko, bo różnicę niwelujesz wyjętym z kapelusza zmniejszeniem odległości, zamiast w pierwszej kolejności skorygować ją o te czynniki, które na pewno się do niej przyczyniają.

Berserker napisał/a:
Nie chce mi sie tego liczyc
Kiedy właśnie chodzi o chcenie. Przekształcenie podręcznikowego wzoru na zasięg rzutu ukośnego jest trywialne i nie warte wypisywania jako program rozwiązujący zadanie. Rozwiązanie problemu celowania przy strzale traktowanym jak rzut ukośny, wymaga więcej niż kilka minut.

Berserker napisał/a:
Jak sama nazwa wskazuje, arcus sinus sluzy do obliczania kata posiadajac sinus danego kata.
Jak gramatyka tego zdania wskazuje, "arcus sinus posiada kąt". Co jest bzdurą.
Berserker napisał/a:
Wytlumacz mi, dlaczego traktujesz mnie jako swojego ucznia
Prawidłowe sformułowanie to "traktować JAK ucznia".
Myślę, że twoje błędy językowe, logiczne, błędy metody, są dostatecznym uzasadnieniem tego, że wnikliwie czytam, co piszesz, jak sądzisz?
Swoją drogą, większość osób, ze mną włącznie, CHCE, żeby je uważnie czytano. I sprawdzano.

Berserker - 19-11-2009, 22:44

To nie jest pisanie zadnych oficjalnych pism ani prac, tylko forum, wiec pozwol, ze laskawie pomine twoje gdybania dotyczace mojej gramatyki.

Cytat:
Swoją drogą, większość osób, ze mną włącznie, CHCE, żeby je uważnie czytano. I sprawdzano.

Niektorym osobom moze sie nie podobac, ze inna je chwali za cos, co jest banalne proste. Tym bardziej, ze wcale nie przeczytales az tak wnikliwie mojego posta.

Cytat:
Jeśli po zbadaniu maksymalnego zasięgu (a wiec wielkości stałej V^2/g) przeprowadziłeś inne, kolejne doświadczenie i w nim wyszła jakaś różnica, to SKĄD wiesz, że stała V^2/g ma poprawnie wyznaczoną wartość?!? Po co jakieś z kapelusza wyjęte "poprawianie odległości o 10m", jeśli po takiej poprawce wzór nie jest zgodny z pierwszym doświadczeniem.

Tylko skad znasz wynik tego doswiadczenia ktore przeprowadzilem? Napisalem, ze robot rownie dobrze trafia i bez tej stalej. Rownie dobrze na celnosc ma wplyw sam odrzut dziala, i co, mam go liczyc? Dzialo doskonale trafia i bez uwzglednienia tej stalej. Ale to brzydko wygladalo, jak polowa pociskow leciala za daleko, wiec se odjalem -10m od dystansu wiedziac, ze rykoszety i tak poleca dobre 5m dalej. To nie jest balistyka, ze roznice robi odjecie 10m czy 10%.

Cytat:
Kiedy właśnie chodzi o chcenie. Przekształcenie podręcznikowego wzoru na zasięg rzutu ukośnego jest trywialne i nie warte wypisywania jako program rozwiązujący zadanie. Rozwiązanie problemu celowania przy strzale traktowanym jak rzut ukośny, wymaga więcej niż kilka minut.


Dostosowalem sie do tego, ze niektorzy nie potrafia korzystajac z funkcji trygonometrycznych obliczc kat nachylenia lufy. (Wiekszosc ludzi ktorzy by probowali napisac ten program albo by zobaczyli, ze to juz jest fizyka i ucieklo z krzykiem, albo by zobaczyli, ze nie maja predkosci i tez by uciekli.) Takim ludziom raczej nie bedzie robilo, w jaki sposob program celuje skoro celuje.

Cytat:
Jeśli po zbadaniu maksymalnego zasięgu (a wiec wielkości stałej V^2/g) przeprowadziłeś inne, kolejne doświadczenie i w nim wyszła jakaś różnica, to SKĄD wiesz, że stała V^2/g ma poprawnie wyznaczoną wartość?!? Po co jakieś z kapelusza wyjęte "poprawianie odległości o 10m", jeśli po takiej poprawce wzór nie jest zgodny z pierwszym doświadczeniem. Tym doświadczeniem, które posłużyło do wyznaczenia zasadniczej stałej wzoru, tej stałej, której występowanie ma solidne uzasadnienie. Ta metoda (jeśli tu jest w ogóle jakaś metoda, w co wątpię) wiązania teorii z praktyką jest kompletnie bez sensu.

Moim celem nie bylo wyznaczenie, pod jakim katem sie ustawia lufe zeby trafic z punktu A do punktu B jednoczesnie trafiajac punkt C, tylko napisanie programu, ktory bedzie mial sensowna celnosc. Wiem, ze mozna bylo od samego poczatku uwzgledniac wielkosc fazera, co by automatycznie zmienilo stala V^2/g. Ale po co, skoro odczucia i tak beda identyczne jakby tych paru punktow procentowych skutecznosci bylo wiecej.

Cytat:
Wiem, ile wynosi ta odległość. Wiem też, jaka jest prędkość pocisków w Colobocie, więc wiem także, ile wynosi przyspieszenie. Mam to w notatkach sprzed pięciu lat.

Gratuluje ciezkiej pracy, ja wole oceniac na oko niz ustawiac odpowiednio roboty, pisac programy do pomiaru i siedziec przy kompie z kartka i dlugopisem. W tym czasie wole zorganizowac jakas fajna walke robotow.

pipok - 20-11-2009, 07:39

Berserker, 2009-11-20 22:44 napisał/a:
Cytat:
Jeśli po zbadaniu maksymalnego zasięgu (a wiec wielkości stałej V^2/g) przeprowadziłeś inne, kolejne doświadczenie i w nim wyszła jakaś różnica, to SKĄD wiesz, że stała V^2/g ma poprawnie wyznaczoną wartość?!? Po co jakieś z kapelusza wyjęte "poprawianie odległości o 10m", jeśli po takiej poprawce wzór nie jest zgodny z pierwszym doświadczeniem.
Tylko skad znasz wynik tego doswiadczenia ktore przeprowadzilem?
Bo sam napisałeś, jaki był wynik. Wypada pamiętać, co się pisało ledwie kilka godzin wcześniej, tego samego dnia. Tym bardziej, że zacytowałem ten fragment w liście, na który odpowiadasz.

Berserker, 2009-11-20 22:44 napisał/a:
Napisalem, ze robot rownie dobrze trafia i bez tej stalej. Rownie dobrze na celnosc ma wplyw sam odrzut dziala, i co, mam go liczyc? Dzialo doskonale trafia i bez uwzglednienia tej stalej.
Nic podobnego nie napisałeś. Mijasz się z prawdą.
Berserker, 2009-11-19 13:21 napisał/a:
Stala -10 zostala dodana po tescie, pocisk po prostu lecial nad celem i taka mrowke czy robala to by nie trafil.
Wybacz, ale w takim razie resztę czytania sobie odpuszczam. Nie ma sensu.
Berserker - 21-11-2009, 18:33

Kod:
r + 100cos^2 alfa * h/r = 100cos alfa

Kto wyznaczy stad jakakolwiek funkcje trygonometryczna dostanie ciasteczko oraz program do mierzenia kata lufy dziala fazowego. Staram sie wyliczyc ten wzor chyba na trzeci z kolei sposob i mowiac szczerze nie wiem czy sie gdzies nie pomylilem, a mam wrazenie, ze tak, wiec licze na to, ze pipok stwierdzi jego poprawnosc :) (mowie to bez zlosliwosci)

@up
Specjalnie sprawdzilem, program bez przeszkod trafia we wszystko co stoi na ziemi bez tej stalej.

]; - 25-02-2010, 22:15
Temat postu: solution
boki zrywac jak sie menczysz pipok
niezbendny jest ten wzor z tangesem ale po jaki kij bawic sie w przechylenie bota, nie lepiej kazac mu sie wzniesc na np 2m [jet i while] jeśli[if] jest przechlony, co ustawi go prostopadle do powierzchni morza, jak mowila moja matematyczka uczonc o równaniach

jak pozbyc sie 4 z "4-x=5"
zmazac ją !!!

Berserker - 25-02-2010, 23:14

Lol, ciezko lata sie robotami na gasienicach
lukowsky - 14-10-2011, 20:32

Sorki ze odświeżam ale muszę podziękować bo do Colobota miło się wraca nawet po latach.
pipok - Wielkie Dzięki !!!
Tak to bym się zastanawiał co spier*lem przez kolejny rok :)
Szacun.


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