home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch7_7 / mactbox / vec2.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-24  |  4.6 KB  |  197 lines

  1. /* ------------------------------------------------------------------------- *\
  2.    VEC2.H :
  3.  
  4.    Definition and manipulation of a 2D vector (either integers or reals)
  5.  
  6.    by Christophe Schlick (1 June 1992)
  7. \* ------------------------------------------------------------------------- */
  8.  
  9. #ifndef _VEC2_
  10. #define _VEC2_
  11.  
  12. #include "tool.h"
  13.  
  14. /*
  15. ** These macros are equivalent (for 2D vectors) to the ones given in tool.h
  16. */
  17.  
  18. #define MAKE_VEC2(V,X,Y)\
  19.         ((V).x = X,\
  20.          (V).y = Y)
  21.  
  22. #define COPY_VEC2(V,A)\
  23.         ((V).x = (A).x,\
  24.          (V).y = (A).y)
  25.  
  26. #define SWAP_VEC2(A,B,t)\
  27.         (SWAP ((A).x, (B).x, t),\
  28.          SWAP ((A).y, (B).y, t))
  29.  
  30. #define ABS_VEC2(V,A)\
  31.         ((V).x = ABS ((A).x),\
  32.          (V).y = ABS ((A).y))
  33.  
  34. #define SGN_VEC2(V,A)\
  35.         ((V).x = SGN ((A).x),\
  36.          (V).y = SGN ((A).y))
  37.  
  38. #define NEG_VEC2(V,A)\
  39.         ((V).x = -(A).x,\
  40.          (V).y = -(A).y)
  41.  
  42. #define ROUND_VEC2(V,A)\
  43.         ((V).x = ROUND ((A).x),\
  44.          (V).y = ROUND ((A).y))
  45.  
  46. #define ZERO_VEC2(A)\
  47.         (ZERO ((A).x) &&\
  48.          ZERO ((A).y))
  49.  
  50. #define ZERO_TOL_VEC2(A,t)\
  51.         (ZERO_TOL ((A).x,t) &&\
  52.          ZERO_TOL ((A).y,t))
  53.  
  54. #define SAME_VEC2(A,B)\
  55.         (SAME ((A).x,(B).x) &&\
  56.          SAME ((A).y,(B).y))
  57.  
  58. #define SAME_TOL_VEC2(A,B,t)\
  59.         (SAME_TOL ((A).x,(B).x,t) &&\
  60.          SAME_TOL ((A).y,(B).y,t))
  61.  
  62. #define IN_VEC2(V,A,B)\
  63.         (IN ((V).x,(A).x,(B).x) &&\
  64.          IN ((V).y,(A).y,(B).y))
  65.  
  66. #define OUT_VEC2(V,A,B)\
  67.         (OUT ((V).x,(A).x,(B).x) ||\
  68.          OUT ((V).y,(A).y,(B).y))
  69.  
  70. #define CLAMP_VEC2(V,A,B)\
  71.         ((V).x = CLAMP ((A).x,(B).x),\
  72.          (V).y = CLAMP ((A).y,(B).y))
  73.  
  74. #define MIN_VEC2(V,A,B)\
  75.         ((V).x = MIN ((A).x,(B).x),\
  76.          (V).y = MIN ((A).y,(B).y))
  77.  
  78. #define MAX_VEC2(V,A,B)\
  79.         ((V).x = MAX ((A).x,(B).x),\
  80.          (V).y = MAX ((A).y,(B).y))
  81.  
  82. #define MINMIN_VEC2(V,A,B,C)\
  83.         ((V).x = MINMIN ((A).x,(B).x,(C).x),\
  84.          (V).y = MINMIN ((A).y,(B).y,(C).y))
  85.  
  86. #define MAXMAX_VEC2(V,A,B,C)\
  87.         ((V).x = MAXMAX ((A).x,(B).x,(C).x),\
  88.          (V).y = MAXMAX ((A).y,(B).y,(C).y))
  89.  
  90. /*
  91. ** Addition, subtraction, multiplication, division (by a vector element)
  92. */
  93.  
  94. #define INC_VEC2(V,A)\
  95.         ((V).x += (A).x,\
  96.          (V).y += (A).y)
  97.  
  98. #define DEC_VEC2(V,A)\
  99.         ((V).x -= (A).x,\
  100.          (V).y -= (A).y)
  101.  
  102. #define ADD_VEC2(V,A,B)\
  103.         ((V).x = (A).x + (B).x,\
  104.          (V).y = (A).y + (B).y)
  105.  
  106. #define SUB_VEC2(V,A,B)\
  107.         ((V).x = (A).x - (B).x,\
  108.          (V).y = (A).y - (B).y)
  109.  
  110. #define MUL_VEC2(V,A,B)\
  111.         ((V).x = (A).x * (B).x,\
  112.          (V).y = (A).y * (B).y)
  113.  
  114. #define DIV_VEC2(V,A,B)\
  115.         ((V).x = (A).x / (B).x,\
  116.          (V).y = (A).y / (B).y)
  117.  
  118. /*
  119. ** Addition, subtraction, multiplication, division (by a scalar element)
  120. */
  121.  
  122. #define INCS_VEC2(V,s)\
  123.         ((V).x += (s),\
  124.          (V).y += (s))
  125.  
  126. #define DECS_VEC2(V,s)\
  127.         ((V).x -= (s),\
  128.          (V).y -= (s))
  129.  
  130. #define ADDS_VEC2(V,A,s)\
  131.         ((V).x = (A).x + (s),\
  132.          (V).y = (A).y + (s))
  133.  
  134. #define SUBS_VEC2(V,A,s)\
  135.         ((V).x = (A).x - (s),\
  136.          (V).y = (A).y - (s))
  137.  
  138. #define MULS_VEC2(V,A,s)\
  139.         ((V).x = (A).x * (s),\
  140.          (V).y = (A).y * (s))
  141.  
  142. #define DIVS_VEC2(V,A,s)\
  143.         ((V).x = (A).x / (s),\
  144.          (V).y = (A).y / (s))
  145.  
  146. /*
  147. ** Linear combinations, linear/hermite/cardinal interpolations (see "tool.h")
  148. */
  149.  
  150. #define COMB2_VEC2(V,a,A,b,B)\
  151.         ((V).x = (a) * (A).x + (b) * (B).x,\
  152.          (V).y = (a) * (A).y + (b) * (B).y)
  153.  
  154. #define COMB3_VEC2(V,a,A,b,B,c,C)\
  155.         ((V).x = (a) * (A).x + (b) * (B).x + (c) * (C).x,\
  156.          (V).y = (a) * (A).y + (b) * (B).y + (c) * (C).y)
  157.  
  158. #define COMB4_VEC2(V,a,A,b,B,c,C,d,D)\
  159.         ((V).x = (a) * (A).x + (b) * (B).x + (c) * (C).x + (d) * (D).x,\
  160.          (V).y = (a) * (A).y + (b) * (B).y + (c) * (C).y + (d) * (D).y)
  161.  
  162. #define LERP_VEC2(V,t,A,B)\
  163.         ((V).x = LERP ((t), (A).x, (B).x),\
  164.          (V).y = LERP ((t), (A).y, (B).y))
  165.  
  166. #define HERP_VEC2(V,t,A,B)\
  167.         ((V).x = HERP ((t), (A).x, (B).x),\
  168.          (V).y = HERP ((t), (A).y, (B).y))
  169.  
  170. #define CERP_VEC2(V,t,AA,A,B,BB)\
  171.         ((V).x = CERP ((t), (AA).x, (A).x, (B).x, (BB).x),\
  172.          (V).y = CERP ((t), (AA).y, (A).y, (B).y, (BB).y))
  173.  
  174. /*
  175. ** Perpendicular, determinant, dot product, length, normalization
  176. */
  177.  
  178. #define PERP_VEC2(V,A)\
  179.         ((V).x = -(A).y,\
  180.          (V).y = (A).x)
  181.  
  182. #define DELTA_VEC2(A,B)\
  183.         ((A).x * (B).y - (A).y * (B).x)
  184.  
  185. #define DOT_VEC2(A,B)\
  186.         ((A).x * (B).x + (A).y * (B).y)
  187.  
  188. #define LEN_VEC2(A)\
  189.         (sqrt ((double) DOT_VEC2 (A,A)))
  190.  
  191. #define UNIT_VEC2(V,A,s)\
  192.         ((s) = LEN_VEC2(A), (s) ? (DIVS_VEC2 (V,A,s), TRUE) : FALSE)
  193.  
  194. #endif
  195.  
  196. /* ------------------------------------------------------------------------- */
  197.