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.