home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / Rhapsody / Graphics / Morph-2.0a / algebra.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-01  |  3.8 KB  |  116 lines

  1. // algebra.h
  2. //
  3. // Some macros to ease calculation involving lines, vectors and points
  4. // Vector and NSPoint are used in a rather confused manner here. They
  5. // basicaly the same.
  6. //
  7. // created by Martin Wennerberg on Sun 12-Nov-1995
  8. //
  9. // when        who    modification
  10.  
  11. #include <Foundation/Foundation.h>
  12.  
  13. typedef NSPoint Vector;
  14.  
  15. static inline float vt_dotProd (Vector v1, Vector v2)
  16. { return v1.x * v2.x + v1.y * v2.y; }
  17.  
  18. static inline float vt_length (Vector v)
  19. { return sqrt(v.x * v.x + v.y * v.y);}
  20.  
  21. static inline float vt_angle (Vector v)
  22. { return atan2(v.y, v.x);}
  23.  
  24. static inline Vector vt_scale (Vector v, float d)
  25. { return NSMakePoint((v.x) * (d), (v.y) * (d));}
  26.  
  27. static inline Vector vt_perp (Vector v, float d)
  28. { return NSMakePoint(v.y, -v.x);}
  29.  
  30. static inline NSPoint pt_sum (NSPoint v1, NSPoint v2)
  31. { return NSMakePoint((v1.x) + (v2.x), (v1.y) + (v2.y));}
  32.  
  33. static inline NSPoint pt_sub (NSPoint v1, NSPoint v2)
  34. { return NSMakePoint((v1.x) - (v2.x), (v1.y) - (v2.y));}
  35.  
  36. static inline NSPoint pt_scale (NSPoint p, float sx, float sy)
  37. { return NSMakePoint((p.x) * (sx), (p.y) * (sy));}
  38.  
  39. static inline float pt_dist2 (NSPoint p1, NSPoint p2)
  40. { return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);}
  41.  
  42. static inline float pt_dist (NSPoint p1, NSPoint p2)
  43. { return sqrt (pt_dist2 (p1, p2));}
  44.  
  45. static inline float line_angle (NSPoint p1, NSPoint p2)
  46. {
  47.     return  vt_angle(pt_sub(p2, p1));
  48. }
  49.  
  50. static inline NSPoint pt_wmean (NSPoint p1, NSPoint p2, float d)
  51. { return  NSMakePoint (p1.x + d * (p2.x - p1.x), p1.y + d * (p2.y - p1.y));}
  52.  
  53. static inline NSRect rectContainingPoints (NSPoint p1, NSPoint p2)
  54. { return NSMakeRect(MIN(p1.x, p2.x), MIN(p1.y, p2.y), MAX(p1.x, p2.x) - MIN(p1.x, p2.x),MAX(p1.y, p2.y) - MIN(p1.y, p2.y));}
  55.  
  56. static inline float line_perp_dist (NSPoint p1, NSPoint p2, NSPoint p)
  57. {return vt_length( pt_sub( p,
  58.                          pt_sum( p1,
  59.                                  vt_scale( pt_sub( p2,p1),
  60.                                            vt_dotProd( pt_sub(p,p1), pt_sub(p2,p1))
  61.                                            / vt_dotProd (pt_sub(p2,p1), pt_sub(p2,p1))))));}
  62.  
  63. static inline float line_perp_dist2 (NSPoint p1, NSPoint p2, NSPoint p)
  64. {
  65.     NSPoint pt = ( pt_sub( p,
  66.                          pt_sum( p1,
  67.                                  vt_scale( pt_sub( p2,p1),
  68.                                            vt_dotProd( pt_sub(p,p1), pt_sub(p2,p1))
  69.                                            / vt_dotProd (pt_sub(p2,p1), pt_sub(p2,p1))))));
  70.     return pt.x * pt.x + pt.y * pt.y;
  71. }
  72.  
  73. // Returns the perpendicular distance from a point p and a line that goes throught p1 and p2. Neads cleaning.
  74.  
  75. static inline float line_pos_along (NSPoint p1, NSPoint p2, NSPoint p)
  76. { return vt_dotProd (pt_sub (p, p1), pt_sub (p2, p1))
  77.          / pt_dist2 (p1, p2);}
  78.  
  79. static inline float line_dist_to_point (NSPoint p1, NSPoint p2, NSPoint p)
  80. {
  81.   float posAlong = line_pos_along (p1, p2, p);
  82.  
  83.   if (posAlong > 1)
  84.     return pt_dist (p2, p);
  85.   else if (posAlong < 0)    
  86.     return pt_dist (p1, p);    
  87.   else
  88.     return line_perp_dist (p1, p2, p);
  89. }
  90.  
  91. static inline float line_dist2_to_point (NSPoint p1, NSPoint p2, NSPoint p)
  92. {
  93.     float posAlong = line_pos_along (p1, p2, p);
  94.     
  95.   if (posAlong > 1)
  96.     return pt_dist2 (p2, p);
  97.   else if (posAlong < 0)    
  98.     return pt_dist2 (p1, p);    
  99.   else
  100.       return line_perp_dist2 (p1, p2, p);
  101. }
  102.  
  103. /**********************************************************
  104.  * © Old version
  105.  **********************************************************/
  106.  
  107. #define PI    3.147158
  108. #define PT_DOTPROD(p1,p2)    (p1.x * p2.x + p1.y * p2.y)
  109. #define PT_LENGTH(p)    sqrt(p.x * p.x + p.y * p.y)
  110. #define PT_ANGLE(p)    (atan2(p.y,p.x))
  111. /*
  112. extern NSPoint    PT_sum (NSPoint p1, NSPoint p2);
  113. extern NSPoint    PT_sub (NSPoint p1, NSPoint p2);
  114. extern NSPoint    PT_scale (float k, NSPoint p);
  115. extern NSPoint    PT_perp (NSPoint p);
  116. */