// cross_general.c vector cross product generalized to higher dimensions // cos(angle between A C) = (A dot C) / (|A|*|C|) // = just A dot C if normalized length = 1 // stated simply: the dot product of two orthogonal vectors is zero. // // Cross product A x B = C, C is orthogonal to A and B, cos(Pi/2)=0 // // 3 dimensions i, j, k unit vectors C = |c1, c2, c3| = A x B // given A = |a1, a2, a3| B = |b1, b2, b3| orthogonal // // | i j k| c1 = det||a2,a3|,|b2,b3|| = a2*b3 - a3*b2 // C = det |a1 a2 a3| c2 = -det||a1,a3|,|b1,b3|| = a3*b1 - a1*b3 // |b1 b2 b3| c3 = det||a1,a2|,|b1,b2|| = a1*b2 - a2*b1 // // where det||a2,a3|,|b2,b3|| = determinant of matrix |a2 a3| // |b2 b3| // // // Cross product A x B x C = D, D is orthogonal to A and B and C // 4 dimensions i, j, k, l unit vectors D = |d1, d2, d3, d4| = A x B x C // given A = |a1, a2, a3, a4| and B and C orthogonal // // | i j k l| d1 = det||a2,a3,a4|,|b2,b3,b4|,|c2,c3,c4|| // D = det |a1 a2 a3 a4| d2 = -det||a1,a3,a4|,|b1,b3,b4|,|c1,c3,c4|| // |b1 b2 b3 b4| d3 = det||a1,a2,a4|,|b1,b2,b4|,|c1,c2,c4|| // |c1 c2 c3 c4| d4 = -det||a1,a2,a3|,|b1,b2,b3|,|c1,c2,c3|| // D is orthogonal to A and B and C // note 3 by 3 sub matrices exclude row for index being computed // // |a2 a3 a4| |a1 a3 a4| |a1 a2 a4| |a1 a2 a3| // d1=det|b2 b3 b4| d2=-det|b1 b3 b4| d3=det|b1 b2 b4| d4=-det|b1 b2 b3| // |c2 c3 c4| |c1 c3 c4| |c1 c2 c4| |c1 c2 c3| // // Also note D = B x C can be computed as sums of products of // two terms, by setting A = |1,1,1,1| because // multiplying by a term = 1, does not change the value // // d1 = det|b3 b4| - det|b2 b4| + det|b2 b3| be careful of minus signs // |c3 c4| |c2 c4| |c2 c3| use typical + then - // // d1 = b3*c4 - b4*c3 + b4*c2 - b2*c4 + b2*c3 - b3*c2 // d2 = b4*c3 - b3*c4 + b1*c4 - b4*c1 + b3*c1 - b1*c3 // d3 = b2*c4 - b4*c2 + b4*c1 - b1*c4 + b1*c2 - b2*c1 // d4 = b3*c2 - b2*c3 + b1*c3 - b3*c1 + b2*c1 _ b1*c2 // // By setting A to one of the four unit vectors, e.g. A = |1, 0, 0, 0| // then fewer terms need to be computed for D = B x C // d1 = 0 // d2 = b4*c3 - b3*c4 // d3 = b2*c4 - b4*c2 // d4 = b3*c2 - b2*c3 // // // Cross product E = A x B x C X D orthogonal to A, B, C, and D // 5 dimensions i, j, k, l, m unit vectors, E = |e1, e2, e3, e4, e5| // given A = |a1, a2, a3, a4, a5| and B and C and D orthogonal // // | i j k l m| e1 = det|not row 1, not col 1| // |a1 a2 a3 a4 a5| e2 = -det|not row 1, not col 2| // E = det|b1 b2 b3 b4 b5| e3 = det|not row 1, not col 3| // |c1 c2 c3 c4 c5| e4 = -det|not row 1, not col 4| // |d1 d2 d3 d4 d5| e5 = det|not row 1, not col 5| // // // |a2 a3 a4 a5| |a1 a3 a4 a5| |a1 a2 a4 a5| // e1 = det|b2 b3 b4 b5| e2 = -det|b1 b3 b4 b5| e3 = det|b1 b2 b4 b5| // |c2 c3 c4 c5| |c1 c3 c4 c5| |c1 c2 c4 c5| // |d2 d3 d4 d5| |d1 d3 d4 d5| |d1 d2 d4 d5| // // |a1 a2 a3 a5| |a1 a2 a3 a4| // e4 = det|b1 b2 b3 b5| e5 = -det|b1 b2 b3 b4| // |c1 c2 c3 c5| |c1 c2 c3 c4| // |d1 d2 d3 d5| |d1 d2 d3 d4| // // in general, for any #include #include #include #include "simeq_plus.h" static void cross3(double A[], double B[], double C[]) { C[0] = A[1]*B[2] - A[2]*B[1]; C[1] = A[2]*B[0] - A[0]*B[2]; C[2] = A[0]*B[1] - A[1]*B[0]; } // end cross3 static void cross3d(double M3[], double C[]) { double A2[4]; // (n-1)*(n-1) matrix n times int n=3; int i, j, k, ii, jj; for(k=0; k