/// <summary> /// R3.Involute : res = a.Involute() /// Main involution /// </summary> public R3 Involute() { R3 res = new R3(); res[0] = this[0]; res[1] = -this[1]; res[2] = -this[2]; res[3] = -this[3]; res[4] = this[4]; res[5] = this[5]; res[6] = this[6]; res[7] = -this[7]; return(res); }
/// <summary> /// R3.subs : res = a - b /// multivector/scalar subtraction /// </summary> public static R3 operator -(R3 a, float b) { R3 res = new R3(); res[0] = a[0] - b; res[1] = a[1]; res[2] = a[2]; res[3] = a[3]; res[4] = a[4]; res[5] = a[5]; res[6] = a[6]; res[7] = a[7]; return(res); }
/// <summary> /// R3.Dual : res = !a /// Poincare duality operator. /// </summary> public static R3 operator !(R3 a) { R3 res = new R3(); res[0] = -a[7]; res[1] = -a[6]; res[2] = a[5]; res[3] = -a[4]; res[4] = a[3]; res[5] = -a[2]; res[6] = a[1]; res[7] = a[0]; return(res); }
/// <summary> /// R3.ssub : res = a - b /// scalar/multivector subtraction /// </summary> public static R3 operator -(float a, R3 b) { R3 res = new R3(); res[0] = a - b[0]; res[1] = -b[1]; res[2] = -b[2]; res[3] = -b[3]; res[4] = -b[4]; res[5] = -b[5]; res[6] = -b[6]; res[7] = -b[7]; return(res); }
/// <summary> /// R3.muls : res = a * b /// multivector/scalar multiplication /// </summary> public static R3 operator *(R3 a, float b) { R3 res = new R3(); res[0] = a[0] * b; res[1] = a[1] * b; res[2] = a[2] * b; res[3] = a[3] * b; res[4] = a[4] * b; res[5] = a[5] * b; res[6] = a[6] * b; res[7] = a[7] * b; return(res); }
/// <summary> /// R3.Sub : res = a - b /// Multivector subtraction /// </summary> public static R3 operator -(R3 a, R3 b) { R3 res = new R3(); res[0] = a[0] - b[0]; res[1] = a[1] - b[1]; res[2] = a[2] - b[2]; res[3] = a[3] - b[3]; res[4] = a[4] - b[4]; res[5] = a[5] - b[5]; res[6] = a[6] - b[6]; res[7] = a[7] - b[7]; return(res); }
/// <summary> /// R3.Dot : res = a | b /// The inner product. /// </summary> public static R3 operator |(R3 a, R3 b) { R3 res = new R3(); res[0] = b[0] * a[0] + b[1] * a[1] + b[2] * a[2] + b[3] * a[3] - b[4] * a[4] - b[5] * a[5] - b[6] * a[6] - b[7] * a[7]; res[1] = b[1] * a[0] + b[0] * a[1] - b[4] * a[2] - b[5] * a[3] + b[2] * a[4] + b[3] * a[5] - b[7] * a[6] - b[6] * a[7]; res[2] = b[2] * a[0] + b[4] * a[1] + b[0] * a[2] - b[6] * a[3] - b[1] * a[4] + b[7] * a[5] + b[3] * a[6] + b[5] * a[7]; res[3] = b[3] * a[0] + b[5] * a[1] + b[6] * a[2] + b[0] * a[3] - b[7] * a[4] - b[1] * a[5] - b[2] * a[6] - b[4] * a[7]; res[4] = b[4] * a[0] + b[7] * a[3] + b[0] * a[4] + b[3] * a[7]; res[5] = b[5] * a[0] - b[7] * a[2] + b[0] * a[5] - b[2] * a[7]; res[6] = b[6] * a[0] + b[7] * a[1] + b[0] * a[6] + b[1] * a[7]; res[7] = b[7] * a[0] + b[0] * a[7]; return(res); }
/// <summary> /// R3.Vee : res = a & b /// The regressive product. (JOIN) /// </summary> public static R3 operator &(R3 a, R3 b) { R3 res = new R3(); res[7] = 1 * (a[7] * b[7]); res[6] = 1 * (a[6] * b[7] + a[7] * b[6]); res[5] = -1 * (a[5] * -1 * b[7] + a[7] * b[5] * -1); res[4] = 1 * (a[4] * b[7] + a[7] * b[4]); res[3] = 1 * (a[3] * b[7] + a[5] * -1 * b[6] - a[6] * b[5] * -1 + a[7] * b[3]); res[2] = -1 * (a[2] * -1 * b[7] + a[4] * b[6] - a[6] * b[4] + a[7] * b[2] * -1); res[1] = 1 * (a[1] * b[7] + a[4] * b[5] * -1 - a[5] * -1 * b[4] + a[7] * b[1]); res[0] = 1 * (a[0] * b[7] + a[1] * b[6] - a[2] * -1 * b[5] * -1 + a[3] * b[4] + a[4] * b[3] - a[5] * -1 * b[2] * -1 + a[6] * b[1] + a[7] * b[0]); return(res); }