3dmath.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /*
  2. 3D matematicke funkce
  3. */
  4. #ifndef __3D_MATH_H_
  5. #define __3D_MATH_H_
  6. #ifndef PI
  7. #define PI 3.14159265358979323846f
  8. #endif
  9. GLMATRIX *calc_reflex_matrix(GLMATRIX * p_mat, BOD * p_a, BOD * p_b,
  10. BOD * p_c);
  11. int calc_prusek(ROVINA * r, OBJ_VERTEX * a, OBJ_VERTEX * b, OBJ_VERTEX * p);
  12. int calc_prusek_bod(ROVINA * r, BOD * a, BOD * b, BOD * p);
  13. int prusek_face(OBJ_VERTEX * a, OBJ_VERTEX * b, OBJ_VERTEX * p, ROVINA * p_r,
  14. OBJ_VERTEX * _1, OBJ_VERTEX * _2, OBJ_VERTEX * _3);
  15. int prusek_face_editor(OBJ_VERTEX * a, OBJ_VERTEX * b, OBJ_VERTEX * p,
  16. OBJ_VERTEX * _1, OBJ_VERTEX * _2, OBJ_VERTEX * _3);
  17. int intersect_triangle_point(OBJ_VERTEX * _1, OBJ_VERTEX * _2,
  18. OBJ_VERTEX * _3, BOD * p);
  19. int je_uvnitr(float ax, float ay, float bx, float by, float cx, float cy,
  20. float px, float py);
  21. int intersect_triangle(BOD * p_orig, BOD * p_dir, BOD * p_v0, BOD * p_v1,
  22. BOD * p_v2, FLOAT * p_t, FLOAT * p_u, FLOAT * p_v);
  23. int intersect_triangle_ncull(BOD * p_orig, BOD * p_dir, BOD * p_v0,
  24. BOD * p_v1, BOD * p_v2, FLOAT * p_t, FLOAT * p_u, FLOAT * p_v);
  25. GLMATRIX *calc_camera_3ds(GLMATRIX * p_cam, GLMATRIX * p_invcam, BOD * p_p,
  26. BOD * p_t, float roll);
  27. void calc_camera(GLMATRIX * p_cmatrix, GLMATRIX * r_bod_matrix, float vzdal,
  28. float fi);
  29. void calc_camera_bod(GLMATRIX * p_cmatrix, GLMATRIX * p_inv, BOD * p_p,
  30. float vzdal, float fi, float rfi);
  31. void calc_r_bod(GLMATRIX * p_cmatrix, GLMATRIX * r_bod_matrix, float vzdal,
  32. float fi);
  33. void prusecik(BOD * p_a, BOD * p_b, BOD * p_p, BOD * p_I);
  34. void prusecik_mujbod(MUJ_BOD * p_a, MUJ_BOD * p_b, MUJ_BOD * p_p,
  35. MUJ_BOD * p_I);
  36. GLMATRIX *calc_camera_polar(GLMATRIX * p_cam, GLMATRIX * p_invcam, BOD * p_p,
  37. QUAT * p_quat, float vzdal);
  38. /* Bodove funkce
  39. */
  40. inline void bod2mujbod(OBJ_VERTEX * p_obj, BOD * p_bod)
  41. {
  42. p_obj->x = p_bod->x;
  43. p_obj->y = p_bod->y;
  44. p_obj->z = p_bod->z;
  45. }
  46. inline void norm2mujbod(OBJ_VERTEX * p_obj, BOD * p_bod)
  47. {
  48. p_obj->nx = p_bod->x;
  49. p_obj->ny = p_bod->y;
  50. p_obj->nz = p_bod->z;
  51. }
  52. inline BOD *mujbod2bod(BOD * p_bod, OBJ_VERTEX * p_obj)
  53. {
  54. p_bod->x = p_obj->x;
  55. p_bod->y = p_obj->y;
  56. p_bod->z = p_obj->z;
  57. return (p_bod);
  58. }
  59. inline ROVINA *calc_rovinu(OBJ_VERTEX * a, OBJ_VERTEX * b, OBJ_VERTEX * c,
  60. ROVINA * r)
  61. {
  62. r->x = (b->y - a->y) * (c->z - a->z) - (c->y - a->y) * (b->z - a->z);
  63. r->y = (b->z - a->z) * (c->x - a->x) - (c->z - a->z) * (b->x - a->x);
  64. r->z = (b->x - a->x) * (c->y - a->y) - (c->x - a->x) * (b->y - a->y);
  65. r->e = -(r->x * a->x + r->y * a->y + r->z * a->z);
  66. return (r);
  67. }
  68. inline ROVINA *calc_rovinu_bod(BOD * a, BOD * b, BOD * c, ROVINA * r)
  69. {
  70. r->x = (b->y - a->y) * (c->z - a->z) - (c->y - a->y) * (b->z - a->z);
  71. r->y = (b->z - a->z) * (c->x - a->x) - (c->z - a->z) * (b->x - a->x);
  72. r->z = (b->x - a->x) * (c->y - a->y) - (c->x - a->x) * (b->y - a->y);
  73. r->e = -(r->x * a->x + r->y * a->y + r->z * a->z);
  74. return (r);
  75. }
  76. inline ROVINA *calc_rovinu_bod_vektor(BOD * p, BOD * v, ROVINA * r)
  77. {
  78. r->x = v->x;
  79. r->y = v->y;
  80. r->z = v->z;
  81. r->e = -v->x * p->x - v->y * p->y - v->z * p->z;
  82. return (r);
  83. }
  84. inline ROVINAD *calc_drovinu_bod(BOD * a, BOD * b, BOD * c, ROVINAD * r)
  85. {
  86. r->x = (b->y - a->y) * (c->z - a->z) - (c->y - a->y) * (b->z - a->z);
  87. r->y = (b->z - a->z) * (c->x - a->x) - (c->z - a->z) * (b->x - a->x);
  88. r->z = (b->x - a->x) * (c->y - a->y) - (c->x - a->x) * (b->y - a->y);
  89. r->e = -(r->x * a->x + r->y * a->y + r->z * a->z);
  90. return (r);
  91. }
  92. inline BOD *calc_face_normal(BOD * a, BOD * b, BOD * c, BOD * n)
  93. {
  94. n->x = (b->y - a->y) * (c->z - a->z) - (c->y - a->y) * (b->z - a->z);
  95. n->y = (b->z - a->z) * (c->x - a->x) - (c->z - a->z) * (b->x - a->x);
  96. n->z = (b->x - a->x) * (c->y - a->y) - (c->x - a->x) * (b->y - a->y);
  97. return (n);
  98. }
  99. inline BOD *calc_face_stred(BOD * a, BOD * b, BOD * c, BOD * s)
  100. {
  101. s->x = (a->x + b->x + c->x) / 3.0f;
  102. s->y = (a->y + b->y + c->y) / 3.0f;
  103. s->z = (a->z + b->z + c->z) / 3.0f;
  104. return (s);
  105. }
  106. inline GLMATRIX *calc_3d_2d_matrix(GLMATRIX * p_word, GLMATRIX * p_cam,
  107. GLMATRIX * p_proj, GLMATRIX * p_mat)
  108. {
  109. return (mat_mult(mat_mult(p_word, p_cam, p_mat), p_proj, p_mat));
  110. }
  111. inline void matrix_to_scale(GLMATRIX * p_m, BOD * p_s)
  112. {
  113. p_s->x = norm_vect(&p_m->_11, &p_m->_21, &p_m->_31);
  114. p_s->y = norm_vect(&p_m->_12, &p_m->_22, &p_m->_32);
  115. p_s->z = norm_vect(&p_m->_13, &p_m->_23, &p_m->_33);
  116. }
  117. inline void matrix_to_pos(GLMATRIX * p_m, BOD * p_p)
  118. {
  119. p_p->x = p_m->_41;
  120. p_p->y = p_m->_42;
  121. p_p->z = p_m->_43;
  122. }
  123. inline float matrix_to_float(GLMATRIX * p_mat)
  124. {
  125. if (fabs(p_mat->_11) > fabs(p_mat->_21))
  126. return ((float) acos(p_mat->_11));
  127. else
  128. return ((float) asin(p_mat->_21));
  129. }
  130. inline void matrix_to_scale_2d(GLMATRIX * p_m, BOD * p_s)
  131. {
  132. p_s->x = norm_vect(&p_m->_11, &p_m->_21, &p_m->_31);
  133. p_s->y = norm_vect(&p_m->_12, &p_m->_22, &p_m->_32);
  134. }
  135. inline void matrix_to_pos_2d(GLMATRIX * p_m, BOD * p_p)
  136. {
  137. p_p->x = p_m->_41;
  138. p_p->y = p_m->_42;
  139. }
  140. inline GLMATRIX *calc_transf_3d_2d_matrix(GLMATRIX * p_w, GLMATRIX * p_c,
  141. GLMATRIX * p_p, GLMATRIX * p_v)
  142. {
  143. GLMATRIX m;
  144. return ((GLMATRIX *) glu_invert_matrix(mat_mult(mat_mult(p_w, p_c, p_v),
  145. p_p, &m), p_v));
  146. }
  147. inline GLMATRIX *calc_transf_3d_2d_matrix_smpl(GLMATRIX * p_c, GLMATRIX * p_p,
  148. GLMATRIX * p_v)
  149. {
  150. GLMATRIX m;
  151. return ((GLMATRIX *) glu_invert_matrix(mat_mult(p_c, p_p, &m), p_v));
  152. }
  153. inline void stred_to_obalka(BOD * p_prv, BOD * p_min, BOD * p_max, float dx,
  154. float dy, float dz)
  155. {
  156. p_min->x = p_prv->x - dx;
  157. p_min->y = p_prv->y - dy;
  158. p_min->z = p_prv->z - dz;
  159. p_max->x = p_prv->x + dx;
  160. p_max->y = p_prv->y + dy;
  161. p_max->z = p_prv->z + dz;
  162. }
  163. #define DEG2RAD(fi) (((fi)*PI)/180.0f)
  164. #define RAD2DEG(fi) (((fi)/PI)*180.0f)
  165. #define atoff(s) ((float)atof(s))
  166. /*
  167. #define sqrtf(s) ((float)sqrt((float)(s)))
  168. #define sinf(s) ((float)sin((float)(s)))
  169. #define cosf(s) ((float)cos((float)(s)))
  170. #define asinf(s) ((float)asin((float)(s)))
  171. #define acosf(s) ((float)acos((float)(s)))
  172. #define fabsf(s) ((float)fabs((float)(s)))
  173. */
  174. #define EPSILON 0.000001f
  175. inline void kar2polar(BOD * p_car, float *p_r, float *p_fi, float *p_vzdal)
  176. {
  177. BOD z = *p_car;
  178. float p;
  179. *p_vzdal = vektor_norm(&z);
  180. *p_fi = asinf((fabsf(z.y) > 1.0f) ? ftoi(z.y) : z.y);
  181. *p_r = copysign(acosf((fabsf(p =
  182. (-z.z) / cosf(*p_fi)) > 1.0f) ? ftoi(p) : p), z.x);
  183. }
  184. // polarni souradnice -> kartezske souradnice
  185. inline void polar2kar(float r, float fi, float vzdal, BOD * p_car)
  186. {
  187. p_car->x = vzdal * sinf(r) * cosf(fi);
  188. p_car->z = -(vzdal * cosf(r) * cosf(fi));
  189. p_car->y = vzdal * sinf(fi);
  190. }
  191. // odriznuti periody 2PI + normalizace na +PI..-PI
  192. inline float normalizuj_uhel(float uhel)
  193. {
  194. if (fabs(uhel) > 2 * PI) {
  195. uhel = (float) fmod((float) uhel, (float) 2 * PI);
  196. }
  197. if (fabs(uhel) > PI) {
  198. return ((uhel = (uhel > 0.0f) ? -(2 * PI - uhel) : (2 * PI + uhel)));
  199. }
  200. else {
  201. return (uhel);
  202. }
  203. }
  204. #define DELTA_MIN_ROZDIL 0.00000001f
  205. #define stejny_vertex(v1,v2) (fabsf(v1.x-v2.x) < DELTA_MIN_ROZDIL &&\
  206. fabsf(v1.y-v2.y) < DELTA_MIN_ROZDIL &&\
  207. fabsf(v1.z-v2.z) < DELTA_MIN_ROZDIL)\
  208. inline int stejny_vertex_point(BOD * v1, BOD * v2)
  209. {
  210. return (fabsf(v1->x - v2->x) < DELTA_MIN_ROZDIL &&
  211. fabsf(v1->y - v2->y) < DELTA_MIN_ROZDIL &&
  212. fabsf(v1->z - v2->z) < DELTA_MIN_ROZDIL);
  213. }
  214. /* Funkce vcetne Delta-Planu
  215. */
  216. inline int stejny_vertex_point_delta(BOD * v1, BOD * v2, float delta)
  217. {
  218. return (fabsf(v1->x - v2->x) < delta &&
  219. fabsf(v1->y - v2->y) < delta && fabsf(v1->z - v2->z) < delta);
  220. }
  221. #endif