Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 73.91 KB | None | 0 0
  1. /*********************************************************************
  2. Symulacja obiektów fizycznych ruchomych np. samochody, statki, roboty, itd.
  3. + obsługa obiektów statycznych np. teren.
  4. **********************************************************************/
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <time.h>
  9. #include <windows.h>
  10. #include <gl\gl.h>
  11. #include <gl\glu.h>
  12. #include "obiekty.h"
  13. #include "grafika.h"
  14.  
  15.  
  16. //#include "wektor.h"
  17. extern FILE *f;
  18. extern char napis1[300];
  19. //extern Teren teren;
  20. //extern int iLiczbaCudzychOb;
  21. //extern ObiektRuchomy *CudzeObiekty[1000];
  22.  
  23.  
  24. ObiektRuchomy::ObiektRuchomy(Teren *t) // konstruktor
  25. {
  26. teren = t;
  27.  
  28. //iID = (unsigned int)(clock() % 1000); // identyfikator obiektu
  29. iID = (unsigned int)(rand() % 1000); // identyfikator obiektu
  30. fprintf(f,"Nowy obiekt: iID = %d\n",iID);
  31. iID_wlasc = iID; // identyfikator właściciela obiektu
  32. czy_autonom = 0;
  33.  
  34. pieniadze = 1000; // np. dolarów
  35. ilosc_paliwa = 10.0; // np. kilogramów paliwa
  36. czy_pieniadze = true;
  37. czy_beczki = true;
  38.  
  39. czas_symulacji = 0; // symulowany czas rzeczywisty od początku istnienia obiektu
  40.  
  41. F = alfa = 0; // siły działające na obiekt
  42. ham = 0; // stopień hamowania
  43.  
  44. F_max = 5000;
  45. masa_wlasna = 1200.0; // masa własna obiektu [kg] (bez paliwa)
  46. masa_calk = masa_wlasna + ilosc_paliwa; // masa całkowita
  47. Fy = masa_wlasna*9.81; // siła nacisku na podstawę obiektu (na koła pojazdu)
  48. dlugosc = 6.0;
  49. szerokosc = 2.7;
  50. wysokosc = 1.0;
  51. przeswit = 0.0; // wysokość na której znajduje się podstawa obiektu
  52. dl_przod = 1.0; // odległość od przedniej osi do przedniego zderzaka
  53. dl_tyl = 0.2; // odległość od tylniej osi do tylniego zderzaka
  54.  
  55. iID_kolid = -1; // na razie brak kolizji
  56.  
  57. //wPol.y = przeswit+wysokosc/2 + 10;
  58. wPol = Wektor3(120,przeswit+wysokosc/2 + 10,-50);
  59. promien = sqrt(dlugosc*dlugosc + szerokosc*szerokosc + wysokosc*wysokosc)/2/1.15;
  60. //wV_kat = Wektor3(0,1,0)*40; // początkowa prędkość kątowa (w celach testowych)
  61.  
  62. //moment_wziecia = 0; // czas ostatniego wziecia przedmiotu
  63. //czas_oczekiwania = 1000000000; //
  64. //nr_przedmiotu = -1;
  65.  
  66. nr_wzietego_przedm = -1;
  67. wartosc_wzieta = 0;
  68. nr_odnowionego_przedm = -1;
  69.  
  70. // obrót obiektu o kąt 30 stopni względem osi y:
  71. kwaternion qObr = AsixToQuat(Wektor3(0,1,0),0.1*PI/180.0);
  72. qOrient = qObr*qOrient;
  73.  
  74. // losowanie umiejętności tak by nie było bardzo słabych i bardzo silnych:
  75. umiejetn_sadzenia = 0.2 + (float)(rand()%5)/5;
  76. umiejetn_zb_paliwa = 0.2 + (float)(rand()%5)/5;
  77. umiejetn_zb_monet = 0.2 + (float)(rand()%5)/5;
  78. //float suma_um = umiejetn_sadzenia + umiejetn_zb_paliwa + umiejetn_zb_monet;
  79. //float suma_um_los = 0.7 + 0.8*(float)rand()/RAND_MAX; // losuje umiejetność sumaryczną
  80. //umiejetn_sadzenia *= suma_um_los/suma_um;
  81. //umiejetn_zb_paliwa *= suma_um_los/suma_um;
  82. //umiejetn_zb_monet *= suma_um_los/suma_um;
  83.  
  84. czy_zazn = false;
  85. }
  86.  
  87. ObiektRuchomy::~ObiektRuchomy() // destruktor
  88. {
  89. }
  90.  
  91. void ObiektRuchomy::ZmienStan(StanObiektu stan) // przepisanie podanego stanu
  92. { // w przypadku obiektów, które nie są symulowane
  93. this->iID = stan.iID;
  94.  
  95. this->wPol = stan.wPol;
  96. this->qOrient = stan.qOrient;
  97. this->wV = stan.wV;
  98. this->wA = stan.wA;
  99. this->wV_kat = stan.wV_kat;
  100. this->wA_kat = stan.wA_kat;
  101.  
  102. this->masa_calk = stan.masa_calk;
  103. this->pieniadze = stan.pieniadze;
  104. this->iID_wlasc = stan.iID_wlasc;
  105. this->czy_autonom = stan.czy_autonom;
  106. }
  107.  
  108. StanObiektu ObiektRuchomy::Stan() // metoda zwracająca stan obiektu łącznie z iID
  109. {
  110. StanObiektu stan;
  111.  
  112. stan.iID = iID;
  113. stan.qOrient = qOrient;
  114. stan.wA = wA;
  115. stan.wA_kat = wA_kat;
  116. stan.wPol = wPol;
  117. stan.wV = wV;
  118. stan.wV_kat = wV_kat;
  119.  
  120. stan.masa_calk = masa_calk;
  121. stan.pieniadze = pieniadze;
  122. stan.iID_wlasc = iID_wlasc;
  123. stan.czy_autonom = czy_autonom;
  124. return stan;
  125. }
  126.  
  127.  
  128. void ObiektRuchomy::Symulacja(float dt,ObiektRuchomy *CudzeObiekty[],long iLiczbaCudzychOb) // obliczenie nowego stanu na podstawie dotychczasowego,
  129. { // działających sił i czasu, jaki upłynął od ostatniej symulacji
  130.  
  131. if (dt == 0) return;
  132.  
  133. czas_symulacji += dt; // sumaryczny czas wszystkich symulacji obiektu od jego powstania
  134.  
  135. float tarcie = 0.6; // współczynnik tarcia obiektu o podłoże
  136. float tarcie_obr = tarcie; // tarcie obrotowe (w szczególnych przypadkach może być inne niż liniowe)
  137. float tarcie_toczne = 0.20; // współczynnik tarcia tocznego
  138. float sprezystosc = 0.2; // współczynnik sprężystości (0-brak sprężystości, 1-doskonała sprężystość)
  139. float g = 9.81; // przyspieszenie grawitacyjne
  140. float m = masa_wlasna + ilosc_paliwa; // masa calkowita
  141.  
  142.  
  143. // obracam układ współrzędnych lokalnych według kwaterniona orientacji:
  144. Wektor3 w_przod = qOrient.obroc_wektor(Wektor3(1,0,0)); // na razie oś obiektu pokrywa się z osią x globalnego układu współrzędnych (lokalna oś x)
  145. Wektor3 w_gora = qOrient.obroc_wektor(Wektor3(0,1,0)); // wektor skierowany pionowo w górę od podstawy obiektu (lokalna oś y)
  146. Wektor3 w_prawo = qOrient.obroc_wektor(Wektor3(0,0,1)); // wektor skierowany w prawo (lokalna oś z)
  147.  
  148. //fprintf(f,"w_przod = (%f, %f, %f)\n",w_przod.x,w_przod.y,w_przod.z);
  149. //fprintf(f,"w_gora = (%f, %f, %f)\n",w_gora.x,w_gora.y,w_gora.z);
  150. //fprintf(f,"w_prawo = (%f, %f, %f)\n",w_prawo.x,w_prawo.y,w_prawo.z);
  151.  
  152. //fprintf(f,"|w_przod|=%f,|w_gora|=%f,|w_prawo|=%f\n",w_przod.dlugosc(),w_gora.dlugosc(),w_prawo.dlugosc() );
  153. //fprintf(f,"ilo skalar = %f,%f,%f\n",w_przod^w_prawo,w_przod^w_gora,w_gora^w_prawo );
  154. //fprintf(f,"w_przod = (%f, %f, %f) w_gora = (%f, %f, %f) w_prawo = (%f, %f, %f)\n",
  155. // w_przod.x,w_przod.y,w_przod.z,w_gora.x,w_gora.y,w_gora.z,w_prawo.x,w_prawo.y,w_prawo.z);
  156.  
  157.  
  158. // rzutujemy wV na składową w kierunku przodu i pozostałe 2 składowe
  159. // składowa w bok jest zmniejszana przez siłę tarcia, składowa do przodu
  160. // przez siłę tarcia tocznego
  161. Wektor3 wV_wprzod = w_przod*(wV^w_przod),
  162. wV_wprawo = w_prawo*(wV^w_prawo),
  163. wV_wgore = w_gora*(wV^w_gora);
  164.  
  165. // dodatkowa normalizacja likwidujaca blad numeryczny:
  166. if (wV.dlugosc() > 0)
  167. {
  168. float blad_dlugosci = (wV_wprzod + wV_wprawo + wV_wgore).dlugosc() / wV.dlugosc();
  169. wV_wprzod = wV_wprzod / blad_dlugosci;
  170. wV_wprawo = wV_wprawo / blad_dlugosci;
  171. wV_wgore = wV_wgore / blad_dlugosci;
  172. }
  173.  
  174. // rzutujemy prędkość kątową wV_kat na składową w kierunku przodu i pozostałe 2 składowe
  175. Wektor3 wV_kat_wprzod = w_przod*(wV_kat^w_przod),
  176. wV_kat_wprawo = w_prawo*(wV_kat^w_prawo),
  177. wV_kat_wgore = w_gora*(wV_kat^w_gora);
  178.  
  179.  
  180. // ograniczenia
  181. if (F > F_max) F = F_max;
  182. if (F < -F_max/2) F = -F_max/2;
  183. if (alfa > PI*45.0/180) alfa = PI*45.0/180 ;
  184. if (alfa < -PI*45.0/180) alfa = -PI*45.0/180 ;
  185.  
  186. // obliczam promien skrętu pojazdu na podstawie kąta skrętu kół, a następnie na podstawie promienia skrętu
  187. // obliczam prędkość kątową (UPROSZCZENIE! pomijam przyspieszenie kątowe oraz właściwą trajektorię ruchu)
  188. if (Fy > 0)
  189. {
  190. float V_kat_skret = 0;
  191. if (alfa != 0)
  192. {
  193. float Rs = sqrt(dlugosc*dlugosc/4 + (fabs(dlugosc/tan(alfa)) + szerokosc/2)*(fabs(dlugosc/tan(alfa)) + szerokosc/2));
  194. V_kat_skret = wV_wprzod.dlugosc()*(1.0/Rs);
  195. }
  196. Wektor3 wV_kat_skret = w_gora*V_kat_skret*(alfa > 0 ? 1 : -1);
  197. Wektor3 wV_kat_wgore2 = wV_kat_wgore + wV_kat_skret;
  198. if (wV_kat_wgore2.dlugosc() <= wV_kat_wgore.dlugosc()) // skręt przeciwdziała obrotowi
  199. {
  200. if (wV_kat_wgore2.dlugosc() > V_kat_skret)
  201. wV_kat_wgore = wV_kat_wgore2;
  202. else
  203. wV_kat_wgore = wV_kat_skret;
  204. }
  205. else
  206. {
  207. if (wV_kat_wgore.dlugosc() < V_kat_skret)
  208. wV_kat_wgore = wV_kat_skret;
  209.  
  210. }
  211.  
  212. // tarcie zmniejsza prędkość obrotową (UPROSZCZENIE! zamiast masy winienem wykorzystać moment bezwładności)
  213. float V_kat_tarcie = Fy*tarcie_obr*dt/m/1.0; // zmiana pr. kątowej spowodowana tarciem
  214. float V_kat_wgore = wV_kat_wgore.dlugosc() - V_kat_tarcie;
  215. if (V_kat_wgore < V_kat_skret) V_kat_wgore = V_kat_skret; // tarcie nie może spowodować zmiany zwrotu wektora pr. kątowej
  216. wV_kat_wgore = wV_kat_wgore.znorm()*V_kat_wgore;
  217. }
  218.  
  219.  
  220. Fy = m*g*w_gora.y; // siła docisku do podłoża
  221. if (Fy < 0 ) Fy = 0;
  222. // ... trzeba ją jeszcze uzależnić od tego, czy obiekt styka się z podłożem!
  223. float Fh = Fy*tarcie*ham; // siła hamowania (UP: bez uwzględnienia poślizgu)
  224.  
  225. float V_wprzod = wV_wprzod.dlugosc();// - dt*Fh/m - dt*tarcie_toczne*Fy/m;
  226. if (V_wprzod < 0) V_wprzod = 0;
  227.  
  228. float V_wprawo = wV_wprawo.dlugosc();// - dt*tarcie*Fy/m;
  229. if (V_wprawo < 0) V_wprawo = 0;
  230.  
  231.  
  232. // wjazd lub zjazd:
  233. //wPol.y = teren.Wysokosc(wPol.x,wPol.z); // najprostsze rozwiązanie - obiekt zmienia wysokość bez zmiany orientacji
  234.  
  235. // 1. gdy wjazd na wklęsłość: wyznaczam wysokości terenu pod narożnikami obiektu (kołami),
  236. // sprawdzam która trójka
  237. // narożników odpowiada najniżej położonemu środkowi ciężkości, gdy przylega do terenu
  238. // wyznaczam prędkość podbicia (wznoszenia środka pojazdu spowodowanego wklęsłością)
  239. // oraz prędkość kątową
  240. // 2. gdy wjazd na wypukłość to siła ciężkości wywołuje obrót przy dużej prędkości liniowej
  241.  
  242. // punkty zaczepienia kół (na wysokości podłogi pojazdu):
  243. Wektor3 P = wPol + w_przod*(dlugosc/2-dl_przod) - w_prawo*szerokosc/2 - w_gora*wysokosc/2,
  244. Q = wPol + w_przod*(dlugosc/2-dl_przod) + w_prawo*szerokosc/2 - w_gora*wysokosc/2,
  245. R = wPol + w_przod*(-dlugosc/2+dl_tyl) - w_prawo*szerokosc/2 - w_gora*wysokosc/2,
  246. S = wPol + w_przod*(-dlugosc/2+dl_tyl) + w_prawo*szerokosc/2 - w_gora*wysokosc/2;
  247.  
  248. // pionowe rzuty punktów zacz. kół pojazdu na powierzchnię terenu:
  249. Wektor3 Pt = P, Qt = Q, Rt = R, St = S;
  250. Pt.y = teren->Wysokosc(P.x,P.z); Qt.y = teren->Wysokosc(Q.x,Q.z);
  251. Rt.y = teren->Wysokosc(R.x,R.z); St.y = teren->Wysokosc(S.x,S.z);
  252. Wektor3 normPQR = normalna(Pt,Rt,Qt), normPRS = normalna(Pt,Rt,St), normPQS = normalna(Pt,St,Qt),
  253. normQRS = normalna(Qt,Rt,St); // normalne do płaszczyzn wyznaczonych przez trójkąty
  254.  
  255. //fprintf(f,"P.y = %f, Pt.y = %f, Q.y = %f, Qt.y = %f, R.y = %f, Rt.y = %f, S.y = %f, St.y = %f\n",
  256. // P.y, Pt.y, Q.y, Qt.y, R.y,Rt.y, S.y, St.y);
  257.  
  258. float sryPQR = ((Qt^normPQR) - normPQR.x*wPol.x - normPQR.z*wPol.z)/normPQR.y, // wys. środka pojazdu
  259. sryPRS = ((Pt^normPRS) - normPRS.x*wPol.x - normPRS.z*wPol.z)/normPRS.y, // po najechaniu na skarpę
  260. sryPQS = ((Pt^normPQS) - normPQS.x*wPol.x - normPQS.z*wPol.z)/normPQS.y, // dla 4 trójek kół
  261. sryQRS = ((Qt^normQRS) - normQRS.x*wPol.x - normQRS.z*wPol.z)/normQRS.y;
  262. float sry = sryPQR; Wektor3 norm = normPQR;
  263. if (sry > sryPRS) {sry = sryPRS; norm = normPRS;}
  264. if (sry > sryPQS) {sry = sryPQS; norm = normPQS;}
  265. if (sry > sryQRS) {sry = sryQRS; norm = normQRS;} // wybór trójkąta o środku najniżej położonym
  266.  
  267.  
  268.  
  269. Wektor3 wV_kat_wpoziomie = Wektor3(0,0,0);
  270. // jesli któreś z kół jest poniżej powierzchni terenu
  271. if ((P.y <= Pt.y + wysokosc/2+przeswit)||(Q.y <= Qt.y + wysokosc/2+przeswit)||
  272. (R.y <= Rt.y + wysokosc/2+przeswit)||(S.y <= St.y + wysokosc/2+przeswit))
  273. {
  274. // obliczam powstałą prędkość kątową w lokalnym układzie współrzędnych:
  275. Wektor3 wobrot = -norm.znorm()*w_gora*0.6;
  276. wV_kat_wpoziomie = wobrot/dt;
  277. }
  278.  
  279. Wektor3 wAg = Wektor3(0,-1,0)*g; // przyspieszenie grawitacyjne
  280.  
  281. // jesli wiecej niz 2 kola sa na ziemi, to przyspieszenie grawitacyjne jest rownowazone przez opor gruntu:
  282. if ((P.y <= Pt.y + wysokosc/2+przeswit)+(Q.y <= Qt.y + wysokosc/2+przeswit)+
  283. (R.y <= Rt.y + wysokosc/2+przeswit)+(S.y <= St.y + wysokosc/2+przeswit) > 2)
  284. {
  285. wAg = wAg +
  286. w_gora*(w_gora^wAg)*-1; //przyspieszenie wynikające z siły oporu gruntu
  287. }
  288. else // w przeciwnym wypadku brak sily docisku
  289. Fy = 0;
  290.  
  291.  
  292.  
  293. // składam z powrotem wektor prędkości kątowej:
  294. //wV_kat = wV_kat_wgore + wV_kat_wprawo + wV_kat_wprzod;
  295. wV_kat = wV_kat_wgore + wV_kat_wpoziomie;
  296.  
  297.  
  298. float h = sry+wysokosc/2+przeswit - wPol.y; // różnica wysokości jaką trzeba pokonać
  299. float V_podbicia = 0;
  300. if ((h > 0)&&(wV.y <= 0.01))
  301. V_podbicia = 0.5*sqrt(2*g*h); // prędkość spowodowana podbiciem pojazdu przy wjeżdżaniu na skarpę
  302. if (h > 0) wPol.y = sry+wysokosc/2+przeswit;
  303.  
  304. // lub w przypadku zagłębienia się
  305. //fprintf(f,"sry = %f, wPol.y = %f, dt = %f\n",sry,wPol.y,dt);
  306. //fprintf(f,"normPQR.y = %f, normPRS.y = %f, normPQS.y = %f, normQRS.y = %f\n",normPQR.y,normPRS.y,normPQS.y,normQRS.y);
  307.  
  308. Wektor3 dwPol = wV*dt;//wA*dt*dt/2; // czynnik bardzo mały - im większa częstotliwość symulacji, tym mniejsze znaczenie
  309. wPol = wPol + dwPol;
  310.  
  311. // korekta położenia w przypadku terenu cyklicznego:
  312. if (wPol.x < -teren->rozmiar_pola*teren->lkolumn/2) wPol.x += teren->rozmiar_pola*teren->lkolumn;
  313. else if (wPol.x > teren->rozmiar_pola*(teren->lkolumn-teren->lkolumn/2)) wPol.x -= teren->rozmiar_pola*teren->lkolumn;
  314. if (wPol.z < -teren->rozmiar_pola*teren->lwierszy/2) wPol.z += teren->rozmiar_pola*teren->lwierszy;
  315. else if (wPol.z > teren->rozmiar_pola*(teren->lwierszy-teren->lwierszy/2)) wPol.z -= teren->rozmiar_pola*teren->lwierszy;
  316.  
  317. // Sprawdzenie czy obiekt może się przemieścić w zadane miejsce: Jeśli nie, to
  318. // przemieszczam obiekt do miejsca zetknięcia, wyznaczam nowe wektory prędkości
  319. // i prędkości kątowej, a następne obliczam nowe położenie na podstawie nowych
  320. // prędkości i pozostałego czasu. Wszystko powtarzam w pętli (pojazd znowu może
  321. // wjechać na przeszkodę). Problem z zaokrąglonymi przeszkodami - konieczne
  322. // wyznaczenie minimalnego kroku.
  323.  
  324.  
  325. Wektor3 wV_pop = wV;
  326.  
  327. // składam prędkości w różnych kierunkach oraz efekt przyspieszenia w jeden wektor: (problem z przyspieszeniem od siły tarcia -> to przyspieszenie
  328. // może działać krócej niż dt -> trzeba to jakoś uwzględnić, inaczej poazd będzie wężykował)
  329. wV = wV_wprzod.znorm()*V_wprzod + wV_wprawo.znorm()*V_wprawo + wV_wgore +
  330. Wektor3(0,1,0)*V_podbicia + wA*dt;
  331. // usuwam te składowe wektora prędkości w których kierunku jazda nie jest możliwa z powodu
  332. // przeskód:
  333. // np. jeśli pojazd styka się 3 kołami z nawierzchnią lub dwoma kołami i środkiem ciężkości to
  334. // nie może mieć prędkości w dół podłogi
  335. if ((P.y <= Pt.y + wysokosc/2+przeswit)||(Q.y <= Qt.y + wysokosc/2+przeswit)||
  336. (R.y <= Rt.y + wysokosc/2+przeswit)||(S.y <= St.y + wysokosc/2+przeswit)) // jeśli pojazd styka się co najm. jednym kołem
  337. {
  338. Wektor3 dwV = wV_wgore + w_gora*(wA^w_gora)*dt;
  339. if ((w_gora.znorm() - dwV.znorm()).dlugosc() > 1 ) // jeśli wektor skierowany w dół podłogi
  340. wV = wV - dwV;
  341. }
  342.  
  343. /*fprintf(f," |wV_wprzod| %f -> %f, |wV_wprawo| %f -> %f, |wV_wgore| %f -> %f |wV| %f -> %f\n",
  344. wV_wprzod.dlugosc(), (wV_wprzod.znorm()*V_wprzod).dlugosc(),
  345. wV_wprawo.dlugosc(), (wV_wprawo.znorm()*V_wprawo).dlugosc(),
  346. wV_wgore.dlugosc(), (wV_wgore.znorm()*wV_wgore.dlugosc()).dlugosc(),
  347. wV_pop.dlugosc(), wV.dlugosc()); */
  348.  
  349. // składam przyspieszenia liniowe od sił napędzających i od sił oporu:
  350. wA = (w_przod*F)/m*(Fy>0)*(ilosc_paliwa>0) // od sił napędzających
  351. - wV_wprzod.znorm()*(Fh/m + tarcie_toczne*Fy/m)*(V_wprzod>0.01) // od hamowania i tarcia tocznego (w kierunku ruchu)
  352. - wV_wprawo.znorm()*tarcie*Fy/m*(V_wprawo>0.01) // od tarcia w kierunku prost. do kier. ruchu
  353. + wAg; // od grawitacji
  354.  
  355.  
  356. // utrata paliwa:
  357. ilosc_paliwa -= (fabs(F))*(Fy>0)*dt/20000;
  358. if (ilosc_paliwa < 0 ) ilosc_paliwa = 0;
  359. masa_calk = masa_wlasna + ilosc_paliwa;
  360.  
  361.  
  362. // obliczenie nowej orientacji:
  363. Wektor3 w_obrot = wV_kat*dt;// + wA_kat*dt*dt/2;
  364. kwaternion q_obrot = AsixToQuat(w_obrot.znorm(),w_obrot.dlugosc());
  365. //fprintf(f,"w_obrot = (x=%f, y=%f, z=%f) \n",w_obrot.x, w_obrot.y, w_obrot.z );
  366. //fprintf(f,"q_obrot = (w=%f, x=%f, y=%f, z=%f) \n",q_obrot.w, q_obrot.x, q_obrot.y, q_obrot.z );
  367. qOrient = q_obrot*qOrient;
  368. //fprintf(f,"Pol = (%f, %f, %f) V = (%f, %f, %f) A = (%f, %f, %f) V_kat = (%f, %f, %f) ID = %d\n",
  369. // wPol.x,wPol.y,wPol.z,wV.x,wV.y,wV.z,wA.x,wA.y,wA.z,wV_kat.x,wV_kat.y,wV_kat.z,iID);
  370.  
  371. // wykrywanie kolizji z drzewami:
  372. for (long i=0;i<teren->liczba_przedmiotow;i++)
  373. if (teren->p[i].typ == DRZEWO)
  374. {
  375. // bardzo duze uproszczenie -> traktuje pojazd jako kulę
  376. Wektor3 wPolDrz = teren->p[i].wPol;
  377. wPolDrz.y = (wPolDrz.y + teren->p[i].wartosc > wPol.y ? wPol.y : wPolDrz.y + teren->p[i].wartosc);
  378. if ((wPolDrz - wPol).dlugosc() < promien + teren->p[i].srednica/2) // jesli kolizja
  379. {
  380. // od wektora predkosci odejmujemy jego rzut na kierunek od punktu styku do osi drzewa:
  381. // jesli pojazd juz wjechal w drzewo, to nieco zwiekszamy poprawke
  382. // punkt styku znajdujemy laczac krawedz pojazdu z osia drzewa odcinkiem
  383. // do obu prostopadlym
  384. Wektor3 dP = (wPolDrz - wPol).znorm(); // wektor, w ktorego kierunku ruch jest niemozliwy
  385. float k = wV^dP;
  386. if (k > 0) // jesli jest skladowa predkosci w strone drzewa
  387. {
  388. wV = wV - dP*k*(1 + sprezystosc); // odjecie skladowej + odbicie sprezyste
  389. //wV_kat =
  390. }
  391. }
  392. }
  393.  
  394. // kolizje z innymi obiektami
  395. if (iID_kolid == iID) // ktoś o numerze iID_kolid wykrył kolizję z naszym pojazdem i poinformował nas o tym
  396.  
  397. {
  398. //fprintf(f,"ktos wykryl kolizje - modyf. predkosci\n",iID_kolid);
  399. wV = wV + wdV_kolid; // modyfikuje prędkość o wektor obliczony od drugiego (życzliwego) uczestnika
  400. iID_kolid = -1;
  401.  
  402. }
  403. else
  404. {
  405. for (long i=0;i<iLiczbaCudzychOb;i++)
  406. {
  407. ObiektRuchomy *inny = CudzeObiekty[i];
  408.  
  409. if ((wPol - inny->wPol).dlugosc() < 2*promien) // jeśli kolizja (zakładam, że drugi obiekt ma taki sam promień
  410. {
  411. // zderzenie takie jak w symulacji kul
  412. Wektor3 norm_pl_st = (wPol - inny->wPol).znorm(); // normalna do płaszczyzny stycznej - kierunek odbicia
  413. float m1 = masa_calk, m2 = inny->masa_calk; // masy obiektów
  414. float W1 = wV^norm_pl_st, W2 = inny->wV^norm_pl_st; // wartosci prędkości
  415. if (W2>W1) // jeśli obiekty się przybliżają
  416. {
  417.  
  418. float Wns = (m1*W1 + m2*W2)/(m1+m2); // prędkość po zderzeniu całkowicie niesprężystym
  419. float W1s = ((m1-m2)*W1 + 2*m2*W2)/(m1+m2), // prędkość po zderzeniu całkowicie sprężystym
  420. W2s = ((m2-m1)*W2 + 2*m1*W1)/(m1+m2);
  421. float W1sp = Wns +(W1s-Wns)*sprezystosc; // prędkość po zderzeniu sprężysto-plastycznym
  422. float W2sp = Wns +(W2s-Wns)*sprezystosc;
  423.  
  424. wV = wV + norm_pl_st*(W1sp-W1); // poprawka prędkości (zakładam, że inny w przypadku drugiego obiektu zrobi to jego własny symulator)
  425. iID_kolid = inny->iID;
  426. wdV_kolid = norm_pl_st*(W2sp-W2);
  427. //fprintf(f,"wykryto i zreal. kolizje z %d W1=%f,W2=%f,W1s=%f,W2s=%f,m1=%f,m2=%f\n",iID_kolid,W1,W2,W1s,W2s,m1,m2);
  428. }
  429. //if (fabs(W2 - W1)*dt < (wPol - inny->wPol).dlugosc() < 2*promien) wV = wV + norm_pl_st*(W1sp-W1)*2;
  430. }
  431. }
  432. } // do else
  433.  
  434. // sprawdzam, czy nie najechałem na monetę lub beczkę z paliwem.
  435. // zakładam, że w jednym cylku symulacji mogę wziąć maksymalnie jeden przedmiot
  436. for (long i=0;i<teren->liczba_przedmiotow;i++)
  437. {
  438. if ((teren->p[i].do_wziecia == 1)&&
  439. ((teren->p[i].wPol - wPol + Wektor3(0,wPol.y - teren->p[i].wPol.y,0)).dlugosc() < promien))
  440. {
  441. float odl_nasza = (teren->p[i].wPol - wPol + Wektor3(0,wPol.y - teren->p[i].wPol.y,0)).dlugosc();
  442.  
  443. long wartosc = teren->p[i].wartosc;
  444. wartosc_wzieta = -1;
  445.  
  446. if (teren->p[i].typ == MONETA && czy_pieniadze==true)
  447. {
  448. bool mozna_wziac = false;
  449. // przy dużej wartości nie mogę samodzielnie podnieść pieniążka bez bratniej pomocy innego pojazdu
  450. // odległość bratniego pojazdu od pieniądza nie może być mniejsza od naszej odległości, gdyż wtedy
  451. // to ten inny pojazd zgarnie monetę:
  452. if (wartosc >= 1000)
  453. {
  454. bool bratnia_pomoc = false;
  455. int kto_pomogl = -1;
  456. for (long k=0;k<iLiczbaCudzychOb;k++)
  457. {
  458. float odl_bratnia = (CudzeObiekty[k]->wPol - teren->p[i].wPol).dlugosc();
  459. if ((odl_bratnia < CudzeObiekty[k]->promien*2)&&(odl_nasza < odl_bratnia))
  460. {
  461. bratnia_pomoc = true;
  462. kto_pomogl = CudzeObiekty[k]->iID;
  463. }
  464. }
  465.  
  466. if (!bratnia_pomoc)
  467. {
  468. sprintf(napis1,"nie_mozna_wziac_tak_ciezkiego_pieniazka,_chyba_ze_ktos_podjedzie_i_pomoze.");
  469. mozna_wziac = false;
  470. }
  471. else
  472. {
  473. sprintf(napis1,"pojazd_o_ID_%d_pomogl_wziac_monete_o_wartosci_%d",kto_pomogl,wartosc);
  474. mozna_wziac = true;
  475. }
  476. }
  477. else
  478. mozna_wziac = true;
  479.  
  480. if (mozna_wziac)
  481. {
  482. wartosc_wzieta = (float)wartosc*umiejetn_zb_monet*0.5;
  483. pieniadze += (long)wartosc_wzieta;
  484. }
  485.  
  486. //sprintf(napis2,"Wziecie_gotowki_o_wartosci_ %d",wartosc);
  487. } // jeśli to moneta
  488. else if (czy_beczki==true)
  489. {
  490. wartosc_wzieta = (float)wartosc*umiejetn_zb_paliwa*0.5;
  491. ilosc_paliwa += wartosc_wzieta;
  492. //sprintf(napis2,"Wziecie_paliwa_w_ilosci_ %d",wartosc);
  493. }
  494.  
  495. if (wartosc_wzieta > 0)
  496. {
  497. teren->p[i].do_wziecia = 0;
  498. teren->p[i].czy_ja_wzialem = 1;
  499. teren->p[i].czas_wziecia = czas_symulacji;
  500.  
  501. // zapis informacji, by przekazać ją innym aplikacjom:
  502. nr_wzietego_przedm = i;
  503. }
  504. }
  505. else if ((teren->p[i].do_wziecia == 0)&&(teren->p[i].czy_ja_wzialem)&&(teren->p[i].czy_odnawialny)&&
  506. (czas_symulacji - teren->p[i].czas_wziecia >= teren->czas_odnowy_przedm))
  507. { // jeśli minął pewnien okres czasu przedmiot może zostać przywrócony
  508. teren->p[i].do_wziecia = 1;
  509. nr_odnowionego_przedm = i;
  510. }
  511. }
  512. }
  513.  
  514.  
  515.  
  516. void ObiektRuchomy::AutoSterowanie(ObiektRuchomy *CudzeObiekty[],long iLiczbaCudzychOb)
  517. {
  518. // TUTAJ NALEŻY UMIEŚCIĆ ALGORYTM AUTONOMICZNEGO STEROWANIA POJAZDEM
  519. // .................................................................
  520. // .................................................................
  521.  
  522.  
  523.  
  524. }
  525.  
  526.  
  527.  
  528. void ObiektRuchomy::Rysuj()
  529. {
  530. glPushMatrix();
  531.  
  532. glTranslatef(wPol.x,wPol.y+przeswit,wPol.z);
  533.  
  534. kwaternion k = qOrient.AsixAngle();
  535. //fprintf(f,"kwaternion = [%f, %f, %f], w = %f\n",qOrient.x,qOrient.y,qOrient.z,qOrient.w);
  536. //fprintf(f,"os obrotu = [%f, %f, %f], kat = %f\n",k.x,k.y,k.z,k.w*180.0/PI);
  537.  
  538. glRotatef(k.w*180.0/PI,k.x,k.y,k.z);
  539. glPushMatrix();
  540. glTranslatef(-dlugosc/2,-wysokosc/2,-szerokosc/2);
  541.  
  542. glScalef(dlugosc,wysokosc,szerokosc);
  543. glCallList(Cube);
  544. glPopMatrix();
  545. if (this->czy_zazn)
  546. {
  547. float w = 1.1;
  548. glTranslatef(-dlugosc/2*w,-wysokosc/2*w,-szerokosc/2*w);
  549. glScalef(dlugosc*w,wysokosc*w,szerokosc*w);
  550. GLfloat Surface[] = { 2.0f, 0.0f, 0.0f, 1.0f};
  551. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface);
  552. glCallList(Cube_skel);
  553. }
  554.  
  555. GLfloat Surface[] = { 2.0f, 2.0f, 1.0f, 1.0f};
  556. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface);
  557. glRasterPos2f(0.30,1.20);
  558. glPrint("%d",iID );
  559. glPopMatrix();
  560. }
  561.  
  562.  
  563.  
  564. //**********************
  565. // Obiekty nieruchome
  566. //**********************
  567. Teren::Teren()
  568. {
  569.  
  570. rozmiar_pola = 20; // długość boku kwadratu w [m]
  571.  
  572. float rozmiar_pola_pop = 35; // poprzedni, oryginalny rozmiar pola [m]
  573. float t[][44] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  574. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ostatni element nieużywany
  575. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  576. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  577. {0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  578. {0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,170,170,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  579. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 5, 2, 0, 0, 0, 0, 0, 0, 0,120,220,250,200,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  580. {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 6, 9, 12, 12, 4, 0, 0, 0, 0, 0, 40,130,200,250,200,150, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  581. {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 0, 14, 9, 4, 0, 0, 0, 20, 40,120,200,220,150,150, 0, 0, 0, 0, 50, 50,300,300,300, 0, 0, 0, 0, 0, 0, 0, 0},
  582. {0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 8, 4, 0, 0, 0, 0, 20, 40, 90,120,170, 0, 0, 0, 0, 0, 0, 60,300,350,330,300, 0, 0, 0, 0, 0, 0, 0, 0},
  583. {0, 0, 0, 0, -1, 2, 0, -3, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, 50,100,140, 0, 0, 0, 0, 0, 0, 50,300,300,300,150, 50, 0, 0, 0, 0, 0, 0, 0},
  584. {0, 0, 0, -1, 2, 0, 0, 0, 0, -1, -1, 2, 0, 0, 0, 0, 0, 0, 0, 10, 10, 40, 70,100,110, 0, 0, 0, 0, 0, 0, 50, 40,300,200, 50, 50, 0, 0, 0, 0, 0, 0, 0},
  585. {0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 90, 90, 0, 0, 0, 0, 0, 0, 0,100, 40,100, 50, 50, 0, 0, 0, 0, 0, 0, 0},
  586. {0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-10,-10, 10, 10, 0, 0, 0, 0, 0, 0, 0,100,100, 0,100, 70, 40, 0, 0, 0, 0, 0, 0, 0},
  587. {0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-10, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 30, 0, 0, 0, 0, 0, 0, 0},
  588. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 20, 20, 0, 0, 0, 0, 0, 0, 0},
  589. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0},
  590. {0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  591. {0, 0, 0, 0, 0, 0, 0, 0, -6, -5, -5, -3, -3, 0, 0, 0, 0, 0, 0, -2, -2, -1, 0, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  592. {0, 0, 0, 0, 0, 0, 0, -7, -6, -3, -3, -5, -4, 0, 0, 0, 0, 0, -1, -3, -3, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  593. {0, 0, 0, 0, 0, 0, 0, -8, -8, 0, 0, 0, -4, -2, 0, 0, 0, 0, 0, -2, -3, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  594. {0, 0, 0, 0, 0, 0, 0, -8, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  595. {0, 0, 0, 0,-40,-40,-40,-10,-40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  596. {0, 0, 0, 0,-40,-40,-40,-40,-40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  597. {0, 0, 0, 0,-40,-40,-40,-40,-40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0},
  598. {0, 0, 0, 0,-40,-40,-40,-40,-40, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0},
  599. {0, 0, 0, 0,-40,-40,-40,-40,-40, 0, 0, 8, 10,-10, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0},
  600. {0, 0, 0, 0, 0,-40,-40,-40,-40, 0, 8, 10,-20,-10, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0},
  601. {0, 0, 0, 0, 0,-40,-40,-40,-40, 0, 8, 16, 10,-10, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0},
  602. {0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0,-20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0},
  603. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 10, 10, 10, 3, 0, 0, 0, 0, 0, 0,-20,-20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 20, 20, 10, 5, 5, 0, 0, 0, 0},
  604. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 10, 10, 5, 0, 0, 0, 0, 0,-40,-40,-40,-20,-30,-30, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 20, 20, 10, 5, 5, 0, 0, 0, 0},
  605. {0, 0, 0, 0, 0, -3, 0, 0,-10,-10, 0, 2, 10, 5, 0, 0, 1, 0, 0,-40,-40,-40,-40,-30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 10, 5, 5, 0, 0, 0, 0},
  606. {0, 0, 0, 0, 0, -3, 0,-13,-10, -6, 0, 0, 5, 0, 0, 1, 3, 0, 0,-40,-40,-40,-40,-30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 10, 5, 5, 5, 0, 0, 0},
  607. {0, 0, 0, 0, 0, 0, -3, 0,-18,-16, 0, 0, 0, 0, 0, 0, 2, 3, 5,-40,-40,-40,-40,-30,-20,-20, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 10, 5, 5, 0, 0, 0, 0},
  608. {0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 0,-40,-40,-40,-40,-30,-20,-20,-20, 0, 0, 0, 0, 3, 5, 10, 20, 20, 20, 10, 5, 0, 0, 0, 0, 0},
  609. {0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 5,-40,-40,-40,-40,-30,-20,-20,-20, 0, 0, 0, 0, 3, 5, 10, 20, 20, 20, 10, 5, 0, 0, 0, 0, 0},
  610. {0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0,-40,-40,-30,-30,-30,-20,-20, 0, 0, 0, 0, 3, 5, 10, 20, 20, 20, 10, 5, 0, 20, 20, 0, 0},
  611. {0, 0, 0, 0, 0, 0, 0, -3, -3, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0,-20,-20,-10,-10,-10,-10, 0, 0, 0, 0, 0, 3, 0, 20, 20, 20, 10, 0, 0, 20, 20, 0, 0},
  612. {0, 0, 3, 0, 0, 0, -3, -5, -3, 0, 0, 0, 0, 0, 0, 2, 4, 2, 0, 0, 0, 0,-20,-10, -5, -5, -5, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 10, 0, 0, 20, 20, 0, 0},
  613. {0, 0, 3, 0, 0, 0, -3, -5, -3, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, -5, -5, -5, 0, 0, 0, 0, 0, 0, 0, 20, 20, 30, 30, 30, 20, 20, 20, 20, 0},
  614. {0, 0, 3, 0, 0, -3, -3, -3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -5, -5, -5, 0, 0, 0, 0, 0, 0, 20, 20, 40, 40, 40, 40, 40, 40, 40, 40, 0},
  615. {0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, -5, -5, 0, 0, 0, 0, 0, 0, 20, 30, 40, 40, 60, 60, 60, 60, 40, 40, 0},
  616. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 30, 40, 40, 60, 60, 60, 60, 40, 40, 0},
  617. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 30, 40, 40, 60, 60, 60, 60, 40, 40, 0},
  618. {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,-50, 0, 0, 0, 0, 1, -1, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 20, 30, 40, 60, 60, 60, 60, 60, 40, 40, 0},
  619. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-20,-50, 0, 0, 0, 0, 1, -1, 0, 0, 1, 5, 8, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 40, 60, 60, 60, 60, 60, 60, 60, 40, 0},
  620. {0, 0, 10, 0, 0, 0, 2, 2, 2, 1,-20,-20,-30, 0, 0, 0, 0, 1, -1, 0, 0, 2, 5, 9, 0, 0, 0, 0, 0, 0, 0, 20, 30, 40, 60, 60,100,100,100, 60, 60, 60, 40, 0},
  621. {0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0,-20,-10, 0, 0, 0, 0, 0, 1, -1, 0, 0, 2, 5, 7, 0, 0, 0, 0, 0, 0, 20, 30, 40, 60,100,100,100,100,100, 60, 60, 40, 0},
  622. {0, 0, 10, 0, 0, 4, 4, 2, 3, 2, 1, -5, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 20, 30, 40, 60,100,100,100,120,100,100, 60, 40, 0},
  623. {0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 30, 40, 60,100,100, 80, 80,100,100, 60, 40, 0},
  624. {0, 0, 10, 0, 0, 4, 3, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 40, 60,100,100,100, 80,100,100, 60, 40, 0},
  625. {0, 0, 10, 0, 0, 0, 0,0.5, 1, 1, 0, 0, 0, 0, 0, 0,-30, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 60, 60,100,100,100,100, 60, 60, 40, 0},
  626. {0, 0, 10, 0, 0, 4, 4, 2, 3, 1, 1, 1, 0, 0, 0,-30,-30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 60, 60,100,100, 60, 60, 60, 40, 0},
  627. {0, 0, 10, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,-30,-30,-30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 60, 60, 60, 60, 60, 60, 60, 40, 0},
  628. {0, 0, 10, 0, 0, 5, 4, 2, 2, 1, 1, 1, 0, 0, 0,-30,-30,-25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 40, 20, 40, 40, 40, 40, 0},
  629. {0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-25,-22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 40, 20, 20, 40, 40, 0, 0},
  630. {0, 0, 10, 0, 0,-20,60,-20, 0, 0, 0, 0, 0, 0, 0, 10, 0,-22,-20, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 0, 0, 0, 0},
  631. {0, 0, 10, 0, 0, 0, 70,60,-20, 0, 0, 0, 0, 0, 0, 10, 10, 0,-19,-18, 0, -6, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 0, 0, 0, 0},
  632. {0, 0, 10, 0, 0, 0, 65,50, 0, 0, 0, 0, 0, 0, 5, 10, 0, 0,-16,-13, -8, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0},
  633. {0, 0, 10, 0, 0, 0, 0,-20, 0, 0, 0, 0, 0, 0, 2, 5, 0, 0, 0,-13,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0},
  634. {0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  635. {0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  636. {0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  637. {0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  638. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  639. {0, 0, 0,-10,-20,-60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  640. {0, 0,-10,-20,-30,-60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  641. {0, 0,-10,-40,-90,-60,-60, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  642. {0, 0,-20,-40,-90,-90,-60, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  643. {0,-10,-40,-90,-90,-90,-60, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  644. {0,-10,-50,-90,-90,-90,-60, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40,-20,-10, 0, 0, 0, 0, 0},
  645. {0,-10,-50,-70,-90,-60,-40, 0, 0, 0, 10, 10, 10, 20, 20, 20, 20, 30, 30, 40, 40, 50, 50, 70, 70, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,-20,-10, 0, 0, 0, 0, 0},
  646. {0,-10,-20,-40,-40,-40,-40, 0, 0, 0, 10, 10, 10, 20, 20, 20, 20, 30, 30, 40, 40, 50, 50, 70, 70, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 0, 0, 0, 0, 0, 0},
  647. {0,-10,-20,-20,-30,-20,-20,-10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0},
  648. {0, 0, 0, 0, 0,-10,-20,-20,-10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  649. {0, 0, 0, 0, 0,-10,-10,-10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  650. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  651. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
  652.  
  653. lkolumn = 43; // o 1 mniej, gdyż kolumna jest równoważna ciągowi kwadratów
  654. lwierszy = sizeof(t)/sizeof(float)/(lkolumn+1)/2-1;
  655. mapa = new float*[lwierszy*2+1];
  656. for (long i=0;i<lwierszy*2+1;i++) {
  657. mapa[i] = new float[lkolumn+1];
  658. for (long j=0;j<lkolumn+1;j++) mapa[i][j] = t[i][j];
  659. }
  660.  
  661. for (long i=0;i<lwierszy*2+1;i++)
  662. for (long j=0;j<lkolumn+1;j++)
  663. mapa[i][j] /= 3;
  664.  
  665. d = new float**[lwierszy];
  666. for (long i=0;i<lwierszy;i++) {
  667. d[i] = new float*[lkolumn];
  668. for (long j=0;j<lkolumn;j++) d[i][j] = new float[4];
  669. }
  670. Norm = new Wektor3**[lwierszy];
  671. for (long i=0;i<lwierszy;i++) {
  672. Norm[i] = new Wektor3*[lkolumn];
  673. for (long j=0;j<lkolumn;j++) Norm[i][j] = new Wektor3[4];
  674. }
  675.  
  676. fprintf(f,"mapa terenu: lwierszy = %d, lkolumn = %d rozmiar_mapy = %d\n",lwierszy,lkolumn,sizeof(t));
  677.  
  678. liczba_przedmiotow_max = 1000;
  679. p = new Przedmiot[liczba_przedmiotow_max];
  680. p[0].typ = MONETA; p[0].wPol = Wektor3(10,0,10); p[0].do_wziecia = 1; p[0].wartosc = 100;
  681. p[1].typ = MONETA; p[1].wPol = Wektor3(10,0,-10); p[1].do_wziecia = 1; p[1].wartosc = 100;
  682. p[2].typ = MONETA; p[2].wPol = Wektor3(-10,0,-20); p[2].do_wziecia = 1; p[2].wartosc = 100;
  683. p[3].typ = MONETA; p[3].wPol = Wektor3(60,0,-60); p[3].do_wziecia = 1; p[3].wartosc = 500;
  684. p[4].typ = MONETA; p[4].wPol = Wektor3(-40,0,-20); p[4].do_wziecia = 1; p[4].wartosc = 200;
  685. p[5].typ = MONETA; p[5].wPol = Wektor3(40,0,50); p[5].do_wziecia = 1; p[5].wartosc = 200;
  686. p[6].typ = DRZEWO; p[6].podtyp = TOPOLA; p[6].wPol = Wektor3(-40,0,50); p[6].do_wziecia = 0; p[6].wartosc = 10;
  687. p[7].typ = DRZEWO; p[7].podtyp = TOPOLA; p[7].wPol = Wektor3(40,0,55); p[7].do_wziecia = 0; p[7].wartosc = 14;
  688. p[8].typ = DRZEWO; p[8].podtyp = TOPOLA; p[8].wPol = Wektor3(45,0,55); p[8].do_wziecia = 0; p[8].wartosc = 10;
  689. p[9].typ = DRZEWO; p[9].podtyp = TOPOLA; p[9].wPol = Wektor3(45,0,37); p[9].do_wziecia = 0; p[9].wartosc = 8;
  690. p[10].typ = DRZEWO; p[10].podtyp = SWIERK; p[10].wPol = Wektor3(45,0,5); p[10].do_wziecia = 0; p[10].wartosc = 7;
  691. p[11].typ = DRZEWO; p[11].podtyp = SWIERK; p[11].wPol = Wektor3(38,0,7); p[11].do_wziecia = 0; p[11].wartosc = 8;
  692. p[12].typ = DRZEWO; p[12].podtyp = SWIERK; p[12].wPol = Wektor3(8,0,57); p[12].do_wziecia = 0; p[12].wartosc = 8;
  693. p[13].typ = DRZEWO; p[13].podtyp = SWIERK; p[13].wPol = Wektor3(-2,0,60); p[13].do_wziecia = 0; p[13].wartosc = 8;
  694. p[14].typ = DRZEWO; p[14].podtyp = SWIERK; p[14].wPol = Wektor3(-8,0,52); p[14].do_wziecia = 0; p[14].wartosc = 12;
  695. p[15].typ = DRZEWO; p[15].podtyp = TOPOLA; p[15].wPol = Wektor3(107,0,-65); p[15].do_wziecia = 0; p[15].wartosc = 18;
  696. p[16].typ = DRZEWO; p[16].podtyp = TOPOLA; p[16].wPol = Wektor3(110,0,-75); p[16].do_wziecia = 0; p[16].wartosc = 17;
  697. p[17].typ = DRZEWO; p[17].podtyp = TOPOLA; p[17].wPol = Wektor3(110,0,-85); p[17].do_wziecia = 0; p[17].wartosc = 19;
  698. p[19].typ = MONETA; p[19].wPol = Wektor3(80,0,-97); p[19].do_wziecia = 1; p[19].wartosc = 1000;
  699. p[20].typ = MONETA; p[20].wPol = Wektor3(-30,0,-78); p[20].do_wziecia = 1; p[20].wartosc = 200;
  700. p[21].typ = MONETA; p[21].wPol = Wektor3(40,0,-88); p[21].do_wziecia = 1; p[21].wartosc = 100;
  701. p[22].typ = MONETA; p[22].wPol = Wektor3(-70,0,-88); p[22].do_wziecia = 1; p[22].wartosc = 100;
  702. p[23].typ = MONETA; p[23].wPol = Wektor3(-70,0,-68); p[23].do_wziecia = 1; p[23].wartosc = 100;
  703. p[24].typ = DRZEWO; p[24].podtyp = SWIERK; p[24].wPol = Wektor3(-30,0,-35); p[24].do_wziecia = 0; p[24].wartosc = 8;
  704. p[25].typ = DRZEWO; p[25].podtyp = SWIERK; p[25].wPol = Wektor3(-25,0,-25); p[25].do_wziecia = 0; p[25].wartosc = 12;
  705. p[26].typ = MONETA; p[26].wPol = Wektor3(-37,0,-34); p[26].do_wziecia = 1; p[26].wartosc = 100;
  706. p[27].typ = DRZEWO; p[27].podtyp = TOPOLA; p[27].wPol = Wektor3(140,0,120); p[27].do_wziecia = 0; p[27].wartosc = 22;
  707. p[28].typ = DRZEWO; p[28].podtyp = TOPOLA; p[28].wPol = Wektor3(113,0,-97); p[28].do_wziecia = 0; p[28].wartosc = 19;
  708. p[29].typ = BECZKA; p[29].wPol = Wektor3(-90,0,-88); p[29].do_wziecia = 1; p[29].wartosc = 10;
  709. p[30].typ = BECZKA; p[30].wPol = Wektor3(-100,0,-68); p[30].do_wziecia = 1; p[30].wartosc = 10;
  710. p[31].typ = BECZKA; p[31].wPol = Wektor3(120,0,-65); p[31].do_wziecia = 1; p[31].wartosc = 10;
  711. p[32].typ = BECZKA; p[32].wPol = Wektor3(130,0,-99); p[32].do_wziecia = 1; p[32].wartosc = 50;
  712. p[33].typ = BECZKA; p[33].wPol = Wektor3(150,0,-78); p[33].do_wziecia = 1; p[33].wartosc = 20;
  713. p[34].typ = BECZKA; p[34].wPol = Wektor3(-110,0,-130); p[34].do_wziecia = 1; p[34].wartosc = 10;
  714. p[35].typ = BECZKA; p[35].wPol = Wektor3(123,0,-35); p[35].do_wziecia = 1; p[35].wartosc = 10;
  715. p[36].typ = BECZKA; p[36].wPol = Wektor3(137,0,-110); p[36].do_wziecia = 1; p[36].wartosc = 40;
  716. p[37].typ = BECZKA; p[37].wPol = Wektor3(140,0,-118); p[37].do_wziecia = 1; p[37].wartosc = 30;
  717. p[38].typ = BECZKA; p[38].wPol = Wektor3(12,0,-165); p[38].do_wziecia = 1; p[38].wartosc = 10;
  718. p[39].typ = BECZKA; p[39].wPol = Wektor3(17,0,-110); p[39].do_wziecia = 1; p[39].wartosc = 20;
  719. p[40].typ = BECZKA; p[40].wPol = Wektor3(14,0,-118); p[40].do_wziecia = 1; p[40].wartosc = 10;
  720. p[41].typ = MONETA; p[41].wPol = Wektor3(145,0,-12); p[41].do_wziecia = 1; p[41].wartosc = 1000;
  721. p[42].typ = MONETA; p[42].wPol = Wektor3(147,0,-200); p[42].do_wziecia = 1; p[42].wartosc = 200;
  722. p[43].typ = MONETA; p[43].wPol = Wektor3(140,0,123); p[43].do_wziecia = 1; p[43].wartosc = 200;
  723. p[44].typ = MONETA; p[44].wPol = Wektor3(137,0,134); p[44].do_wziecia = 1; p[44].wartosc = 200;
  724. p[45].typ = DRZEWO; p[45].podtyp = TOPOLA; p[45].wPol = Wektor3(178,0,-194); p[45].do_wziecia = 0; p[45].wartosc = 22;
  725. p[46].typ = DRZEWO; p[46].podtyp = TOPOLA; p[46].wPol = Wektor3(180,0,-188); p[46].do_wziecia = 0; p[46].wartosc = 19;
  726. p[47].typ = BECZKA; p[47].wPol = Wektor3(-190,0,158); p[47].do_wziecia = 1; p[47].wartosc = 20;
  727. p[48].typ = BECZKA; p[48].wPol = Wektor3(-176,0,165); p[48].do_wziecia = 1; p[48].wartosc = 20;
  728. p[49].typ = BECZKA; p[49].wPol = Wektor3(-140,0,-68); p[49].do_wziecia = 1; p[49].wartosc = 20;
  729. p[50].typ = BECZKA; p[50].wPol = Wektor3(-136,0,-55); p[50].do_wziecia = 1; p[50].wartosc = 20;
  730. p[51].typ = MONETA; p[51].wPol = Wektor3(31,0,204); p[51].do_wziecia = 1; p[51].wartosc = 100;
  731. p[52].typ = MONETA; p[52].wPol = Wektor3(31,0,255); p[52].do_wziecia = 1; p[52].wartosc = 50;
  732. p[53].typ = MONETA; p[53].wPol = Wektor3(-71,0,40); p[53].do_wziecia = 1; p[53].wartosc = 100;
  733. p[54].typ = MONETA; p[54].wPol = Wektor3(31,0,75); p[54].do_wziecia = 1; p[54].wartosc = 100;
  734. p[55].typ = DRZEWO; p[55].podtyp = TOPOLA; p[55].wPol = Wektor3(200,0,-194); p[55].do_wziecia = 0; p[55].wartosc = 20;
  735. p[56].typ = DRZEWO; p[56].podtyp = TOPOLA; p[56].wPol = Wektor3(320,0,74); p[56].do_wziecia = 0; p[56].wartosc = 20;
  736. p[57].typ = DRZEWO; p[57].podtyp = TOPOLA; p[57].wPol = Wektor3(320,0,74); p[57].do_wziecia = 0; p[57].wartosc = 20;
  737. p[58].typ = DRZEWO; p[58].podtyp = TOPOLA; p[58].wPol = Wektor3(328,0,74); p[58].do_wziecia = 0; p[58].wartosc = 24;
  738. p[59].typ = DRZEWO; p[59].podtyp = SWIERK; p[59].wPol = Wektor3(340,0,64); p[59].do_wziecia = 0; p[59].wartosc = 18;
  739. p[60].typ = DRZEWO; p[60].podtyp = TOPOLA; p[60].wPol = Wektor3(320,0,84); p[60].do_wziecia = 0; p[60].wartosc = 29;
  740. p[61].typ = MONETA; p[61].wPol = Wektor3(300,0,94); p[61].do_wziecia = 1; p[61].wartosc = 200;
  741. p[62].typ = MONETA; p[62].wPol = Wektor3(290,0,107); p[62].do_wziecia = 1; p[62].wartosc = 200;
  742. p[63].typ = DRZEWO; p[63].podtyp = SWIERK; p[63].wPol = Wektor3(310,0,110); p[63].do_wziecia = 0; p[63].wartosc = 23;
  743. p[64].typ = DRZEWO; p[64].podtyp = SWIERK; p[64].wPol = Wektor3(290,0,110); p[64].do_wziecia = 0; p[64].wartosc = 20;
  744. p[65].typ = DRZEWO; p[65].podtyp = BAOBAB; p[65].wPol = Wektor3(29,0,44); p[65].do_wziecia = 0; p[65].wartosc = 23;
  745. p[66].typ = DRZEWO; p[66].podtyp = BAOBAB; p[66].wPol = Wektor3(-60, 0, 100); p[66].do_wziecia = 0; p[66].wartosc = 10;
  746. p[67].typ = DRZEWO; p[67].podtyp = FANTAZJA; p[67].wPol = Wektor3(290,0,44); p[67].do_wziecia = 0; p[67].wartosc = 23;
  747. p[68].typ = DRZEWO; p[68].podtyp = FANTAZJA; p[68].wPol = Wektor3(-90, 0, 10); p[68].do_wziecia = 0; p[68].wartosc = 10;
  748. p[69].typ = DRZEWO; p[69].podtyp = TOPOLA; p[69].wPol = Wektor3(632.472717,0.912881,-302.502563); p[69].do_wziecia = 0; p[69].wartosc = 9;
  749. p[70].typ = DRZEWO; p[70].podtyp = TOPOLA; p[70].wPol = Wektor3(652.267273,0.913161,-312.163757); p[70].do_wziecia = 0; p[70].wartosc = 10;
  750. p[71].typ = DRZEWO; p[71].podtyp = TOPOLA; p[71].wPol = Wektor3(661.970154,0.913277,-319.453369); p[71].do_wziecia = 0; p[71].wartosc = 15;
  751. p[72].typ = DRZEWO; p[72].podtyp = TOPOLA; p[72].wPol = Wektor3(669.822388,0.913401,-329.818817); p[72].do_wziecia = 0; p[72].wartosc = 15;
  752. p[73].typ = DRZEWO; p[73].podtyp = TOPOLA; p[73].wPol = Wektor3(677.585083,0.913581,-347.711243); p[73].do_wziecia = 0; p[73].wartosc = 10;
  753. p[74].typ = DRZEWO; p[74].podtyp = TOPOLA; p[74].wPol = Wektor3(681.690002,0.913748,-365.708588); p[74].do_wziecia = 0; p[74].wartosc = 10;
  754. p[75].typ = DRZEWO; p[75].podtyp = TOPOLA; p[75].wPol = Wektor3(679.837463,0.913954,-386.691559); p[75].do_wziecia = 0; p[75].wartosc = 12;
  755. p[76].typ = DRZEWO; p[76].podtyp = TOPOLA; p[76].wPol = Wektor3(677.326782,0.914083,-398.845245); p[76].do_wziecia = 0; p[76].wartosc = 14;
  756. p[77].typ = DRZEWO; p[77].podtyp = TOPOLA; p[77].wPol = Wektor3(672.983459,0.914193,-408.143097); p[77].do_wziecia = 0; p[77].wartosc = 10;
  757. p[78].typ = DRZEWO; p[78].podtyp = TOPOLA; p[78].wPol = Wektor3(660.354431,0.914386,-422.346954); p[78].do_wziecia = 0; p[78].wartosc = 10;
  758. p[79].typ = DRZEWO; p[79].podtyp = TOPOLA; p[79].wPol = Wektor3(638.273071,0.914658,-435.320465); p[79].do_wziecia = 0; p[79].wartosc = 13;
  759. p[80].typ = DRZEWO; p[80].podtyp = TOPOLA; p[80].wPol = Wektor3(624.956970,0.914813,-437.299652); p[80].do_wziecia = 0; p[80].wartosc = 10;
  760. p[81].typ = DRZEWO; p[81].podtyp = TOPOLA; p[81].wPol = Wektor3(610.622009,0.914985,-434.782990); p[81].do_wziecia = 0; p[81].wartosc = 10;
  761. p[82].typ = DRZEWO; p[82].podtyp = TOPOLA; p[82].wPol = Wektor3(595.776917,0.915195,-425.152985); p[82].do_wziecia = 0; p[82].wartosc = 10;
  762. p[83].typ = DRZEWO; p[83].podtyp = TOPOLA; p[83].wPol = Wektor3(585.950867,0.915412,-408.537964); p[83].do_wziecia = 0; p[83].wartosc = 8;
  763. p[84].typ = DRZEWO; p[84].podtyp = TOPOLA; p[84].wPol = Wektor3(583.834900,0.915658,-380.728729); p[84].do_wziecia = 0; p[84].wartosc = 10;
  764. p[85].typ = DRZEWO; p[85].podtyp = TOPOLA; p[85].wPol = Wektor3(598.869812,0.915953,-343.837219); p[85].do_wziecia = 0; p[85].wartosc = 10;
  765. p[86].typ = DRZEWO; p[86].podtyp = TOPOLA; p[86].wPol = Wektor3(-624.297791,0.917550,-162.224823); p[86].do_wziecia = 0; p[86].wartosc = 7;
  766. p[87].typ = DRZEWO; p[87].podtyp = TOPOLA; p[87].wPol = Wektor3(-547.940491,-12.365116,-201.055618); p[87].do_wziecia = 0; p[87].wartosc = 10;
  767. p[88].typ = DRZEWO; p[88].podtyp = TOPOLA; p[88].wPol = Wektor3(-547.151794,-12.365116,-218.333481); p[88].do_wziecia = 0; p[88].wartosc = 11;
  768. p[89].typ = DRZEWO; p[89].podtyp = TOPOLA; p[89].wPol = Wektor3(-554.100281,-12.365116,-236.128677); p[89].do_wziecia = 0; p[89].wartosc = 10;
  769. p[90].typ = MONETA; p[90].wPol = Wektor3(226.183517,0.905881,-131.977966); p[90].do_wziecia = 1; p[90].wartosc = 200;
  770. p[91].typ = MONETA; p[91].wPol = Wektor3(263.419556,0.905952,-141.098480); p[91].do_wziecia = 1; p[91].wartosc = 200;
  771. p[92].typ = MONETA; p[92].wPol = Wektor3(287.104889,0.905990,-130.649017); p[92].do_wziecia = 1; p[92].wartosc = 200;
  772. p[93].typ = MONETA; p[93].wPol = Wektor3(335.474335,0.906081,-78.665756); p[93].do_wziecia = 1; p[93].wartosc = 2000;
  773. p[94].typ = MONETA; p[94].wPol = Wektor3(364.682526,1.929753,-46.732376); p[94].do_wziecia = 1; p[94].wartosc = 200;
  774. p[95].typ = MONETA; p[95].wPol = Wektor3(463.006592,7.967625,3.318682); p[95].do_wziecia = 1; p[95].wartosc = 200;
  775. p[96].typ = MONETA; p[96].wPol = Wektor3(626.966797,1.285740,16.154631); p[96].do_wziecia = 1; p[96].wartosc = 200;
  776. p[97].typ = MONETA; p[97].wPol = Wektor3(608.149109,20.925455,76.088387); p[97].do_wziecia = 1; p[97].wartosc = 200;
  777. p[98].typ = MONETA; p[98].wPol = Wektor3(599.040894,36.439148,181.299286); p[98].do_wziecia = 1; p[98].wartosc = 200;
  778. p[99].typ = MONETA; p[99].wPol = Wektor3(597.937317,38.559483,186.615601); p[99].do_wziecia = 1; p[99].wartosc = 200;
  779. p[100].typ = MONETA; p[100].wPol = Wektor3(-570.924561,-12.592191,-228.966690); p[100].do_wziecia = 1; p[100].wartosc = 200;
  780. p[101].typ = MONETA; p[101].wPol = Wektor3(-553.789063,-12.488989,-229.971313); p[101].do_wziecia = 1; p[101].wartosc = 200;
  781. p[102].typ = MONETA; p[102].wPol = Wektor3(-541.527283,-12.488867,-222.314514); p[102].do_wziecia = 1; p[102].wartosc = 200;
  782. p[103].typ = MONETA; p[103].wPol = Wektor3(-533.953857,-12.488703,-212.829834); p[103].do_wziecia = 1; p[103].wartosc = 500;
  783. p[104].typ = MONETA; p[104].wPol = Wektor3(-373.647888,0.983305,-266.223328); p[104].do_wziecia = 1; p[104].wartosc = 200;
  784. p[105].typ = MONETA; p[105].wPol = Wektor3(-293.566254,1.095974,-371.887268); p[105].do_wziecia = 1; p[105].wartosc = 200;
  785. p[106].typ = MONETA; p[106].wPol = Wektor3(39.126923,27.159672,-474.906860); p[106].do_wziecia = 1; p[106].wartosc = 2000;
  786. p[107].typ = MONETA; p[107].wPol = Wektor3(64.734650,34.732437,-465.925476); p[107].do_wziecia = 1; p[107].wartosc = 2000;
  787. p[108].typ = DRZEWO; p[108].podtyp = SWIERK; p[108].wPol = Wektor3(63.236191,0.586880,-139.625809); p[108].do_wziecia = 0; p[108].wartosc = 8;
  788. p[109].typ = DRZEWO; p[109].podtyp = SWIERK; p[109].wPol = Wektor3(66.055931,0.588808,-147.259155); p[109].do_wziecia = 0; p[109].wartosc = 8;
  789. p[110].typ = DRZEWO; p[110].podtyp = SWIERK; p[110].wPol = Wektor3(70.628593,0.590884,-154.814728); p[110].do_wziecia = 0; p[110].wartosc = 7;
  790. p[111].typ = DRZEWO; p[111].podtyp = SWIERK; p[111].wPol = Wektor3(74.409485,0.600210,-181.930054); p[111].do_wziecia = 0; p[111].wartosc = 8;
  791. p[112].typ = DRZEWO; p[112].podtyp = SWIERK; p[112].wPol = Wektor3(56.660011,0.608544,-202.465530); p[112].do_wziecia = 0; p[112].wartosc = 6;
  792. p[113].typ = DRZEWO; p[113].podtyp = SWIERK; p[113].wPol = Wektor3(44.211227,0.613297,-208.163239); p[113].do_wziecia = 0; p[113].wartosc = 8;
  793. p[114].typ = DRZEWO; p[114].podtyp = SWIERK; p[114].wPol = Wektor3(28.067364,0.619393,-210.209305); p[114].do_wziecia = 0; p[114].wartosc = 6;
  794. p[115].typ = DRZEWO; p[115].podtyp = SWIERK; p[115].wPol = Wektor3(14.255757,0.625113,-206.943634); p[115].do_wziecia = 0; p[115].wartosc = 8;
  795. p[116].typ = DRZEWO; p[116].podtyp = SWIERK; p[116].wPol = Wektor3(-24.169546,0.658252,-215.176407); p[116].do_wziecia = 0; p[116].wartosc = 8;
  796. p[117].typ = DRZEWO; p[117].podtyp = SWIERK; p[117].wPol = Wektor3(-29.784779,0.663917,-222.947144); p[117].do_wziecia = 0; p[117].wartosc = 5;
  797. p[118].typ = DRZEWO; p[118].podtyp = SWIERK; p[118].wPol = Wektor3(-33.371540,0.674517,-238.807266); p[118].do_wziecia = 0; p[118].wartosc = 8;
  798. p[119].typ = DRZEWO; p[119].podtyp = SWIERK; p[119].wPol = Wektor3(-30.641068,0.681490,-249.823990); p[119].do_wziecia = 0; p[119].wartosc = 9;
  799. p[120].typ = DRZEWO; p[120].podtyp = SWIERK; p[120].wPol = Wektor3(-24.503609,0.688872,-258.525330); p[120].do_wziecia = 0; p[120].wartosc = 8;
  800. p[121].typ = DRZEWO; p[121].podtyp = SWIERK; p[121].wPol = Wektor3(-20.072397,0.693872,-262.510956); p[121].do_wziecia = 0; p[121].wartosc = 9;
  801. p[122].typ = DRZEWO; p[122].podtyp = SWIERK; p[122].wPol = Wektor3(-13.873348,0.699406,-266.469513); p[122].do_wziecia = 0; p[122].wartosc = 8;
  802. p[123].typ = DRZEWO; p[123].podtyp = SWIERK; p[123].wPol = Wektor3(-4.258272,0.705241,-269.988953); p[123].do_wziecia = 0; p[123].wartosc = 10;
  803. p[124].typ = DRZEWO; p[124].podtyp = SWIERK; p[124].wPol = Wektor3(-1.445199,0.706443,-270.476868); p[124].do_wziecia = 0; p[124].wartosc = 8;
  804. p[125].typ = DRZEWO; p[125].podtyp = SWIERK; p[125].wPol = Wektor3(9.902552,0.707123,-270.211426); p[125].do_wziecia = 0; p[125].wartosc = 11;
  805. p[126].typ = DRZEWO; p[126].podtyp = SWIERK; p[126].wPol = Wektor3(22.596554,0.707123,-265.348480); p[126].do_wziecia = 0; p[126].wartosc = 8;
  806. p[127].typ = DRZEWO; p[127].podtyp = SWIERK; p[127].wPol = Wektor3(50.986397,0.616378,-177.523071); p[127].do_wziecia = 0; p[127].wartosc = 12;
  807. p[128].typ = DRZEWO; p[128].podtyp = SWIERK; p[128].wPol = Wektor3(41.753319,0.616378,-186.364960); p[128].do_wziecia = 0; p[128].wartosc = 13;
  808. p[129].typ = DRZEWO; p[129].podtyp = SWIERK; p[129].wPol = Wektor3(36.031311,0.616929,-213.996338); p[129].do_wziecia = 0; p[129].wartosc = 8;
  809. p[130].typ = DRZEWO; p[130].podtyp = SWIERK; p[130].wPol = Wektor3(35.357979,0.617832,-233.075851); p[130].do_wziecia = 0; p[130].wartosc = 14;
  810. p[131].typ = DRZEWO; p[131].podtyp = SWIERK; p[131].wPol = Wektor3(23.259836,0.619466,-251.000900); p[131].do_wziecia = 0; p[131].wartosc = 8;
  811. p[132].typ = DRZEWO; p[132].podtyp = SWIERK; p[132].wPol = Wektor3(-4.325057,0.623508,-252.838715); p[132].do_wziecia = 0; p[132].wartosc = 11;
  812. p[133].typ = DRZEWO; p[133].podtyp = SWIERK; p[133].wPol = Wektor3(-21.519569,0.628547,-242.970978); p[133].do_wziecia = 0; p[133].wartosc = 8;
  813. p[134].typ = MONETA; p[134].wPol = Wektor3(24.064184,0.989570,-237.835632); p[134].do_wziecia = 1; p[134].wartosc = 200;
  814. p[135].typ = MONETA; p[135].wPol = Wektor3(9.181233,0.989570,-237.477585); p[135].do_wziecia = 1; p[135].wartosc = 200;
  815. p[136].typ = MONETA; p[136].wPol = Wektor3(0.694732,0.989570,-240.591492); p[136].do_wziecia = 1; p[136].wartosc = 200;
  816. p[137].typ = MONETA; p[137].wPol = Wektor3(-9.977914,0.989570,-247.590973); p[137].do_wziecia = 1; p[137].wartosc = 500;
  817. p[138].typ = MONETA; p[138].wPol = Wektor3(-17.719433,0.989570,-259.048431); p[138].do_wziecia = 1; p[138].wartosc = 200;
  818. p[139].typ = MONETA; p[139].wPol = Wektor3(-5.118982,0.989570,-259.506348); p[139].do_wziecia = 1; p[139].wartosc = 200;
  819. p[140].typ = MONETA; p[140].wPol = Wektor3(3.725217,0.989570,-261.501801); p[140].do_wziecia = 1; p[140].wartosc = 200;
  820. p[141].typ = MONETA; p[141].wPol = Wektor3(13.561393,0.989570,-260.378967); p[141].do_wziecia = 1; p[141].wartosc = 500;
  821. p[142].typ = MONETA; p[142].wPol = Wektor3(32.313389,0.989570,-210.849899); p[142].do_wziecia = 1; p[142].wartosc = 200;
  822. p[143].typ = MONETA; p[143].wPol = Wektor3(37.163082,0.989570,-204.181473); p[143].do_wziecia = 1; p[143].wartosc = 500;
  823. p[144].typ = MONETA; p[144].wPol = Wektor3(44.427998,0.989570,-197.662552); p[144].do_wziecia = 1; p[144].wartosc = 200;
  824. p[145].typ = MONETA; p[145].wPol = Wektor3(52.029839,0.989570,-190.263504); p[145].do_wziecia = 1; p[145].wartosc = 100;
  825. p[146].typ = MONETA; p[146].wPol = Wektor3(57.671402,0.989570,-179.875671); p[146].do_wziecia = 1; p[146].wartosc = 200;
  826. p[147].typ = MONETA; p[147].wPol = Wektor3(66.966080,0.989570,-152.452698); p[147].do_wziecia = 1; p[147].wartosc = 500;
  827. p[148].typ = MONETA; p[148].wPol = Wektor3(53.951099,-9.458956,-81.352837); p[148].do_wziecia = 1; p[148].wartosc = 200;
  828. p[149].typ = MONETA; p[149].wPol = Wektor3(87.066048,-0.568960,46.441082); p[149].do_wziecia = 1; p[149].wartosc = 200;
  829. p[150].typ = BECZKA; p[150].wPol = Wektor3(654.271973,0.994743,-359.416443); p[150].do_wziecia = 1; p[150].wartosc = 10;
  830. p[151].typ = BECZKA; p[151].wPol = Wektor3(657.483521,0.994743,-368.162537); p[151].do_wziecia = 1; p[151].wartosc = 10;
  831. p[152].typ = BECZKA; p[152].wPol = Wektor3(658.063232,0.994743,-381.350708); p[152].do_wziecia = 1; p[152].wartosc = 10;
  832. p[153].typ = BECZKA; p[153].wPol = Wektor3(651.096191,0.994743,-397.172943); p[153].do_wziecia = 1; p[153].wartosc = 10;
  833. p[154].typ = BECZKA; p[154].wPol = Wektor3(643.415833,0.994743,-404.362946); p[154].do_wziecia = 1; p[154].wartosc = 10;
  834. p[155].typ = BECZKA; p[155].wPol = Wektor3(633.758362,0.994743,-409.167542); p[155].do_wziecia = 1; p[155].wartosc = 10;
  835. p[156].typ = BECZKA; p[156].wPol = Wektor3(624.660889,0.994743,-411.284393); p[156].do_wziecia = 1; p[156].wartosc = 20;
  836. p[157].typ = BECZKA; p[157].wPol = Wektor3(614.794067,0.994743,-411.157623); p[157].do_wziecia = 1; p[157].wartosc = 10;
  837. p[158].typ = BECZKA; p[158].wPol = Wektor3(604.039001,0.994743,-407.027435); p[158].do_wziecia = 1; p[158].wartosc = 10;
  838. p[159].typ = BECZKA; p[159].wPol = Wektor3(597.891418,0.994743,-401.791962); p[159].do_wziecia = 1; p[159].wartosc = 10;
  839. p[160].typ = BECZKA; p[160].wPol = Wektor3(594.121216,0.994743,-385.307983); p[160].do_wziecia = 1; p[160].wartosc = 20;
  840. p[161].typ = BECZKA; p[161].wPol = Wektor3(599.643433,0.994743,-370.202087); p[161].do_wziecia = 1; p[161].wartosc = 10;
  841. p[162].typ = BECZKA; p[162].wPol = Wektor3(609.874878,0.994743,-353.348633); p[162].do_wziecia = 1; p[162].wartosc = 10;
  842. p[163].typ = BECZKA; p[163].wPol = Wektor3(622.580017,0.994743,-341.732452); p[163].do_wziecia = 1; p[163].wartosc = 10;
  843. p[164].typ = BECZKA; p[164].wPol = Wektor3(646.656250,0.994743,-337.008698); p[164].do_wziecia = 1; p[164].wartosc = 10;
  844. p[165].typ = BECZKA; p[165].wPol = Wektor3(470.063446,23.621290,-453.724457); p[165].do_wziecia = 1; p[165].wartosc = 50;
  845. p[166].typ = BECZKA; p[166].wPol = Wektor3(457.352173,29.021656,-456.398956); p[166].do_wziecia = 1; p[166].wartosc = 50;
  846. p[167].typ = MONETA; p[167].wPol = Wektor3(-639.535034,-28.684586,568.212036); p[167].do_wziecia = 1; p[167].wartosc = 1000;
  847. p[168].typ = MONETA; p[168].wPol = Wektor3(-627.211609,-29.357119,563.859924); p[168].do_wziecia = 1; p[168].wartosc = 2000;
  848. p[169].typ = MONETA; p[169].wPol = Wektor3(-595.740662,-29.256361,552.259094); p[169].do_wziecia = 1; p[169].wartosc = 1000;
  849.  
  850. liczba_przedmiotow = 170;
  851.  
  852. //Przedmiot _p = {{Wektor3(1,2,3),kwaternion(0,0,0,1),MONETA,100,1}};
  853. for (long i = 0;i<liczba_przedmiotow;i++)
  854. {
  855. p[i].czy_odnawialny = 1;
  856. p[i].wPol.x *= rozmiar_pola/rozmiar_pola_pop;
  857. p[i].wPol.z *= rozmiar_pola/rozmiar_pola_pop;
  858. if ((p[i].typ == MONETA)||(p[i].typ == BECZKA))
  859. p[i].wPol.y = 1.7 + Wysokosc(p[i].wPol.x,p[i].wPol.z);
  860. p[i].czy_zazn = 0;
  861. }
  862.  
  863. czas_odnowy_przedm = 200;
  864. }
  865.  
  866. Teren::~Teren()
  867. {
  868. for (long i = 0;i< lwierszy*2+1;i++) delete mapa[i];
  869. delete mapa;
  870. for (long i=0;i<lwierszy;i++) {
  871. for (long j=0;j<lkolumn;j++) delete d[i][j];
  872. delete d[i];
  873. }
  874. delete d;
  875. for (long i=0;i<lwierszy;i++) {
  876. for (long j=0;j<lkolumn;j++) delete Norm[i][j];
  877. delete Norm[i];
  878. }
  879. delete Norm;
  880.  
  881. delete p;
  882. }
  883.  
  884. float Teren::Wysokosc(float x,float z) // określanie wysokości dla punktu o wsp. (x,z)
  885. {
  886.  
  887. float pocz_x = -rozmiar_pola*lkolumn/2, // współrzędne lewego górnego krańca terenu
  888. pocz_z = -rozmiar_pola*lwierszy/2;
  889.  
  890. long k = (long)((x - pocz_x)/rozmiar_pola), // wyznaczenie współrzędnych (w,k) kwadratu
  891. w = (long)((z - pocz_z)/rozmiar_pola);
  892. if ((k < 0)||(k >= lkolumn)||(w < 0)||(w >= lwierszy)) return 0; // jeśli poza mapą
  893.  
  894. // wyznaczam punkt B - środek kwadratu oraz trójkąt, w którym znajduje się punkt
  895. // (rysunek w Teren::PoczatekGrafiki())
  896. Wektor3 B = Wektor3(pocz_x + (k+0.5)*rozmiar_pola, mapa[w*2+1][k], pocz_z + (w+0.5)*rozmiar_pola);
  897. enum tr{ABC=0,ADB=1,BDE=2,CBE=3}; // trójkąt w którym znajduje się punkt
  898. int trojkat=0;
  899. if ((B.x > x)&&(fabs(B.z - z) < fabs(B.x - x))) trojkat = ADB;
  900. else if ((B.x < x)&&(fabs(B.z - z) < fabs(B.x - x))) trojkat = CBE;
  901. else if ((B.z > z)&&(fabs(B.z - z) > fabs(B.x - x))) trojkat = ABC;
  902. else trojkat = BDE;
  903.  
  904. // wyznaczam normalną do płaszczyzny a następnie współczynnik d z równania płaszczyzny
  905. float dd = d[w][k][trojkat];
  906. Wektor3 N = Norm[w][k][trojkat];
  907. float y;
  908. if (N.y > 0) y = (-dd - N.x*x - N.z*z)/N.y;
  909. else y = 0;
  910.  
  911. //fprintf(f,"kwadr = (w=%d,k=%d), trojk = %d, (x,z)=(%f,%f) y = %f\n",w,k,trojkat,x,z,y);
  912. //fprintf(f,"kwadr = (w=%d,k=%d), trojk = %d, N=(%f, %f, %f)\n",w,k,trojkat,N.x,N.y,N.z);
  913.  
  914. return y;
  915. }
  916.  
  917. void Teren::PoczatekGrafiki()
  918. {
  919. // tworze listę wyświetlania rysując poszczególne pola mapy za pomocą trójkątów
  920. // (po 4 trójkąty na każde pole):
  921. enum tr{ABC=0,ADB=1,BDE=2,CBE=3};
  922. float pocz_x = -rozmiar_pola*lkolumn/2, // współrzędne lewego górnego krańca terenu
  923. pocz_z = -rozmiar_pola*lwierszy/2;
  924. Wektor3 A,B,C,D,E,N;
  925. glNewList(PowierzchniaTerenu,GL_COMPILE);
  926. glBegin(GL_TRIANGLES);
  927. for (long w=0;w<lwierszy;w++)
  928. for (long k=0;k<lkolumn;k++)
  929. {
  930. A = Wektor3(pocz_x + k*rozmiar_pola, mapa[w*2][k], pocz_z + w*rozmiar_pola);
  931. B = Wektor3(pocz_x + (k+0.5)*rozmiar_pola, mapa[w*2+1][k], pocz_z + (w+0.5)*rozmiar_pola);
  932. C = Wektor3(pocz_x + (k+1)*rozmiar_pola, mapa[w*2][k+1], pocz_z + w*rozmiar_pola);
  933. D = Wektor3(pocz_x + k*rozmiar_pola, mapa[(w+1)*2][k], pocz_z + (w+1)*rozmiar_pola);
  934. E = Wektor3(pocz_x + (k+1)*rozmiar_pola, mapa[(w+1)*2][k+1], pocz_z + (w+1)*rozmiar_pola);
  935. // tworzę trójkąt ABC w górnej części kwadratu:
  936. // A o_________o C
  937. // |. .|
  938. // | . . |
  939. // | o B |
  940. // | . . |
  941. // |._______.|
  942. // D o o E
  943.  
  944. Wektor3 AB = B-A;
  945. Wektor3 BC = C-B;
  946. N = (AB*BC).znorm();
  947. glNormal3f( N.x, N.y, N.z);
  948. glVertex3f( A.x, A.y, A.z);
  949. glVertex3f( B.x, B.y, B.z);
  950. glVertex3f( C.x, C.y, C.z);
  951. d[w][k][ABC] = -(B^N); // dodatkowo wyznaczam wyraz wolny z równania plaszyzny trójkąta
  952. Norm[w][k][ABC] = N; // dodatkowo zapisuję normalną do płaszczyzny trójkąta
  953. // trójkąt ADB:
  954. Wektor3 AD = D-A;
  955. N = (AD*AB).znorm();
  956. glNormal3f( N.x, N.y, N.z);
  957. glVertex3f( A.x, A.y, A.z);
  958. glVertex3f( D.x, D.y, D.z);
  959. glVertex3f( B.x, B.y, B.z);
  960. d[w][k][ADB] = -(B^N);
  961. Norm[w][k][ADB] = N;
  962. // trójkąt BDE:
  963. Wektor3 BD = D-B;
  964. Wektor3 DE = E-D;
  965. N = (BD*DE).znorm();
  966. glNormal3f( N.x, N.y, N.z);
  967. glVertex3f( B.x, B.y, B.z);
  968. glVertex3f( D.x, D.y, D.z);
  969. glVertex3f( E.x, E.y, E.z);
  970. d[w][k][BDE] = -(B^N);
  971. Norm[w][k][BDE] = N;
  972. // trójkąt CBE:
  973. Wektor3 CB = B-C;
  974. Wektor3 BE = E-B;
  975. N = (CB*BE).znorm();
  976. glNormal3f( N.x, N.y, N.z);
  977. glVertex3f( C.x, C.y, C.z);
  978. glVertex3f( B.x, B.y, B.z);
  979. glVertex3f( E.x, E.y, E.z);
  980. d[w][k][CBE] = -(B^N);
  981. Norm[w][k][CBE] = N;
  982. }
  983. glEnd();
  984. glEndList();
  985.  
  986. /*glNewList(PowierzchniaTerenu,GL_COMPILE);
  987. glBegin(GL_POLYGON);
  988. glNormal3f( 0.0, 1.0, 0.0);
  989. glVertex3f( -100, 0, -300.0);
  990. glVertex3f( -100, 0, 100.0);
  991. glVertex3f( 100, 0, 100.0);
  992. glVertex3f( 100, 0, -300.0);
  993. glEnd();
  994. glEndList();*/
  995.  
  996. }
  997.  
  998.  
  999.  
  1000. void Teren::Rysuj(int szczegolowosc)
  1001. {
  1002. int sz = szczegolowosc;
  1003.  
  1004. // rysowanie powierzchni terenu:
  1005. glCallList(PowierzchniaTerenu);
  1006.  
  1007. // rysowanie różnych przedmiotów (monet, budynków, drzew)
  1008. GLUquadricObj *Qcyl = gluNewQuadric();
  1009. GLUquadricObj *Qdisk = gluNewQuadric();
  1010. GLUquadricObj *Qsph = gluNewQuadric();
  1011. GLfloat GreySurface[] = { 0.7f, 0.7f, 0.7f, 0.3f};
  1012. for (long i=0;i<liczba_przedmiotow;i++)
  1013. {
  1014. glPushMatrix();
  1015.  
  1016. glTranslatef(p[i].wPol.x,p[i].wPol.y,p[i].wPol.z);
  1017. //glRotatef(k.w*180.0/PI,k.x,k.y,k.z);
  1018. //glScalef(dlugosc,wysokosc,szerokosc);
  1019. switch (p[i].typ)
  1020. {
  1021. case MONETA:
  1022. //gluCylinder(Qcyl,promien1,promien2,wysokosc,10,20);
  1023. if (p[i].do_wziecia)
  1024. {
  1025. GLfloat Surface[] = { 2.0f, 2.0f, 1.0f, 1.0f};
  1026. if (p[i].czy_zazn)
  1027. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1028. else
  1029. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface);
  1030. glRotatef(90,1,0,0);
  1031. p[i].srednica = powf(p[i].wartosc/100,0.4); float grubosc = 0.2*p[i].srednica;
  1032. p[i].wPol.y = grubosc + Wysokosc(p[i].wPol.x,p[i].wPol.z);
  1033. gluDisk(Qdisk,0,p[i].srednica,5*(1+sz),5*(1+sz));
  1034. gluCylinder(Qcyl,p[i].srednica,p[i].srednica,grubosc,5*(1+sz),10*(1+sz));
  1035. if (szczegolowosc == 1)
  1036. {
  1037. glRasterPos2f(0.30,1.20);
  1038. glPrint("%d",p[i].wartosc);
  1039. }
  1040. }
  1041. break;
  1042. case BECZKA:
  1043. //gluCylinder(Qcyl,promien1,promien2,wysokosc,10,20);
  1044. if (p[i].do_wziecia)
  1045. {
  1046. GLfloat Surface[] = { 0.50f, 0.45f, 0.0f, 1.0f};
  1047. if (p[i].czy_zazn)
  1048. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1049. else
  1050. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface);
  1051. glRotatef(90,1,0,0);
  1052. p[i].srednica = powf((float)p[i].wartosc/50,0.4); float grubosc = 2*p[i].srednica;
  1053. p[i].wPol.y = grubosc + Wysokosc(p[i].wPol.x,p[i].wPol.z);
  1054. gluDisk(Qdisk,0,p[i].srednica,5*(1+sz),5*(1+sz));
  1055. gluCylinder(Qcyl,p[i].srednica,p[i].srednica,grubosc,5*(1+sz),10*(1+sz));
  1056. if (szczegolowosc == 1)
  1057. {
  1058. glRasterPos2f(0.30,1.20);
  1059. glPrint("%d",p[i].wartosc);
  1060. }
  1061. }
  1062. break;
  1063. case DRZEWO:
  1064. switch (p[i].podtyp)
  1065. {
  1066. case TOPOLA:
  1067. {
  1068. GLfloat Surface[] = { 0.5f, 0.5f, 0.0f, 1.0f};
  1069. if (p[i].czy_zazn)
  1070. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1071. else
  1072. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface);
  1073. glPushMatrix();
  1074. glRotatef(90,1,0,0);
  1075. p[i].srednica = 0.8; float wysokosc = p[i].wartosc;
  1076. p[i].wPol.y = wysokosc + Wysokosc(p[i].wPol.x,p[i].wPol.z);
  1077. gluCylinder(Qcyl,p[i].srednica/2,p[i].srednica,wysokosc,5*(1+sz),10*(1+sz));
  1078. glPopMatrix();
  1079. GLfloat Surface2[] = { 0.0f, 0.9f, 0.0f, 1.0f};
  1080. if (p[i].czy_zazn)
  1081. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1082. else
  1083. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface2);
  1084. //glTranslatef(0,wysokosc,0);
  1085. glScalef(1,2,1);
  1086. gluSphere(Qsph,3,5*(1+3*sz),5*(1+3*sz));
  1087. break;
  1088. }
  1089. case SWIERK:
  1090. {
  1091. GLfloat Surface[] = { 0.65f, 0.3f, 0.0f, 1.0f};
  1092. if (p[i].czy_zazn)
  1093. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1094. else
  1095. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface);
  1096. glPushMatrix();
  1097. glRotatef(90,1,0,0);
  1098. float wysokosc = p[i].wartosc;
  1099. p[i].srednica = wysokosc/10;
  1100. float promien = p[i].srednica/2;
  1101. p[i].wPol.y = wysokosc + Wysokosc(p[i].wPol.x,p[i].wPol.z);
  1102. gluCylinder(Qcyl,promien,promien*2,wysokosc,5*(1+sz),10*(1+sz));
  1103.  
  1104. GLfloat Surface2[] = { 0.0f, 0.70f, 0.2f, 1.0f};
  1105. if (p[i].czy_zazn)
  1106. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1107. else
  1108. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface2);
  1109. glTranslatef(0,0,wysokosc*2/4);
  1110. gluCylinder(Qcyl,promien*2,promien*8,wysokosc/4,5*(1+sz),10*(1+sz));
  1111. glTranslatef(0,0,-wysokosc*1/4);
  1112. gluCylinder(Qcyl,promien*2,promien*6,wysokosc/4,5*(1+sz),10*(1+sz));
  1113. glTranslatef(0,0,-wysokosc*1/3);
  1114. gluCylinder(Qcyl,0,promien*4,wysokosc/3,5*(1+sz),10*(1+sz));
  1115. glPopMatrix();
  1116. break;
  1117. }
  1118. case BAOBAB:
  1119. {
  1120. GLfloat Surface[] = { 0.5f, 0.9f, 0.2f, 1.0f};
  1121. if (p[i].czy_zazn)
  1122. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1123. else
  1124. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface);
  1125.  
  1126. int liczba = 10;
  1127. glPushMatrix();
  1128. glRotatef(90,1,0,0);
  1129. float wysokosc = p[i].wartosc;
  1130. glTranslated(0,wysokosc,0);
  1131. gluCylinder(Qcyl,p[i].srednica/2,p[i].srednica,wysokosc*1.1,liczba,liczba*2);
  1132. glPopMatrix();
  1133. GLfloat Surface2[] = { 0.0f, 0.9f, 0.2f, 1.0f};
  1134.  
  1135. if (p[i].czy_zazn)
  1136. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1137. else
  1138. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Surface2);
  1139. glPushMatrix();
  1140. float s = 2 + wysokosc/20;
  1141. glScalef(s,s/2,s);
  1142. gluSphere(Qsph,3,liczba*2,liczba*2);
  1143. glPopMatrix();
  1144. glTranslatef(0,-s/1.5,0);
  1145. glScalef(s*2.2,s/2,s*2.2);
  1146. gluSphere(Qsph,3,liczba,liczba);
  1147.  
  1148. break;
  1149. }
  1150. case FANTAZJA:
  1151. {
  1152. GLfloat KolorPnia[] = { 0.65f, 0.3f, 0.0f, 1.0f}; // kolor pnia i gałęzi
  1153. if (p[i].czy_zazn)
  1154. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1155. else
  1156. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, KolorPnia);
  1157.  
  1158. int liczba = 10;
  1159. glPushMatrix();
  1160. glRotatef(90,1,0,0);
  1161. float wysokosc = p[i].wartosc, srednica_podst = p[i].srednica,
  1162. srednica_wierzch = p[i].srednica/2;
  1163. glTranslated(0,wysokosc,0);
  1164. gluCylinder(Qcyl,srednica_wierzch,srednica_podst,wysokosc*1.1,liczba,liczba*2); // rysowanie pnia
  1165. glPopMatrix();
  1166. glPushMatrix();
  1167. GLfloat KolorLisci[] = { 0.5f, 0.65f, 0.2f, 1.0f}; // kolor liści
  1168. if (p[i].czy_zazn)
  1169. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1170. else
  1171. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, KolorLisci);
  1172. //glTranslatef(0,wysokosc,0);
  1173. float s = 0.5 + wysokosc/15; // średnica listowia
  1174. glScalef(s,s,s);
  1175. gluSphere(Qsph,3,liczba*2,liczba*2); // rysowanie pęku liści na wierzchołku
  1176. glPopMatrix();
  1177.  
  1178. int liczba_gal = (int)(wysokosc/3.5) + (int)(wysokosc*10) % 3; // liczba gałęzi
  1179. float prop_podz = 0.25 + (float)((int)(wysokosc*13) % 10)/100; // proporcja wysokości na której znajduje się gałąź od poprzedniej galezi lub gruntu
  1180. float prop = 1, wys = 0;
  1181.  
  1182. for (int j=0;j<liczba_gal;j++)
  1183. {
  1184. glPushMatrix();
  1185. prop *= prop_podz;
  1186. wys += (wysokosc-wys)*prop_podz; // wysokość na której znajduje się i-ta gałąź od poziomu gruntu
  1187.  
  1188. float kat = 3.14*2*(float)((int)(wys*107) % 10)/10; // kat w/g pnia drzewa
  1189. float sredn = (srednica_podst - wys/wysokosc*(srednica_podst-srednica_wierzch))/2;
  1190. float dlug = sredn*2 + sqrt(wysokosc-wys);
  1191. if (p[i].czy_zazn)
  1192. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1193. else
  1194. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, KolorPnia);
  1195.  
  1196. glTranslatef(0,wys-wysokosc,0);
  1197. glRotatef(kat*180/3.14,0,1,0);
  1198. gluCylinder(Qcyl,sredn,sredn/2,dlug,liczba,liczba);
  1199. if (p[i].czy_zazn)
  1200. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, GreySurface);
  1201. else
  1202. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, KolorLisci);
  1203.  
  1204. float ss = s*sredn/srednica_podst*1.5;
  1205. glTranslatef(0,0,dlug+ss*2);
  1206. glScalef(ss,ss,ss);
  1207. gluSphere(Qsph,3,liczba,liczba); // rysowanie pęku liści na wierzchołku
  1208.  
  1209. glPopMatrix();
  1210. }
  1211.  
  1212.  
  1213. break;
  1214. }
  1215.  
  1216. }
  1217. }
  1218.  
  1219. glPopMatrix();
  1220. }
  1221. gluDeleteQuadric(Qcyl);gluDeleteQuadric(Qdisk);gluDeleteQuadric(Qsph);
  1222. //glCallList(Floor);
  1223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement