/* --------------- */ /* Data structures */ /* --------------- */ typedef float Scalar; typedef struct { Scalar x, y; } Vector; /* --------------------------- */ /* Vector Operation Prototypes */ /* --------------------------- */ void SetVector(Vector *v, Scalar x, Scalar y); Scalar Distance(Vector v1, Vector v2); Scalar Magnitude(Vector v); void Direction(Vector vin, Vector *vout); void VectorSum(Vector v1, Vector v2, Vector *vsum); void VectorDifference(Vector v1, Vector v2, Vector *vdiff); void VectorByScalar(Vector vin, Scalar s, Vector *vprod); Scalar DotProduct(Vector v1, Vector v2); Boolean Constrain(Vector *v, Rect r); /************************************************/ /* Vector Operation Routines */ /************************************************/ void SetVector(Vector *v, Scalar x, Scalar y) { v->x = x; v->y = y; } Scalar Distance(Vector v1, Vector v2) { Scalar dx, dy; dx = v1.x - v2.x; dy = v1.y - v2.y; return (Scalar)sqrt((double)(dx * dx + dy * dy)); } Scalar Magnitude(Vector v) { return (Scalar)sqrt((double)(v.x * v.x + v.y * v.y)); } void Direction(Vector vin, Vector *vout) { Scalar mag; mag = Magnitude(vin); if (mag == 0.0) mag = 0.01; vout->x = vin.x / mag; vout->y = vin.y / mag; } void VectorSum(Vector v1, Vector v2, Vector *vsum) { vsum->x = v1.x + v2.x; vsum->y = v1.y + v2.y; } void VectorDifference(Vector v1, Vector v2, Vector *vdiff) { vdiff->x = v1.x - v2.x; vdiff->y = v1.y - v2.y; } void VectorByScalar(Vector vin, Scalar s, Vector *vprod) { vprod->x = vin.x * s; vprod->y = vin.y * s; } Scalar DotProduct(Vector v1, Vector v2) { return (v1.x * v2.x) + (v1.y * v2.y); } Boolean Constrain(Vector *v, Rect r) { Boolean b = false; if (v->x > (Scalar)(r.right)) { v->x = (Scalar)(r.right); b = true; } if (v->x < (Scalar)(r.left)) { v->x = (Scalar)(r.left); b = true; } if (v->y > (Scalar)(r.bottom)) { v->y = (Scalar)(r.bottom); b = true; } if (v->y < (Scalar)(r.left)) { v->y = (Scalar)(r.left); b = true; } return b; } void ScalarToPString(Scalar num, StringPtr str, char *fmt) { sprintf((char *)str, fmt, (double)num); CtoPstr((char *)str); } void PStringToScalar(StringPtr str, Scalar *num) { int numargs; double d; PtoCstr((unsigned char *)str); numargs = sscanf((char *)str, "%lg", &d); *num = (Scalar)d; }