vvector.h
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:35k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * vvector.h
  3.  *
  4.  * FUNCTION:
  5.  * This file contains a number of utilities useful for handling
  6.  * 3D vectors
  7.  * 
  8.  * HISTORY:
  9.  * Written by Linas Vepstas, August 1991
  10.  * Added 2D code, March 1993
  11.  * Added Outer products, C++ proofed, Linas Vepstas October 1993
  12.  */
  13. #ifndef __GUTIL_VECTOR_H__
  14. #define __GUTIL_VECTOR_H__
  15. #if defined(__cplusplus) || defined(c_plusplus)
  16. extern "C" {
  17. #endif
  18. #include <math.h>
  19. #include "port.h"
  20. /* ========================================================== */
  21. /* Zero out a 2D vector */
  22. #define VEC_ZERO_2(a)
  23. {
  24.    (a)[0] = (a)[1] = 0.0;
  25. }
  26. /* ========================================================== */
  27. /* Zero out a 3D vector */
  28. #define VEC_ZERO(a)
  29. {
  30.    (a)[0] = (a)[1] = (a)[2] = 0.0;
  31. }
  32. /* ========================================================== */
  33. /* Zero out a 4D vector */
  34. #define VEC_ZERO_4(a)
  35. {
  36.    (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0;
  37. }
  38. /* ========================================================== */
  39. /* Vector copy */
  40. #define VEC_COPY_2(b,a)
  41. {
  42.    (b)[0] = (a)[0];
  43.    (b)[1] = (a)[1];
  44. }
  45. /* ========================================================== */
  46. /* Copy 3D vector */
  47. #define VEC_COPY(b,a)
  48. {
  49.    (b)[0] = (a)[0];
  50.    (b)[1] = (a)[1];
  51.    (b)[2] = (a)[2];
  52. }
  53. /* ========================================================== */
  54. /* Copy 4D vector */
  55. #define VEC_COPY_4(b,a)
  56. {
  57.    (b)[0] = (a)[0];
  58.    (b)[1] = (a)[1];
  59.    (b)[2] = (a)[2];
  60.    (b)[3] = (a)[3];
  61. }
  62. /* ========================================================== */
  63. /* Vector difference */
  64. #define VEC_DIFF_2(v21,v2,v1)
  65. {
  66.    (v21)[0] = (v2)[0] - (v1)[0];
  67.    (v21)[1] = (v2)[1] - (v1)[1];
  68. }
  69. /* ========================================================== */
  70. /* Vector difference */
  71. #define VEC_DIFF(v21,v2,v1)
  72. {
  73.    (v21)[0] = (v2)[0] - (v1)[0];
  74.    (v21)[1] = (v2)[1] - (v1)[1];
  75.    (v21)[2] = (v2)[2] - (v1)[2];
  76. }
  77. /* ========================================================== */
  78. /* Vector difference */
  79. #define VEC_DIFF_4(v21,v2,v1)
  80. {
  81.    (v21)[0] = (v2)[0] - (v1)[0];
  82.    (v21)[1] = (v2)[1] - (v1)[1];
  83.    (v21)[2] = (v2)[2] - (v1)[2];
  84.    (v21)[3] = (v2)[3] - (v1)[3];
  85. }
  86. /* ========================================================== */
  87. /* Vector sum */
  88. #define VEC_SUM_2(v21,v2,v1)
  89. {
  90.    (v21)[0] = (v2)[0] + (v1)[0];
  91.    (v21)[1] = (v2)[1] + (v1)[1];
  92. }
  93. /* ========================================================== */
  94. /* Vector sum */
  95. #define VEC_SUM(v21,v2,v1)
  96. {
  97.    (v21)[0] = (v2)[0] + (v1)[0];
  98.    (v21)[1] = (v2)[1] + (v1)[1];
  99.    (v21)[2] = (v2)[2] + (v1)[2];
  100. }
  101. /* ========================================================== */
  102. /* Vector sum */
  103. #define VEC_SUM_4(v21,v2,v1)
  104. {
  105.    (v21)[0] = (v2)[0] + (v1)[0];
  106.    (v21)[1] = (v2)[1] + (v1)[1];
  107.    (v21)[2] = (v2)[2] + (v1)[2];
  108.    (v21)[3] = (v2)[3] + (v1)[3];
  109. }
  110. /* ========================================================== */
  111. /* scalar times vector */
  112. #define VEC_SCALE_2(c,a,b)
  113. {
  114.    (c)[0] = (a)*(b)[0];
  115.    (c)[1] = (a)*(b)[1];
  116. }
  117. /* ========================================================== */
  118. /* scalar times vector */
  119. #define VEC_SCALE(c,a,b)
  120. {
  121.    (c)[0] = (a)*(b)[0];
  122.    (c)[1] = (a)*(b)[1];
  123.    (c)[2] = (a)*(b)[2];
  124. }
  125. /* ========================================================== */
  126. /* scalar times vector */
  127. #define VEC_SCALE_4(c,a,b)
  128. {
  129.    (c)[0] = (a)*(b)[0];
  130.    (c)[1] = (a)*(b)[1];
  131.    (c)[2] = (a)*(b)[2];
  132.    (c)[3] = (a)*(b)[3];
  133. }
  134. /* ========================================================== */
  135. /* accumulate scaled vector */
  136. #define VEC_ACCUM_2(c,a,b)
  137. {
  138.    (c)[0] += (a)*(b)[0];
  139.    (c)[1] += (a)*(b)[1];
  140. }
  141. /* ========================================================== */
  142. /* accumulate scaled vector */
  143. #define VEC_ACCUM(c,a,b)
  144. {
  145.    (c)[0] += (a)*(b)[0];
  146.    (c)[1] += (a)*(b)[1];
  147.    (c)[2] += (a)*(b)[2];
  148. }
  149. /* ========================================================== */
  150. /* accumulate scaled vector */
  151. #define VEC_ACCUM_4(c,a,b)
  152. {
  153.    (c)[0] += (a)*(b)[0];
  154.    (c)[1] += (a)*(b)[1];
  155.    (c)[2] += (a)*(b)[2];
  156.    (c)[3] += (a)*(b)[3];
  157. }
  158. /* ========================================================== */
  159. /* Vector dot product */
  160. #define VEC_DOT_PRODUCT_2(c,a,b)
  161. {
  162.    c = (a)[0]*(b)[0] + (a)[1]*(b)[1];
  163. }
  164. /* ========================================================== */
  165. /* Vector dot product */
  166. #define VEC_DOT_PRODUCT(c,a,b)
  167. {
  168.    c = (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2];
  169. }
  170. /* ========================================================== */
  171. /* Vector dot product */
  172. #define VEC_DOT_PRODUCT_4(c,a,b)
  173. {
  174.    c = (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3] ;
  175. }
  176. /* ========================================================== */
  177. /* vector impact parameter (squared) */
  178. #define VEC_IMPACT_SQ(bsq,direction,position)
  179. {
  180.    gleDouble len, llel;
  181.    VEC_DOT_PRODUCT (len, position, position);
  182.    VEC_DOT_PRODUCT (llel, direction, position);
  183.    bsq = len - llel*llel;
  184. }
  185. /* ========================================================== */
  186. /* vector impact parameter */
  187. #define VEC_IMPACT(bsq,direction,position)
  188. {
  189.    VEC_IMPACT_SQ(bsq,direction,position);
  190.    bsq = sqrt (bsq);
  191. }
  192. /* ========================================================== */
  193. /* Vector length */
  194. #define VEC_LENGTH_2(len,a)
  195. {
  196.    len = a[0]*a[0] + a[1]*a[1];
  197.    len = sqrt (len);
  198. }
  199. /* ========================================================== */
  200. /* Vector length */
  201. #define VEC_LENGTH(len,a)
  202. {
  203.    len = (a)[0]*(a)[0] + (a)[1]*(a)[1];
  204.    len += (a)[2]*(a)[2];
  205.    len = sqrt (len);
  206. }
  207. /* ========================================================== */
  208. /* Vector length */
  209. #define VEC_LENGTH_4(len,a)
  210. {
  211.    len = (a)[0]*(a)[0] + (a)[1]*(a)[1];
  212.    len += (a)[2]*(a)[2];
  213.    len += (a)[3] * (a)[3];
  214.    len = sqrt (len);
  215. }
  216. /* ========================================================== */
  217. /* distance between two points */
  218. #define VEC_DISTANCE(len,va,vb)
  219. {
  220.     gleDouble tmp[4];
  221.     VEC_DIFF (tmp, vb, va);
  222.     VEC_LENGTH (len, tmp);
  223. }
  224. /* ========================================================== */
  225. /* Vector length */
  226. #define VEC_CONJUGATE_LENGTH(len,a)
  227. {
  228.    len = 1.0 - a[0]*a[0] - a[1]*a[1] - a[2]*a[2];
  229.    len = sqrt (len);
  230. }
  231. /* ========================================================== */
  232. /* Vector length */
  233. #define VEC_NORMALIZE(a)
  234. {
  235.    double len;
  236.    VEC_LENGTH (len,a);
  237.    if (len != 0.0) {
  238.       len = 1.0 / len;
  239.       a[0] *= len;
  240.       a[1] *= len;
  241.       a[2] *= len;
  242.    }
  243. }
  244. /* ========================================================== */
  245. /* Vector length */
  246. #define VEC_RENORMALIZE(a,newlen)
  247. {
  248.    double len;
  249.    VEC_LENGTH (len,a);
  250.    if (len != 0.0) {
  251.       len = newlen / len;
  252.       a[0] *= len;
  253.       a[1] *= len;
  254.       a[2] *= len;
  255.    }
  256. }
  257. /* ========================================================== */
  258. /* 3D Vector cross product yeilding vector */
  259. #define VEC_CROSS_PRODUCT(c,a,b)
  260. {
  261.    c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1];
  262.    c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2];
  263.    c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0];
  264. }
  265. /* ========================================================== */
  266. /* Vector perp -- assumes that n is of unit length 
  267.  * accepts vector v, subtracts out any component parallel to n */
  268. #define VEC_PERP(vp,v,n)
  269. {
  270.    double dot;
  271.    VEC_DOT_PRODUCT (dot, v, n);
  272.    vp[0] = (v)[0] - (dot) * (n)[0];
  273.    vp[1] = (v)[1] - (dot) * (n)[1];
  274.    vp[2] = (v)[2] - (dot) * (n)[2];
  275. }
  276. /* ========================================================== */
  277. /* Vector parallel -- assumes that n is of unit length 
  278.  * accepts vector v, subtracts out any component perpendicular to n */
  279. #define VEC_PARALLEL(vp,v,n)
  280. {
  281.    double dot;
  282.    VEC_DOT_PRODUCT (dot, v, n);
  283.    vp[0] = (dot) * (n)[0];
  284.    vp[1] = (dot) * (n)[1];
  285.    vp[2] = (dot) * (n)[2];
  286. }
  287. /* ========================================================== */
  288. /* Vector reflection -- assumes n is of unit length */
  289. /* Takes vector v, reflects it against reflector n, and returns vr */
  290. #define VEC_REFLECT(vr,v,n)
  291. {
  292.    double dot;
  293.    VEC_DOT_PRODUCT (dot, v, n);
  294.    vr[0] = (v)[0] - 2.0 * (dot) * (n)[0];
  295.    vr[1] = (v)[1] - 2.0 * (dot) * (n)[1];
  296.    vr[2] = (v)[2] - 2.0 * (dot) * (n)[2];
  297. }
  298. /* ========================================================== */
  299. /* Vector blending */
  300. /* Takes two vectors a, b, blends them together */ 
  301. #define VEC_BLEND(vr,sa,a,sb,b)
  302. {
  303.    vr[0] = (sa) * (a)[0] + (sb) * (b)[0];
  304.    vr[1] = (sa) * (a)[1] + (sb) * (b)[1];
  305.    vr[2] = (sa) * (a)[2] + (sb) * (b)[2];
  306. }
  307. /* ========================================================== */
  308. /* Vector print */
  309. #define VEC_PRINT_2(a)
  310. {
  311.    double len;
  312.    VEC_LENGTH_2 (len, a);
  313.    printf (" a is %f %f length of a is %f n", a[0], a[1], len); 
  314. }
  315. /* ========================================================== */
  316. /* Vector print */
  317. #define VEC_PRINT(a)
  318. {
  319.    double len;
  320.    VEC_LENGTH (len, (a));
  321.    printf (" a is %f %f %f length of a is %f n", (a)[0], (a)[1], (a)[2], len); 
  322. }
  323. /* ========================================================== */
  324. /* Vector print */
  325. #define VEC_PRINT_4(a)
  326. {
  327.    double len;
  328.    VEC_LENGTH_4 (len, (a));
  329.    printf (" a is %f %f %f %f length of a is %f n",
  330.        (a)[0], (a)[1], (a)[2], (a)[3], len);
  331. }
  332. /* ========================================================== */
  333. /* print matrix */
  334. #define MAT_PRINT_4X4(mmm) {
  335.    int i,j;
  336.    printf ("matrix mmm is n");
  337.    if (mmm == NULL) {
  338.       printf (" Null n");
  339.    } else {
  340.       for (i=0; i<4; i++) {
  341.          for (j=0; j<4; j++) {
  342.             printf ("%f ", mmm[i][j]);
  343.          }
  344.          printf (" n");
  345.       }
  346.    }
  347. }
  348. /* ========================================================== */
  349. /* print matrix */
  350. #define MAT_PRINT_3X3(mmm) {
  351.    int i,j;
  352.    printf ("matrix mmm is n");
  353.    if (mmm == NULL) {
  354.       printf (" Null n");
  355.    } else {
  356.       for (i=0; i<3; i++) {
  357.          for (j=0; j<3; j++) {
  358.             printf ("%f ", mmm[i][j]);
  359.          }
  360.          printf (" n");
  361.       }
  362.    }
  363. }
  364. /* ========================================================== */
  365. /* print matrix */
  366. #define MAT_PRINT_2X3(mmm) {
  367.    int i,j;
  368.    printf ("matrix mmm is n");
  369.    if (mmm == NULL) {
  370.       printf (" Null n");
  371.    } else {
  372.       for (i=0; i<2; i++) {
  373.          for (j=0; j<3; j++) {
  374.             printf ("%f ", mmm[i][j]);
  375.          }
  376.          printf (" n");
  377.       }
  378.    }
  379. }
  380. /* ========================================================== */
  381. /* initialize matrix */
  382. #define IDENTIFY_MATRIX_3X3(m)
  383. {
  384.    m[0][0] = 1.0;
  385.    m[0][1] = 0.0;
  386.    m[0][2] = 0.0;
  387.    m[1][0] = 0.0;
  388.    m[1][1] = 1.0;
  389.    m[1][2] = 0.0;
  390.    m[2][0] = 0.0;
  391.    m[2][1] = 0.0;
  392.    m[2][2] = 1.0;
  393. }
  394. /* ========================================================== */
  395. /* initialize matrix */
  396. #define IDENTIFY_MATRIX_4X4(m)
  397. {
  398.    m[0][0] = 1.0;
  399.    m[0][1] = 0.0;
  400.    m[0][2] = 0.0;
  401.    m[0][3] = 0.0;
  402.    m[1][0] = 0.0;
  403.    m[1][1] = 1.0;
  404.    m[1][2] = 0.0;
  405.    m[1][3] = 0.0;
  406.    m[2][0] = 0.0;
  407.    m[2][1] = 0.0;
  408.    m[2][2] = 1.0;
  409.    m[2][3] = 0.0;
  410.    m[3][0] = 0.0;
  411.    m[3][1] = 0.0;
  412.    m[3][2] = 0.0;
  413.    m[3][3] = 1.0;
  414. }
  415. /* ========================================================== */
  416. /* matrix copy */
  417. #define COPY_MATRIX_2X2(b,a)
  418. {
  419.    b[0][0] = a[0][0];
  420.    b[0][1] = a[0][1];
  421.    b[1][0] = a[1][0];
  422.    b[1][1] = a[1][1];
  423. }
  424. /* ========================================================== */
  425. /* matrix copy */
  426. #define COPY_MATRIX_2X3(b,a)
  427. {
  428.    b[0][0] = a[0][0];
  429.    b[0][1] = a[0][1];
  430.    b[0][2] = a[0][2];
  431.    b[1][0] = a[1][0];
  432.    b[1][1] = a[1][1];
  433.    b[1][2] = a[1][2];
  434. }
  435. /* ========================================================== */
  436. /* matrix copy */
  437. #define COPY_MATRIX_3X3(b,a)
  438. {
  439.    b[0][0] = a[0][0];
  440.    b[0][1] = a[0][1];
  441.    b[0][2] = a[0][2];
  442.    b[1][0] = a[1][0];
  443.    b[1][1] = a[1][1];
  444.    b[1][2] = a[1][2];
  445.    b[2][0] = a[2][0];
  446.    b[2][1] = a[2][1];
  447.    b[2][2] = a[2][2];
  448. }
  449. /* ========================================================== */
  450. /* matrix copy */
  451. #define COPY_MATRIX_4X4(b,a)
  452. {
  453.    b[0][0] = a[0][0];
  454.    b[0][1] = a[0][1];
  455.    b[0][2] = a[0][2];
  456.    b[0][3] = a[0][3];
  457.    b[1][0] = a[1][0];
  458.    b[1][1] = a[1][1];
  459.    b[1][2] = a[1][2];
  460.    b[1][3] = a[1][3];
  461.    b[2][0] = a[2][0];
  462.    b[2][1] = a[2][1];
  463.    b[2][2] = a[2][2];
  464.    b[2][3] = a[2][3];
  465.    b[3][0] = a[3][0];
  466.    b[3][1] = a[3][1];
  467.    b[3][2] = a[3][2];
  468.    b[3][3] = a[3][3];
  469. }
  470. /* ========================================================== */
  471. /* matrix transpose */
  472. #define TRANSPOSE_MATRIX_2X2(b,a)
  473. {
  474.    b[0][0] = a[0][0];
  475.    b[0][1] = a[1][0];
  476.    b[1][0] = a[0][1];
  477.    b[1][1] = a[1][1];
  478. }
  479. /* ========================================================== */
  480. /* matrix transpose */
  481. #define TRANSPOSE_MATRIX_3X3(b,a)
  482. {
  483.    b[0][0] = a[0][0];
  484.    b[0][1] = a[1][0];
  485.    b[0][2] = a[2][0];
  486.    b[1][0] = a[0][1];
  487.    b[1][1] = a[1][1];
  488.    b[1][2] = a[2][1];
  489.    b[2][0] = a[0][2];
  490.    b[2][1] = a[1][2];
  491.    b[2][2] = a[2][2];
  492. }
  493. /* ========================================================== */
  494. /* matrix transpose */
  495. #define TRANSPOSE_MATRIX_4X4(b,a)
  496. {
  497.    b[0][0] = a[0][0];
  498.    b[0][1] = a[1][0];
  499.    b[0][2] = a[2][0];
  500.    b[0][3] = a[3][0];
  501.    b[1][0] = a[0][1];
  502.    b[1][1] = a[1][1];
  503.    b[1][2] = a[2][1];
  504.    b[1][3] = a[3][1];
  505.    b[2][0] = a[0][2];
  506.    b[2][1] = a[1][2];
  507.    b[2][2] = a[2][2];
  508.    b[2][3] = a[3][2];
  509.    b[3][0] = a[0][3];
  510.    b[3][1] = a[1][3];
  511.    b[3][2] = a[2][3];
  512.    b[3][3] = a[3][3];
  513. }
  514. /* ========================================================== */
  515. /* multiply matrix by scalar */
  516. #define SCALE_MATRIX_2X2(b,s,a)
  517. {
  518.    b[0][0] = (s) * a[0][0];
  519.    b[0][1] = (s) * a[0][1];
  520.    b[1][0] = (s) * a[1][0];
  521.    b[1][1] = (s) * a[1][1];
  522. }
  523. /* ========================================================== */
  524. /* multiply matrix by scalar */
  525. #define SCALE_MATRIX_3X3(b,s,a)
  526. {
  527.    b[0][0] = (s) * a[0][0];
  528.    b[0][1] = (s) * a[0][1];
  529.    b[0][2] = (s) * a[0][2];
  530.    b[1][0] = (s) * a[1][0];
  531.    b[1][1] = (s) * a[1][1];
  532.    b[1][2] = (s) * a[1][2];
  533.    b[2][0] = (s) * a[2][0];
  534.    b[2][1] = (s) * a[2][1];
  535.    b[2][2] = (s) * a[2][2];
  536. }
  537. /* ========================================================== */
  538. /* multiply matrix by scalar */
  539. #define SCALE_MATRIX_4X4(b,s,a)
  540. {
  541.    b[0][0] = (s) * a[0][0];
  542.    b[0][1] = (s) * a[0][1];
  543.    b[0][2] = (s) * a[0][2];
  544.    b[0][3] = (s) * a[0][3];
  545.    b[1][0] = (s) * a[1][0];
  546.    b[1][1] = (s) * a[1][1];
  547.    b[1][2] = (s) * a[1][2];
  548.    b[1][3] = (s) * a[1][3];
  549.    b[2][0] = (s) * a[2][0];
  550.    b[2][1] = (s) * a[2][1];
  551.    b[2][2] = (s) * a[2][2];
  552.    b[2][3] = (s) * a[2][3];
  553.    b[3][0] = s * a[3][0];
  554.    b[3][1] = s * a[3][1];
  555.    b[3][2] = s * a[3][2];
  556.    b[3][3] = s * a[3][3];
  557. }
  558. /* ========================================================== */
  559. /* multiply matrix by scalar */
  560. #define ACCUM_SCALE_MATRIX_2X2(b,s,a)
  561. {
  562.    b[0][0] += (s) * a[0][0];
  563.    b[0][1] += (s) * a[0][1];
  564.    b[1][0] += (s) * a[1][0];
  565.    b[1][1] += (s) * a[1][1];
  566. }
  567. /* +========================================================== */
  568. /* multiply matrix by scalar */
  569. #define ACCUM_SCALE_MATRIX_3X3(b,s,a)
  570. {
  571.    b[0][0] += (s) * a[0][0];
  572.    b[0][1] += (s) * a[0][1];
  573.    b[0][2] += (s) * a[0][2];
  574.    b[1][0] += (s) * a[1][0];
  575.    b[1][1] += (s) * a[1][1];
  576.    b[1][2] += (s) * a[1][2];
  577.    b[2][0] += (s) * a[2][0];
  578.    b[2][1] += (s) * a[2][1];
  579.    b[2][2] += (s) * a[2][2];
  580. }
  581. /* +========================================================== */
  582. /* multiply matrix by scalar */
  583. #define ACCUM_SCALE_MATRIX_4X4(b,s,a)
  584. {
  585.    b[0][0] += (s) * a[0][0];
  586.    b[0][1] += (s) * a[0][1];
  587.    b[0][2] += (s) * a[0][2];
  588.    b[0][3] += (s) * a[0][3];
  589.    b[1][0] += (s) * a[1][0];
  590.    b[1][1] += (s) * a[1][1];
  591.    b[1][2] += (s) * a[1][2];
  592.    b[1][3] += (s) * a[1][3];
  593.    b[2][0] += (s) * a[2][0];
  594.    b[2][1] += (s) * a[2][1];
  595.    b[2][2] += (s) * a[2][2];
  596.    b[2][3] += (s) * a[2][3];
  597.    b[3][0] += (s) * a[3][0];
  598.    b[3][1] += (s) * a[3][1];
  599.    b[3][2] += (s) * a[3][2];
  600.    b[3][3] += (s) * a[3][3];
  601. }
  602. /* +========================================================== */
  603. /* matrix product */
  604. /* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
  605. #define MATRIX_PRODUCT_2X2(c,a,b)
  606. {
  607.    c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0];
  608.    c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1];
  609.    c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0];
  610.    c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1];
  611. }
  612. /* ========================================================== */
  613. /* matrix product */
  614. /* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
  615. #define MATRIX_PRODUCT_3X3(c,a,b)
  616. {
  617.    c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];
  618.    c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1];
  619.    c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2];
  620.    c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0];
  621.    c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1];
  622.    c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2];
  623.    c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0];
  624.    c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1];
  625.    c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2];
  626. }
  627. /* ========================================================== */
  628. /* matrix product */
  629. /* c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
  630. #define MATRIX_PRODUCT_4X4(c,a,b)
  631. {
  632.    c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]+a[0][3]*b[3][0];
  633.    c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]+a[0][3]*b[3][1];
  634.    c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2]+a[0][3]*b[3][2];
  635.    c[0][3] = a[0][0]*b[0][3]+a[0][1]*b[1][3]+a[0][2]*b[2][3]+a[0][3]*b[3][3];
  636.    c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0]+a[1][3]*b[3][0];
  637.    c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1];
  638.    c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2]+a[1][3]*b[3][2];
  639.    c[1][3] = a[1][0]*b[0][3]+a[1][1]*b[1][3]+a[1][2]*b[2][3]+a[1][3]*b[3][3];
  640.    c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0]+a[2][3]*b[3][0];
  641.    c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1]+a[2][3]*b[3][1];
  642.    c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2]+a[2][3]*b[3][2];
  643.    c[2][3] = a[2][0]*b[0][3]+a[2][1]*b[1][3]+a[2][2]*b[2][3]+a[2][3]*b[3][3];
  644.    c[3][0] = a[3][0]*b[0][0]+a[3][1]*b[1][0]+a[3][2]*b[2][0]+a[3][3]*b[3][0];
  645.    c[3][1] = a[3][0]*b[0][1]+a[3][1]*b[1][1]+a[3][2]*b[2][1]+a[3][3]*b[3][1];
  646.    c[3][2] = a[3][0]*b[0][2]+a[3][1]*b[1][2]+a[3][2]*b[2][2]+a[3][3]*b[3][2];
  647.    c[3][3] = a[3][0]*b[0][3]+a[3][1]*b[1][3]+a[3][2]*b[2][3]+a[3][3]*b[3][3];
  648. }
  649. /* ========================================================== */
  650. /* matrix times vector */
  651. #define MAT_DOT_VEC_2X2(p,m,v)
  652. {
  653.    p[0] = m[0][0]*v[0] + m[0][1]*v[1];
  654.    p[1] = m[1][0]*v[0] + m[1][1]*v[1];
  655. }
  656. /* ========================================================== */
  657. /* matrix times vector */
  658. #define MAT_DOT_VEC_3X3(p,m,v)
  659. {
  660.    p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];
  661.    p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];
  662.    p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];
  663. }
  664. /* ========================================================== */
  665. /* matrix times vector */
  666. #define MAT_DOT_VEC_4X4(p,m,v)
  667. {
  668.    p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]*v[3];
  669.    p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]*v[3];
  670.    p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]*v[3];
  671.    p[3] = m[3][0]*v[0] + m[3][1]*v[1] + m[3][2]*v[2] + m[3][3]*v[3];
  672. }
  673. /* ========================================================== */
  674. /* vector transpose times matrix */
  675. /* p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */
  676. #define VEC_DOT_MAT_3X3(p,v,m)
  677. {
  678.    p[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0];
  679.    p[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1];
  680.    p[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2];
  681. }
  682. /* ========================================================== */
  683. /* affine matrix times vector */
  684. /* The matrix is assumed to be an affine matrix, with last two 
  685.  * entries representing a translation */
  686. #define MAT_DOT_VEC_2X3(p,m,v)
  687. {
  688.    p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2];
  689.    p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2];
  690. }
  691. /* ========================================================== */
  692. /* inverse transpose of matrix times vector
  693.  *
  694.  * This macro computes inverse transpose of matrix m, 
  695.  * and multiplies vector v into it, to yeild vector p
  696.  *
  697.  * DANGER !!! Do Not use this on normal vectors!!!
  698.  * It will leave normals the wrong length !!!
  699.  * See macro below for use on normals.
  700.  */
  701. #define INV_TRANSP_MAT_DOT_VEC_2X2(p,m,v)
  702. {
  703.    gleDouble det;
  704.    det = m[0][0]*m[1][1] - m[0][1]*m[1][0];
  705.    p[0] = m[1][1]*v[0] - m[1][0]*v[1];
  706.    p[1] = - m[0][1]*v[0] + m[0][0]*v[1];
  707.    /* if matrix not singular, and not orthonormal, then renormalize */ 
  708.    if ((det!=1.0) && (det != 0.0)) {
  709.       det = 1.0 / det;
  710.       p[0] *= det;
  711.       p[1] *= det;
  712.    }
  713. }
  714. /* ========================================================== */
  715. /* transform normal vector by inverse transpose of matrix 
  716.  * and then renormalize the vector 
  717.  *
  718.  * This macro computes inverse transpose of matrix m, 
  719.  * and multiplies vector v into it, to yeild vector p
  720.  * Vector p is then normalized.
  721.  */
  722. #define NORM_XFORM_2X2(p,m,v)
  723. {
  724.    double len;
  725.    /* do nothing if off-diagonals are zero and diagonals are 
  726.     * equal */
  727.    if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) { 
  728.       p[0] = m[1][1]*v[0] - m[1][0]*v[1];
  729.       p[1] = - m[0][1]*v[0] + m[0][0]*v[1];
  730.       len = p[0]*p[0] + p[1]*p[1];
  731.       len = 1.0 / sqrt (len);
  732.       p[0] *= len;
  733.       p[1] *= len;
  734.    } else {
  735.       VEC_COPY_2 (p, v);
  736.    }
  737. }
  738. /* ========================================================== */
  739. /* outer product of vector times vector transpose 
  740.  *
  741.  * The outer product of vector v and vector transpose t yeilds 
  742.  * dyadic matrix m.
  743.  */
  744. #define OUTER_PRODUCT_2X2(m,v,t)
  745. {
  746.    m[0][0] = v[0] * t[0];
  747.    m[0][1] = v[0] * t[1];
  748.    m[1][0] = v[1] * t[0];
  749.    m[1][1] = v[1] * t[1];
  750. }
  751. /* ========================================================== */
  752. /* outer product of vector times vector transpose 
  753.  *
  754.  * The outer product of vector v and vector transpose t yeilds 
  755.  * dyadic matrix m.
  756.  */
  757. #define OUTER_PRODUCT_3X3(m,v,t)
  758. {
  759.    m[0][0] = v[0] * t[0];
  760.    m[0][1] = v[0] * t[1];
  761.    m[0][2] = v[0] * t[2];
  762.    m[1][0] = v[1] * t[0];
  763.    m[1][1] = v[1] * t[1];
  764.    m[1][2] = v[1] * t[2];
  765.    m[2][0] = v[2] * t[0];
  766.    m[2][1] = v[2] * t[1];
  767.    m[2][2] = v[2] * t[2];
  768. }
  769. /* ========================================================== */
  770. /* outer product of vector times vector transpose 
  771.  *
  772.  * The outer product of vector v and vector transpose t yeilds 
  773.  * dyadic matrix m.
  774.  */
  775. #define OUTER_PRODUCT_4X4(m,v,t)
  776. {
  777.    m[0][0] = v[0] * t[0];
  778.    m[0][1] = v[0] * t[1];
  779.    m[0][2] = v[0] * t[2];
  780.    m[0][3] = v[0] * t[3];
  781.    m[1][0] = v[1] * t[0];
  782.    m[1][1] = v[1] * t[1];
  783.    m[1][2] = v[1] * t[2];
  784.    m[1][3] = v[1] * t[3];
  785.    m[2][0] = v[2] * t[0];
  786.    m[2][1] = v[2] * t[1];
  787.    m[2][2] = v[2] * t[2];
  788.    m[2][3] = v[2] * t[3];
  789.    m[3][0] = v[3] * t[0];
  790.    m[3][1] = v[3] * t[1];
  791.    m[3][2] = v[3] * t[2];
  792.    m[3][3] = v[3] * t[3];
  793. }
  794. /* +========================================================== */
  795. /* outer product of vector times vector transpose 
  796.  *
  797.  * The outer product of vector v and vector transpose t yeilds 
  798.  * dyadic matrix m.
  799.  */
  800. #define ACCUM_OUTER_PRODUCT_2X2(m,v,t)
  801. {
  802.    m[0][0] += v[0] * t[0];
  803.    m[0][1] += v[0] * t[1];
  804.    m[1][0] += v[1] * t[0];
  805.    m[1][1] += v[1] * t[1];
  806. }
  807. /* +========================================================== */
  808. /* outer product of vector times vector transpose 
  809.  *
  810.  * The outer product of vector v and vector transpose t yeilds 
  811.  * dyadic matrix m.
  812.  */
  813. #define ACCUM_OUTER_PRODUCT_3X3(m,v,t)
  814. {
  815.    m[0][0] += v[0] * t[0];
  816.    m[0][1] += v[0] * t[1];
  817.    m[0][2] += v[0] * t[2];
  818.    m[1][0] += v[1] * t[0];
  819.    m[1][1] += v[1] * t[1];
  820.    m[1][2] += v[1] * t[2];
  821.    m[2][0] += v[2] * t[0];
  822.    m[2][1] += v[2] * t[1];
  823.    m[2][2] += v[2] * t[2];
  824. }
  825. /* +========================================================== */
  826. /* outer product of vector times vector transpose 
  827.  *
  828.  * The outer product of vector v and vector transpose t yeilds 
  829.  * dyadic matrix m.
  830.  */
  831. #define ACCUM_OUTER_PRODUCT_4X4(m,v,t)
  832. {
  833.    m[0][0] += v[0] * t[0];
  834.    m[0][1] += v[0] * t[1];
  835.    m[0][2] += v[0] * t[2];
  836.    m[0][3] += v[0] * t[3];
  837.    m[1][0] += v[1] * t[0];
  838.    m[1][1] += v[1] * t[1];
  839.    m[1][2] += v[1] * t[2];
  840.    m[1][3] += v[1] * t[3];
  841.    m[2][0] += v[2] * t[0];
  842.    m[2][1] += v[2] * t[1];
  843.    m[2][2] += v[2] * t[2];
  844.    m[2][3] += v[2] * t[3];
  845.    m[3][0] += v[3] * t[0];
  846.    m[3][1] += v[3] * t[1];
  847.    m[3][2] += v[3] * t[2];
  848.    m[3][3] += v[3] * t[3];
  849. }
  850. /* +========================================================== */
  851. /* determinant of matrix
  852.  *
  853.  * Computes determinant of matrix m, returning d
  854.  */
  855. #define DETERMINANT_2X2(d,m)
  856. {
  857.    d = m[0][0] * m[1][1] - m[0][1] * m[1][0];
  858. }
  859. /* ========================================================== */
  860. /* determinant of matrix
  861.  *
  862.  * Computes determinant of matrix m, returning d
  863.  */
  864. #define DETERMINANT_3X3(d,m)
  865. {
  866.    d = m[0][0] * (m[1][1]*m[2][2] - m[1][2] * m[2][1]);
  867.    d -= m[0][1] * (m[1][0]*m[2][2] - m[1][2] * m[2][0]);
  868.    d += m[0][2] * (m[1][0]*m[2][1] - m[1][1] * m[2][0]);
  869. }
  870. /* ========================================================== */
  871. /* i,j,th cofactor of a 4x4 matrix
  872.  *
  873.  */
  874. #define COFACTOR_4X4_IJ(fac,m,i,j) 
  875. {
  876.    int ii[4], jj[4], k;
  877.    /* compute which row, columnt to skip */
  878.    for (k=0; k<i; k++) ii[k] = k;
  879.    for (k=i; k<3; k++) ii[k] = k+1;
  880.    for (k=0; k<j; k++) jj[k] = k;
  881.    for (k=j; k<3; k++) jj[k] = k+1;
  882.    (fac) = m[ii[0]][jj[0]] * (m[ii[1]][jj[1]]*m[ii[2]][jj[2]] 
  883.                             - m[ii[1]][jj[2]]*m[ii[2]][jj[1]]); 
  884.    (fac) -= m[ii[0]][jj[1]] * (m[ii[1]][jj[0]]*m[ii[2]][jj[2]]
  885.                              - m[ii[1]][jj[2]]*m[ii[2]][jj[0]]);
  886.    (fac) += m[ii[0]][jj[2]] * (m[ii[1]][jj[0]]*m[ii[2]][jj[1]]
  887.                              - m[ii[1]][jj[1]]*m[ii[2]][jj[0]]);
  888.    /* compute sign */
  889.    k = i+j;
  890.    if ( k != (k/2)*2) {
  891.       (fac) = -(fac);
  892.    }
  893. }
  894. /* ========================================================== */
  895. /* determinant of matrix
  896.  *
  897.  * Computes determinant of matrix m, returning d
  898.  */
  899. #define DETERMINANT_4X4(d,m)
  900. {
  901.    double cofac;
  902.    COFACTOR_4X4_IJ (cofac, m, 0, 0);
  903.    d = m[0][0] * cofac;
  904.    COFACTOR_4X4_IJ (cofac, m, 0, 1);
  905.    d += m[0][1] * cofac;
  906.    COFACTOR_4X4_IJ (cofac, m, 0, 2);
  907.    d += m[0][2] * cofac;
  908.    COFACTOR_4X4_IJ (cofac, m, 0, 3);
  909.    d += m[0][3] * cofac;
  910. }
  911. /* ========================================================== */
  912. /* cofactor of matrix
  913.  *
  914.  * Computes cofactor of matrix m, returning a
  915.  */
  916. #define COFACTOR_2X2(a,m)
  917. {
  918.    a[0][0] = (m)[1][1];
  919.    a[0][1] = - (m)[1][0];
  920.    a[1][0] = - (m)[0][1];
  921.    a[1][1] = (m)[0][0];
  922. }
  923. /* ========================================================== */
  924. /* cofactor of matrix
  925.  *
  926.  * Computes cofactor of matrix m, returning a
  927.  */
  928. #define COFACTOR_3X3(a,m)
  929. {
  930.    a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];
  931.    a[0][1] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);
  932.    a[0][2] = m[1][0]*m[2][1] - m[1][1]*m[2][0];
  933.    a[1][0] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);
  934.    a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];
  935.    a[1][2] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);
  936.    a[2][0] = m[0][1]*m[1][2] - m[0][2]*m[1][1];
  937.    a[2][1] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);
  938.    a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);
  939. }
  940. /* ========================================================== */
  941. /* cofactor of matrix
  942.  *
  943.  * Computes cofactor of matrix m, returning a
  944.  */
  945. #define COFACTOR_4X4(a,m)
  946. {
  947.    int i,j;
  948.    for (i=0; i<4; i++) {
  949.       for (j=0; j<4; j++) {
  950.          COFACTOR_4X4_IJ (a[i][j], m, i, j);
  951.       }
  952.    }
  953. }
  954. /* ========================================================== */
  955. /* adjoint of matrix
  956.  *
  957.  * Computes adjoint of matrix m, returning a
  958.  * (Note that adjoint is just the transpose of the cofactor matrix)
  959.  */
  960. #define ADJOINT_2X2(a,m)
  961. {
  962.    a[0][0] = (m)[1][1];
  963.    a[1][0] = - (m)[1][0];
  964.    a[0][1] = - (m)[0][1];
  965.    a[1][1] = (m)[0][0];
  966. }
  967. /* ========================================================== */
  968. /* adjoint of matrix
  969.  *
  970.  * Computes adjoint of matrix m, returning a
  971.  * (Note that adjoint is just the transpose of the cofactor matrix)
  972.  */
  973. #define ADJOINT_3X3(a,m)
  974. {
  975.    a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];
  976.    a[1][0] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);
  977.    a[2][0] = m[1][0]*m[2][1] - m[1][1]*m[2][0];
  978.    a[0][1] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);
  979.    a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];
  980.    a[2][1] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);
  981.    a[0][2] = m[0][1]*m[1][2] - m[0][2]*m[1][1];
  982.    a[1][2] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);
  983.    a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);
  984. }
  985. /* ========================================================== */
  986. /* adjoint of matrix
  987.  *
  988.  * Computes adjoint of matrix m, returning a
  989.  * (Note that adjoint is just the transpose of the cofactor matrix)
  990.  */
  991. #define ADJOINT_4X4(a,m)
  992. {
  993.    int i,j;
  994.    for (i=0; i<4; i++) {
  995.       for (j=0; j<4; j++) {
  996.          COFACTOR_4X4_IJ (a[j][i], m, i, j);
  997.       }
  998.    }
  999. }
  1000. /* ========================================================== */
  1001. /* compute adjoint of matrix and scale
  1002.  *
  1003.  * Computes adjoint of matrix m, scales it by s, returning a
  1004.  */
  1005. #define SCALE_ADJOINT_2X2(a,s,m)
  1006. {
  1007.    a[0][0] = (s) * m[1][1];
  1008.    a[1][0] = - (s) * m[1][0];
  1009.    a[0][1] = - (s) * m[0][1];
  1010.    a[1][1] = (s) * m[0][0];
  1011. }
  1012. /* ========================================================== */
  1013. /* compute adjoint of matrix and scale
  1014.  *
  1015.  * Computes adjoint of matrix m, scales it by s, returning a
  1016.  */
  1017. #define SCALE_ADJOINT_3X3(a,s,m)
  1018. {
  1019.    a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]);
  1020.    a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]);
  1021.    a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);
  1022.    a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]);
  1023.    a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]);
  1024.    a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]);
  1025.    a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]);
  1026.    a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]);
  1027.    a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]);
  1028. }
  1029. /* ========================================================== */
  1030. /* compute adjoint of matrix and scale
  1031.  *
  1032.  * Computes adjoint of matrix m, scales it by s, returning a
  1033.  */
  1034. #define SCALE_ADJOINT_4X4(a,s,m)
  1035. {
  1036.    int i,j;
  1037.    for (i=0; i<4; i++) {
  1038.       for (j=0; j<4; j++) {
  1039.          COFACTOR_4X4_IJ (a[j][i], m, i, j);
  1040.          a[j][i] *= s;
  1041.       }
  1042.    }
  1043. }
  1044. /* ========================================================== */
  1045. /* inverse of matrix 
  1046.  *
  1047.  * Compute inverse of matrix a, returning determinant m and 
  1048.  * inverse b
  1049.  */
  1050. #define INVERT_2X2(b,det,a)
  1051. {
  1052.    double tmp;
  1053.    DETERMINANT_2X2 (det, a);
  1054.    tmp = 1.0 / (det);
  1055.    SCALE_ADJOINT_2X2 (b, tmp, a);
  1056. }
  1057. /* ========================================================== */
  1058. /* inverse of matrix 
  1059.  *
  1060.  * Compute inverse of matrix a, returning determinant m and 
  1061.  * inverse b
  1062.  */
  1063. #define INVERT_3X3(b,det,a)
  1064. {
  1065.    double tmp;
  1066.    DETERMINANT_3X3 (det, a);
  1067.    tmp = 1.0 / (det);
  1068.    SCALE_ADJOINT_3X3 (b, tmp, a);
  1069. }
  1070. /* ========================================================== */
  1071. /* inverse of matrix 
  1072.  *
  1073.  * Compute inverse of matrix a, returning determinant m and 
  1074.  * inverse b
  1075.  */
  1076. #define INVERT_4X4(b,det,a)
  1077. {
  1078.    double tmp;
  1079.    DETERMINANT_4X4 (det, a);
  1080.    tmp = 1.0 / (det);
  1081.    SCALE_ADJOINT_4X4 (b, tmp, a);
  1082. }
  1083. /* ========================================================== */
  1084. #if defined(__cplusplus) || defined(c_plusplus)
  1085. }
  1086. #endif
  1087. #endif /* __GUTIL_VECTOR_H__ */
  1088. /* ===================== END OF FILE ======================== */