Vektor.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. /*
  2. Vektory
  3. */
  4. #ifndef __VEKTORY_H
  5. #define __VEKTORY_H
  6. #define calc_vect(_a,_b,_v)\
  7. { \
  8. (_v.x) = (_b.x) - (_a.x); \
  9. (_v.y) = (_b.y) - (_a.y); \
  10. (_v.z) = (_b.z) - (_a.z); \
  11. } \
  12. #define calc_vect_dir_vec(_a,_b,_v)\
  13. { \
  14. _v.x = _b->x - _a.x; \
  15. _v.y = _b->y - _a.y; \
  16. _v.z = _b->z - _a.z; \
  17. } \
  18. #define calc_vect_dir(_a,_b,_v)\
  19. { \
  20. _v.x = _b->x - _a->x; \
  21. _v.y = _b->y - _a->y; \
  22. _v.z = _b->z - _a->z; \
  23. } \
  24. #define add_vect(_a,_b,_v) \
  25. { \
  26. _v.x = _b.x + _a.x; \
  27. _v.y = _b.y + _a.y; \
  28. _v.z = _b.z + _a.z; \
  29. } \
  30. #define sub_vect(_a,_b,_v) \
  31. { \
  32. _v.x = _b.x - _a.x; \
  33. _v.y = _b.y - _a.y; \
  34. _v.z = _b.z - _a.z; \
  35. } \
  36. #define skal_soucin(_a,_b) (float)(((_b.x)*(_a.x))+((_b.y)*(_a.y))+((_b.z)*(_a.z)))
  37. #define vel_vect(_a,vel) \
  38. { \
  39. vel = (float)sqrt(_a.x*_a.x + _a.y*_a.y + _a.z*_a.z);\
  40. } \
  41. #define vel_vect_sqrt(_a) (float)((_a.x)*(_a.x)+(_a.y)*(_a.y)+(_a.z)*(_a.z))
  42. #define vzdal_bodu_dir(_a,_b) ((float)sqrt((_b->x-_a->x)*(_b->x-_a->x)+(_b->y-_a->y)*(_b->y-_a->y)+(_b->z-_a->z)*(_b->z-_a->z)))
  43. #define vzdal_bodu_dir_sqrt(_a,_b) ((float)((_b->x-_a->x)*(_b->x-_a->x)+(_b->y-_a->y)*(_b->y-_a->y)+(_b->z-_a->z)*(_b->z-_a->z)))
  44. #define vzdal_bodu_bod_sqrt(_a,_b) (((_b.x-_a.x)*(_b.x-_a.x)+(_b.y-_a.y)*(_b.y-_a.y)+(_b.z-_a.z)*(_b.z-_a.z)))
  45. #define vzdal_bodu_bod_vec(_a,_b) ((float)sqrt((_b.x-_a->x)*(_b.x-_a->x)+(_b.y-_a->y)*(_b.y-_a->y)+(_b.z-_a->z)*(_b.z-_a->z)))
  46. #define vzdal_bodu_bod_vec_sqrt(_a,_b) ((float)sqrt((_b.x-_a->x)*(_b.x-_a->x)+(_b.y-_a->y)*(_b.y-_a->y)+(_b.z-_a->z)*(_b.z-_a->z)))
  47. #define vel_vect_dir(_a) ((float)sqrt((_a.x)*(_a.x) + (_a.y)*(_a.y) + (_a.z)*(_a.z)))
  48. #define vel_vect_dir_2d(_a) ((float)sqrt((_a.x)*(_a.x) + (_a.y)*(_a.y)))
  49. #define vel_vect_dir_vect(_a) ((float)sqrt((_a->x)*(_a->x) + (_a->y)*(_a->y) + (_a->z)*(_a->z)))
  50. #define vel_vect_dir_vect_2d(_a) ((float)sqrt((_a->x)*(_a->x) + (_a->y)*(_a->y)))
  51. #define vzdal_bodu_xy(x1,y1,z1,x2,y2,z2) ((float)sqrt(((x2)-(x1))*((x2)-(x1))+((y2)-(y1))*((y2)-(y1))+((z2)-(z1))*((z2)-(z1))))
  52. #define vzdal_bodu_2D_xy(x1,y1,x2,y2) ((float)sqrt(((x2)-(x1))*((x2)-(x1))+((y2)-(y1))*((y2)-(y1))))
  53. #define interpoluj_vec(p_a,p_b,p_i)\
  54. {\
  55. (p_i)->x = ((p_a)->x+(p_b)->x)*0.5f;\
  56. (p_i)->y = ((p_a)->y+(p_b)->y)*0.5f;\
  57. (p_i)->z = ((p_a)->z+(p_b)->z)*0.5f;\
  58. }\
  59. #define interpoluj_vec_bod(a,b,i)\
  60. {\
  61. i.nx = (a.nx+b.nx)*0.5f;\
  62. i.ny = (a.ny+b.ny)*0.5f;\
  63. i.nz = (a.nz+b.nz)*0.5f;\
  64. }\
  65. inline float vektor_uhel(BOD * p_v1, BOD * p_v2)
  66. {
  67. return ((float) p_v1->x * p_v2->x + p_v1->y * p_v2->y + p_v1->z * p_v2->z);
  68. }
  69. inline float vektor_dot_product(BOD * p_v1, BOD * p_v2)
  70. {
  71. return ((float) p_v1->x * p_v2->x + p_v1->y * p_v2->y + p_v1->z * p_v2->z);
  72. }
  73. inline float wvektor_dot_product(WBOD * p_v1, WBOD * p_v2)
  74. {
  75. return ((float) p_v1->x * p_v2->x + p_v1->y * p_v2->y + p_v1->z * p_v2->z +
  76. p_v1->w * p_v2->w);
  77. }
  78. inline BOD *vektor_soucin(BOD * u, BOD * v, BOD * c)
  79. {
  80. c->x = u->y * v->z - u->z * v->y;
  81. c->y = u->z * v->x - u->x * v->z;
  82. c->z = u->x * v->y - u->y * v->x;
  83. return (c);
  84. }
  85. inline float vektor_velikost(BOD * v)
  86. {
  87. float dis = v->x * v->x + v->y * v->y + v->z * v->z;
  88. if (dis > 0.0f)
  89. return ((float) sqrt(dis));
  90. else
  91. return (0.0f);
  92. }
  93. inline float vektor_velikost_2D(BOD * v)
  94. {
  95. float dis = v->x * v->x + v->y * v->y;
  96. if (dis > 0.0f)
  97. return ((float) sqrt(dis));
  98. else
  99. return (0.0f);
  100. }
  101. inline float vektor_norm(BOD * v)
  102. {
  103. float vel2, vel = vektor_velikost(v);
  104. if (vel == 0)
  105. return (0.0f); //vel = 1;
  106. else {
  107. vel2 = 1.0f / vel;
  108. v->x *= vel2;
  109. v->y *= vel2;
  110. v->z *= vel2;
  111. return (vel);
  112. }
  113. }
  114. inline float vektor_norm_2D(BOD * v)
  115. {
  116. float vel2, vel = vektor_velikost_2D(v);
  117. if (vel == 0)
  118. return (0.0f); //vel = 1;
  119. else {
  120. vel2 = 1.0f / vel;
  121. v->x *= vel2;
  122. v->y *= vel2;
  123. return (vel);
  124. }
  125. }
  126. inline float vektor_norm_mult(BOD * v, float num)
  127. {
  128. float vel2, vel = vektor_velikost(v);
  129. if (vel == 0)
  130. return (0.0f); //vel = 1;
  131. else {
  132. vel2 = num / vel;
  133. v->x *= vel2;
  134. v->y *= vel2;
  135. v->z *= vel2;
  136. return (vel);
  137. }
  138. }
  139. inline float vektor_norm_mult_vektor(BOD * v, BOD * p_mult)
  140. {
  141. float n, vel = vektor_velikost(v);
  142. if (vel == 0)
  143. return (0.0f); //vel = 1;
  144. else {
  145. n = 1.0f / vel;
  146. v->x = v->x * n * p_mult->x;
  147. v->y = v->y * n * p_mult->y;
  148. v->z = v->z * n * p_mult->z;
  149. return (vel);
  150. }
  151. }
  152. inline BOD *vektor_add(BOD * v, BOD * u, BOD * c)
  153. {
  154. c->x = v->x + u->x;
  155. c->y = v->y + u->y;
  156. c->z = v->z + u->z;
  157. return (c);
  158. }
  159. inline BOD *vektor_mult(BOD * v, BOD * u, BOD * c)
  160. {
  161. c->x = v->x * u->x;
  162. c->y = v->y * u->y;
  163. c->z = v->z * u->z;
  164. return (c);
  165. }
  166. inline BOD *vektor_sub(BOD * v, BOD * u, BOD * c)
  167. {
  168. c->x = v->x - u->x;
  169. c->y = v->y - u->y;
  170. c->z = v->z - u->z;
  171. return (c);
  172. }
  173. inline BOD *vektor_set(BOD * v, float hodnota)
  174. {
  175. v->x = hodnota;
  176. v->y = hodnota;
  177. v->z = hodnota;
  178. return (v);
  179. }
  180. inline BOD *vektor_set_all(BOD * v, float x, float y, float z)
  181. {
  182. v->x = x;
  183. v->y = y;
  184. v->z = z;
  185. return (v);
  186. }
  187. // test na preteceni
  188. #define MAX_UP 1.0f
  189. inline BOD *vektor_norm_up(BOD * v)
  190. {
  191. if (v->x > MAX_UP)
  192. v->x = MAX_UP;
  193. if (v->y > MAX_UP)
  194. v->y = MAX_UP;
  195. if (v->z > MAX_UP)
  196. v->z = MAX_UP;
  197. return (v);
  198. }
  199. // test na podteceni
  200. #define MAX_DOWN 0.0f
  201. inline BOD *vektor_norm_down(BOD * v)
  202. {
  203. if (v->x < MAX_DOWN)
  204. v->x = MAX_DOWN;
  205. if (v->y < MAX_DOWN)
  206. v->y = MAX_DOWN;
  207. if (v->z < MAX_DOWN)
  208. v->z = MAX_DOWN;
  209. return (v);
  210. }
  211. inline BOD *vektor_norm_bump(BOD * v)
  212. {
  213. v->x = v->x * 0.5f + 0.5f;
  214. v->y = v->y * 0.5f + 0.5f;
  215. v->z = v->z * 0.5f + 0.5f;
  216. return (v);
  217. }
  218. inline BOD *vektor_bod(BOD * v, BOD * u, BOD * c, float t)
  219. {
  220. float t2 = 1.0f - t;
  221. c->x = v->x * t2 + u->x * t;
  222. c->y = v->y * t2 + u->y * t;
  223. c->z = v->z * t2 + u->z * t;
  224. return (c);
  225. }
  226. inline BOD *vektor_copy(BOD * c, BOD * v)
  227. {
  228. c->x = v->x;
  229. c->y = v->y;
  230. c->z = v->z;
  231. return (c);
  232. }
  233. inline WBOD *wvektor_sub(WBOD * v, WBOD * u, WBOD * c)
  234. {
  235. c->x = v->x - u->x;
  236. c->y = v->y - u->y;
  237. c->z = v->z - u->z;
  238. c->w = v->w - u->w;
  239. return (c);
  240. }
  241. inline BOD *vektor_mult_skalar(BOD * v, float mult, BOD * c)
  242. {
  243. c->x = v->x * mult;
  244. c->y = v->y * mult;
  245. c->z = v->z * mult;
  246. return (c);
  247. }
  248. inline BOD *vektor_scale(BOD * v, float mult)
  249. {
  250. v->x *= mult;
  251. v->y *= mult;
  252. v->z *= mult;
  253. return (v);
  254. }
  255. inline BOD *vektor_fabs(BOD * v, BOD * c)
  256. {
  257. c->x = (float) fabs(v->x);
  258. c->y = (float) fabs(v->y);
  259. c->z = (float) fabs(v->z);
  260. return (c);
  261. }
  262. inline BOD *vektor_inv(BOD * v)
  263. {
  264. v->x = -(v->x);
  265. v->y = -(v->y);
  266. v->z = -(v->z);
  267. return (v);
  268. }
  269. inline float vzdal_bodu(OBJ_VERTEX * a, OBJ_VERTEX * b)
  270. {
  271. return ((float) sqrt((b->x - a->x) * (b->x - a->x) + (b->y - a->y) * (b->y -
  272. a->y) + (b->z - a->z) * (b->z - a->z)));
  273. }
  274. inline float vzdal_bodu_bod(BOD * a, BOD * b)
  275. {
  276. float v =
  277. (b->x - a->x) * (b->x - a->x) + (b->y - a->y) * (b->y - a->y) + (b->z -
  278. a->z) * (b->z - a->z);
  279. return ((v > 0.0f) ? (float) sqrt(v) : v);
  280. }
  281. inline float vzdal_bodu_2D_bod(BOD * a, BOD * b)
  282. {
  283. float v = (b->x - a->x) * (b->x - a->x) + (b->z - a->z) * (b->z - a->z);
  284. return ((v > 0.0f) ? (float) sqrt(v) : v);
  285. }
  286. inline void calc_primku_2d(BOD * a, BOD * b, float *p_k, float *p_q)
  287. {
  288. *p_k = (a->y - b->y) / (a->x - b->x);
  289. *p_q = a->y - (*p_k) * a->x;
  290. }
  291. inline void calc_primku_3d(BOD * a, BOD * b, BOD * q) // t je parametr od 0 do 1
  292. {
  293. q->x = b->x - a->x;
  294. q->y = b->y - a->y;
  295. q->z = b->z - a->z;
  296. }
  297. inline float norm_vect(float *p_x, float *p_y, float *p_z)
  298. {
  299. float vel =
  300. (float) sqrt((*p_x) * (*p_x) + (*p_y) * (*p_y) + (*p_z) * (*p_z));
  301. if (vel == 0.0f)
  302. return (0.0f); //vel = 1;
  303. *p_x /= vel;
  304. *p_y /= vel;
  305. *p_z /= vel;
  306. return (vel);
  307. }
  308. inline float norm_vect_2D(float *p_x, float *p_y)
  309. {
  310. float vel = (float) sqrt((*p_x) * (*p_x) + (*p_y) * (*p_y));
  311. *p_x /= vel;
  312. *p_y /= vel;
  313. return (vel);
  314. }
  315. inline float norm_rovinu(ROVINA * r)
  316. {
  317. float vel = (float) sqrt(r->x * r->x + r->y * r->y + r->z * r->z);
  318. if (vel == 0.0f)
  319. return (0.0f); //vel = 1;
  320. r->x /= vel;
  321. r->y /= vel;
  322. r->z /= vel;
  323. r->e /= vel;
  324. return (vel);
  325. }
  326. // p,a,b - primka
  327. inline float vzdal_bodu_a_primky(BOD * p, BOD * a, BOD * b)
  328. {
  329. float ti, v;
  330. float qx, qy, qz;
  331. BOD pr;
  332. // q = B-A
  333. qx = b->x - a->x;
  334. qy = b->y - a->y;
  335. qz = b->z - a->z;
  336. ti =
  337. (b->x - a->x) * (p->x - a->x) + (b->y - a->y) * (p->y - a->y) + (b->z -
  338. a->z) * (p->z - a->z);
  339. v = vzdal_bodu_dir(a, b);
  340. ti /= (v * v);
  341. // P = A - qt
  342. pr.x = a->x + qx * ti;
  343. pr.y = a->y + qy * ti;
  344. pr.z = a->z + qz * ti;
  345. return (vzdal_bodu_bod(&pr, p));
  346. }
  347. // p,a,b - primka
  348. inline float vzdal_bodu_a_primky_bod(BOD * p, BOD * a, BOD * b, BOD * i)
  349. {
  350. float ti, v;
  351. float qx, qy, qz;
  352. // q = B-A
  353. qx = b->x - a->x;
  354. qy = b->y - a->y;
  355. qz = b->z - a->z;
  356. ti =
  357. (b->x - a->x) * (p->x - a->x) + (b->y - a->y) * (p->y - a->y) + (b->z -
  358. a->z) * (p->z - a->z);
  359. v = vzdal_bodu_dir(a, b);
  360. ti /= (v * v);
  361. // P = A - qt
  362. i->x = a->x + qx * ti;
  363. i->y = a->y + qy * ti;
  364. i->z = a->z + qz * ti;
  365. return (vzdal_bodu_dir(i, p));
  366. }
  367. //vraci i bod na primce a->b
  368. inline float bod_primka_bod_bod(BOD * p, BOD * a, BOD * b, BOD * i)
  369. {
  370. float ti, v;
  371. float qx, qy, qz;
  372. // q = B-A
  373. qx = b->x - a->x;
  374. qy = b->y - a->y;
  375. qz = b->z - a->z;
  376. ti =
  377. (b->x - a->x) * (p->x - a->x) + (b->y - a->y) * (p->y - a->y) + (b->z -
  378. a->z) * (p->z - a->z);
  379. v = vzdal_bodu_dir(a, b);
  380. ti /= (v * v);
  381. // P = A - qt
  382. i->x = a->x + qx * ti;
  383. i->y = a->y + qy * ti;
  384. i->z = a->z + qz * ti;
  385. return (ti);
  386. }
  387. inline float vzdal_bodu_a_roviny(BOD * p, ROVINA * r)
  388. {
  389. return ((float) fabs(r->x * p->x + r->y * p->y + r->z * p->z + r->e));
  390. }
  391. inline float vzdal_bodu_a_roviny_nabs(BOD * p, ROVINA * r)
  392. {
  393. return (r->x * p->x + r->y * p->y + r->z * p->z + r->e);
  394. }
  395. #endif