ftp.nice.ch/pub/next/graphics/movie/Morph2a.s.tar.gz#/Morph2/algebra.h

This is algebra.h in view mode; [Download] [Up]

// algebra.h
//
// Some macros to ease calculation involving lines, vectors and points
// Vector and NSPoint are used in a rather confused manner here. They
// basicaly the same.
//
// created by Martin Wennerberg on Sun 12-Nov-1995
//
// when		who	modification

#include <Foundation/Foundation.h>

typedef NSPoint Vector;

static inline float vt_dotProd (Vector v1, Vector v2)
{ return v1.x * v2.x + v1.y * v2.y; }

static inline float vt_length (Vector v)
{ return sqrt(v.x * v.x + v.y * v.y);}

static inline float vt_angle (Vector v)
{ return atan2(v.y, v.x);}

static inline Vector vt_scale (Vector v, float d)
{ return NSMakePoint((v.x) * (d), (v.y) * (d));}

static inline Vector vt_perp (Vector v, float d)
{ return NSMakePoint(v.y, -v.x);}

static inline NSPoint pt_sum (NSPoint v1, NSPoint v2)
{ return NSMakePoint((v1.x) + (v2.x), (v1.y) + (v2.y));}

static inline NSPoint pt_sub (NSPoint v1, NSPoint v2)
{ return NSMakePoint((v1.x) - (v2.x), (v1.y) - (v2.y));}

static inline NSPoint pt_scale (NSPoint p, float sx, float sy)
{ return NSMakePoint((p.x) * (sx), (p.y) * (sy));}

static inline float pt_dist2 (NSPoint p1, NSPoint p2)
{ return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);}

static inline float pt_dist (NSPoint p1, NSPoint p2)
{ return sqrt (pt_dist2 (p1, p2));}

static inline float line_angle (NSPoint p1, NSPoint p2)
{
    return  vt_angle(pt_sub(p2, p1));
}

static inline NSPoint pt_wmean (NSPoint p1, NSPoint p2, float d)
{ return  NSMakePoint (p1.x + d * (p2.x - p1.x), p1.y + d * (p2.y - p1.y));}

static inline NSRect rectContainingPoints (NSPoint p1, NSPoint p2)
{ 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));}

static inline float line_perp_dist (NSPoint p1, NSPoint p2, NSPoint p)
{return vt_length( pt_sub( p,
                         pt_sum( p1,
                                 vt_scale( pt_sub( p2,p1),
                                           vt_dotProd( pt_sub(p,p1), pt_sub(p2,p1))
                                           / vt_dotProd (pt_sub(p2,p1), pt_sub(p2,p1))))));}

static inline float line_perp_dist2 (NSPoint p1, NSPoint p2, NSPoint p)
{
    NSPoint pt = ( pt_sub( p,
                         pt_sum( p1,
                                 vt_scale( pt_sub( p2,p1),
                                           vt_dotProd( pt_sub(p,p1), pt_sub(p2,p1))
                                           / vt_dotProd (pt_sub(p2,p1), pt_sub(p2,p1))))));
    return pt.x * pt.x + pt.y * pt.y;
}

// Returns the perpendicular distance from a point p and a line that goes throught p1 and p2. Neads cleaning.

static inline float line_pos_along (NSPoint p1, NSPoint p2, NSPoint p)
{ return vt_dotProd (pt_sub (p, p1), pt_sub (p2, p1))
         / pt_dist2 (p1, p2);}

static inline float line_dist_to_point (NSPoint p1, NSPoint p2, NSPoint p)
{
  float posAlong = line_pos_along (p1, p2, p);

  if (posAlong > 1)
    return pt_dist (p2, p);
  else if (posAlong < 0)	
    return pt_dist (p1, p);	
  else
    return line_perp_dist (p1, p2, p);
}

static inline float line_dist2_to_point (NSPoint p1, NSPoint p2, NSPoint p)
{
    float posAlong = line_pos_along (p1, p2, p);
    
  if (posAlong > 1)
    return pt_dist2 (p2, p);
  else if (posAlong < 0)	
    return pt_dist2 (p1, p);	
  else
      return line_perp_dist2 (p1, p2, p);
}

/**********************************************************
 *   Old version
 **********************************************************/

#define PI	3.147158
#define PT_DOTPROD(p1,p2)	(p1.x * p2.x + p1.y * p2.y)
#define PT_LENGTH(p)	sqrt(p.x * p.x + p.y * p.y)
#define PT_ANGLE(p)	(atan2(p.y,p.x))
/*
extern NSPoint	PT_sum (NSPoint p1, NSPoint p2);
extern NSPoint	PT_sub (NSPoint p1, NSPoint p2);
extern NSPoint	PT_scale (float k, NSPoint p);
extern NSPoint	PT_perp (NSPoint p);
*/

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.