From: Andy Spencer Date: Sat, 22 Jan 2011 19:57:15 +0000 (+0000) Subject: Add vector operations to utilities X-Git-Tag: v0.5~30 X-Git-Url: http://pileus.org/git/?p=grits;a=commitdiff_plain;h=a4cd6299ce7e513a68dc80d23fba56238337107f Add vector operations to utilities --- diff --git a/src/grits-util.c b/src/grits-util.c index a792014..2613596 100644 --- a/src/grits-util.c +++ b/src/grits-util.c @@ -235,3 +235,71 @@ gdouble lon_avg(gdouble a, gdouble b) } return avg; } + +/** + * crossd3: + * @a: the left point + * @b: the center point + * @c: the right point + * @out: the cross product + * + * Calculate the cross product of three points + */ +void crossd3(gdouble *a, gdouble *b, gdouble *c, gdouble *out) +{ + double ba[3], bc[3]; + + ba[0] = a[0] - b[0]; + ba[1] = a[1] - b[1]; + ba[2] = a[2] - b[2]; + + bc[0] = c[0] - b[0]; + bc[1] = c[1] - b[1]; + bc[2] = c[2] - b[2]; + + crossd(ba, bc, out); +} + +/** + * crossd: + * @a: the first vector + * @b: the second vector + * @c: the cross product + * + * Calculate the cross product of two vectors + */ +void crossd(gdouble *a, gdouble *b, gdouble *out) +{ + out[0] = a[1] * b[2] - a[2] * b[1]; + out[1] = a[2] * b[0] - a[0] * b[2]; + out[2] = a[0] * b[1] - a[1] * b[0]; +} + +/** + * lengthd: + * @a: the vector + * + * Calculate the length (magnitude) of a vector. + * + * Returns: the length + */ +gdouble lengthd(gdouble *a) +{ + return sqrt(a[0] * a[0] + + a[1] * a[1] + + a[2] * a[2]); +} + +/** + * normd: + * @a: the first longitude + * + * Normalize a vector to a mangitude of 1 + */ +void normd(gdouble *a) +{ + gdouble total = lengthd(a); + a[0] = a[0] / total; + a[1] = a[1] / total; + a[2] = a[2] / total; +} diff --git a/src/grits-util.h b/src/grits-util.h index 0771541..3c331f0 100644 --- a/src/grits-util.h +++ b/src/grits-util.h @@ -202,6 +202,14 @@ gdouble ll2m(gdouble lon_dist, gdouble lat); gdouble distd(gdouble *a, gdouble *b); +void crossd(gdouble *a, gdouble *b, gdouble *out); + +void crossd3(gdouble *a, gdouble *b, gdouble *c, gdouble *out); + +gdouble lengthd(gdouble *a); + +void normd(gdouble *a); + gdouble lon_avg(gdouble a, gdouble b); #endif