/// <summary>Returns grade involution of mv. /// </summary> public static mv gradeInvolution(mv_if a) { float[][] ac = a.to_mv().c(); float[][] cc = new float[6][]; if (ac[0] != null) { cc[0] = new float[1]; copyGroup_0(ac[0], cc[0]); } if (ac[1] != null) { cc[1] = new float[5]; neg_1(ac[1], cc[1]); } if (ac[2] != null) { cc[2] = new float[10]; copyGroup_2(ac[2], cc[2]); } if (ac[3] != null) { cc[3] = new float[10]; neg_3(ac[3], cc[3]); } if (ac[4] != null) { cc[4] = new float[5]; copyGroup_4(ac[4], cc[4]); } if (ac[5] != null) { cc[5] = new float[1]; neg_5(ac[5], cc[5]); } return new mv(cc); }
/// <summary>Returns Modified Hestenes inner product of mv and mv. /// </summary> public static mv mhip(mv_if a, mv_if b) { float[][] ac = a.to_mv().c(); float[][] bc = b.to_mv().c(); float[][] cc = new float[6][]; if (ac[0] != null) { if (bc[0] != null) { if (cc[0] == null) cc[0] = new float[1]; gp_default_0_0_0(ac[0], bc[0], cc[0]); } if (bc[1] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_0_1_1(ac[0], bc[1], cc[1]); } if (bc[2] != null) { if (cc[2] == null) cc[2] = new float[10]; gp_default_0_2_2(ac[0], bc[2], cc[2]); } if (bc[3] != null) { if (cc[3] == null) cc[3] = new float[10]; gp_default_0_3_3(ac[0], bc[3], cc[3]); } if (bc[4] != null) { if (cc[4] == null) cc[4] = new float[5]; gp_default_0_4_4(ac[0], bc[4], cc[4]); } if (bc[5] != null) { if (cc[5] == null) cc[5] = new float[1]; gp_default_0_5_5(ac[0], bc[5], cc[5]); } } if (ac[1] != null) { if (bc[0] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_1_0_1(ac[1], bc[0], cc[1]); } if (bc[1] != null) { if (cc[0] == null) cc[0] = new float[1]; gp_default_1_1_0(ac[1], bc[1], cc[0]); } if (bc[2] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_1_2_1(ac[1], bc[2], cc[1]); } if (bc[3] != null) { if (cc[2] == null) cc[2] = new float[10]; gp_default_1_3_2(ac[1], bc[3], cc[2]); } if (bc[4] != null) { if (cc[3] == null) cc[3] = new float[10]; gp_default_1_4_3(ac[1], bc[4], cc[3]); } if (bc[5] != null) { if (cc[4] == null) cc[4] = new float[5]; gp_default_1_5_4(ac[1], bc[5], cc[4]); } } if (ac[2] != null) { if (bc[0] != null) { if (cc[2] == null) cc[2] = new float[10]; gp_default_2_0_2(ac[2], bc[0], cc[2]); } if (bc[1] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_2_1_1(ac[2], bc[1], cc[1]); } if (bc[2] != null) { if (cc[0] == null) cc[0] = new float[1]; gp_default_2_2_0(ac[2], bc[2], cc[0]); } if (bc[3] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_2_3_1(ac[2], bc[3], cc[1]); } if (bc[4] != null) { if (cc[2] == null) cc[2] = new float[10]; gp_default_2_4_2(ac[2], bc[4], cc[2]); } if (bc[5] != null) { if (cc[3] == null) cc[3] = new float[10]; gp_default_2_5_3(ac[2], bc[5], cc[3]); } } if (ac[3] != null) { if (bc[0] != null) { if (cc[3] == null) cc[3] = new float[10]; gp_default_3_0_3(ac[3], bc[0], cc[3]); } if (bc[1] != null) { if (cc[2] == null) cc[2] = new float[10]; gp_default_3_1_2(ac[3], bc[1], cc[2]); } if (bc[2] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_3_2_1(ac[3], bc[2], cc[1]); } if (bc[3] != null) { if (cc[0] == null) cc[0] = new float[1]; gp_default_3_3_0(ac[3], bc[3], cc[0]); } if (bc[4] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_3_4_1(ac[3], bc[4], cc[1]); } if (bc[5] != null) { if (cc[2] == null) cc[2] = new float[10]; gp_default_3_5_2(ac[3], bc[5], cc[2]); } } if (ac[4] != null) { if (bc[0] != null) { if (cc[4] == null) cc[4] = new float[5]; gp_default_4_0_4(ac[4], bc[0], cc[4]); } if (bc[1] != null) { if (cc[3] == null) cc[3] = new float[10]; gp_default_4_1_3(ac[4], bc[1], cc[3]); } if (bc[2] != null) { if (cc[2] == null) cc[2] = new float[10]; gp_default_4_2_2(ac[4], bc[2], cc[2]); } if (bc[3] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_4_3_1(ac[4], bc[3], cc[1]); } if (bc[4] != null) { if (cc[0] == null) cc[0] = new float[1]; gp_default_4_4_0(ac[4], bc[4], cc[0]); } if (bc[5] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_4_5_1(ac[4], bc[5], cc[1]); } } if (ac[5] != null) { if (bc[0] != null) { if (cc[5] == null) cc[5] = new float[1]; gp_default_5_0_5(ac[5], bc[0], cc[5]); } if (bc[1] != null) { if (cc[4] == null) cc[4] = new float[5]; gp_default_5_1_4(ac[5], bc[1], cc[4]); } if (bc[2] != null) { if (cc[3] == null) cc[3] = new float[10]; gp_default_5_2_3(ac[5], bc[2], cc[3]); } if (bc[3] != null) { if (cc[2] == null) cc[2] = new float[10]; gp_default_5_3_2(ac[5], bc[3], cc[2]); } if (bc[4] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_5_4_1(ac[5], bc[4], cc[1]); } if (bc[5] != null) { if (cc[0] == null) cc[0] = new float[1]; gp_default_5_5_0(ac[5], bc[5], cc[0]); } } return new mv(cc); }
/// <summary>Returns grade groupBitmap of mv. /// </summary> public static mv extractGrade(mv_if a, GroupBitmap groupBitmap) { GroupBitmap gu = a.to_mv().gu() & groupBitmap; float[][] ac = a.to_mv().c(); float[][] cc = new float[6][]; if ((gu & GroupBitmap.GROUP_0) != 0) { cc[0] = new float[1]; copyGroup_0(ac[0], cc[0]); } if ((gu & GroupBitmap.GROUP_1) != 0) { cc[1] = new float[5]; copyGroup_1(ac[1], cc[1]); } if ((gu & GroupBitmap.GROUP_2) != 0) { cc[2] = new float[10]; copyGroup_2(ac[2], cc[2]); } if ((gu & GroupBitmap.GROUP_3) != 0) { cc[3] = new float[10]; copyGroup_3(ac[3], cc[3]); } if ((gu & GroupBitmap.GROUP_4) != 0) { cc[4] = new float[5]; copyGroup_4(ac[4], cc[4]); } if ((gu & GroupBitmap.GROUP_5) != 0) { cc[5] = new float[1]; copyGroup_5(ac[5], cc[5]); } return new mv(cc); }
/// <summary>Returns geometric product of mv and float. /// </summary> public static mv gp(mv_if a, float b) { float[][] ac = a.to_mv().c(); float[][] bc = new float[][]{new float[]{b}}; float[][] cc = new float[6][]; if (ac[0] != null) { if (cc[0] == null) cc[0] = new float[1]; gp_default_0_0_0(ac[0], bc[0], cc[0]); } if (ac[1] != null) { if (cc[1] == null) cc[1] = new float[5]; gp_default_1_0_1(ac[1], bc[0], cc[1]); } if (ac[2] != null) { if (cc[2] == null) cc[2] = new float[10]; gp_default_2_0_2(ac[2], bc[0], cc[2]); } if (ac[3] != null) { if (cc[3] == null) cc[3] = new float[10]; gp_default_3_0_3(ac[3], bc[0], cc[3]); } if (ac[4] != null) { if (cc[4] == null) cc[4] = new float[5]; gp_default_4_0_4(ac[4], bc[0], cc[4]); } if (ac[5] != null) { if (cc[5] == null) cc[5] = new float[1]; gp_default_5_0_5(ac[5], bc[0], cc[5]); } return new mv(cc); }
/// <summary>Returns dual of mv using default metric. /// </summary> public static mv dual(mv_if a) { float[][] ac = a.to_mv().c(); float[][] cc = new float[6][]; if (ac[0] != null) { if (cc[5] == null) cc[5] = new float[1]; dual_default_0_5(ac[0], cc[5]); } if (ac[1] != null) { if (cc[4] == null) cc[4] = new float[5]; dual_default_1_4(ac[1], cc[4]); } if (ac[2] != null) { if (cc[3] == null) cc[3] = new float[10]; dual_default_2_3(ac[2], cc[3]); } if (ac[3] != null) { if (cc[2] == null) cc[2] = new float[10]; dual_default_3_2(ac[3], cc[2]); } if (ac[4] != null) { if (cc[1] == null) cc[1] = new float[5]; dual_default_4_1(ac[4], cc[1]); } if (ac[5] != null) { if (cc[0] == null) cc[0] = new float[1]; dual_default_5_0(ac[5], cc[0]); } return new mv(cc); }
/// <summary>Returns whether input multivectors are equal up to an epsilon c. /// </summary> public static bool equals(mv_if a, mv_if b, float c) { float[][] ac = a.to_mv().c(); float[][] bc = b.to_mv().c(); if (ac[0] != null) { if (bc[0] != null) { if (!equals_0_0(ac[0], bc[0], c)) return false; } else if (!zeroGroup_0(ac[0], c)) return false; } else if (bc[0] != null) { if (!zeroGroup_0(bc[0], c)) return false; } if (ac[1] != null) { if (bc[1] != null) { if (!equals_1_1(ac[1], bc[1], c)) return false; } else if (!zeroGroup_1(ac[1], c)) return false; } else if (bc[1] != null) { if (!zeroGroup_1(bc[1], c)) return false; } if (ac[2] != null) { if (bc[2] != null) { if (!equals_2_2(ac[2], bc[2], c)) return false; } else if (!zeroGroup_2(ac[2], c)) return false; } else if (bc[2] != null) { if (!zeroGroup_2(bc[2], c)) return false; } if (ac[3] != null) { if (bc[3] != null) { if (!equals_3_3(ac[3], bc[3], c)) return false; } else if (!zeroGroup_3(ac[3], c)) return false; } else if (bc[3] != null) { if (!zeroGroup_3(bc[3], c)) return false; } if (ac[4] != null) { if (bc[4] != null) { if (!equals_4_4(ac[4], bc[4], c)) return false; } else if (!zeroGroup_4(ac[4], c)) return false; } else if (bc[4] != null) { if (!zeroGroup_4(bc[4], c)) return false; } if (ac[5] != null) { if (bc[5] != null) { if (!equals_5_5(ac[5], bc[5], c)) return false; } else if (!zeroGroup_5(ac[5], c)) return false; } else if (bc[5] != null) { if (!zeroGroup_5(bc[5], c)) return false; } return true; }
/// <summary>Returns mv + mv. /// </summary> public static mv add(mv_if a, mv_if b) { float[][] ac = a.to_mv().c(); float[][] bc = b.to_mv().c(); float[][] cc = new float[6][]; if (ac[0] != null) { cc[0] = new float[1]; if (bc[0] != null) { add2_0_0(ac[0], bc[0], cc[0]); } else copyGroup_0(ac[0], cc[0]); } else if (bc[0] != null) { cc[0] = new float[1]; copyGroup_0(bc[0], cc[0]); } if (ac[1] != null) { cc[1] = new float[5]; if (bc[1] != null) { add2_1_1(ac[1], bc[1], cc[1]); } else copyGroup_1(ac[1], cc[1]); } else if (bc[1] != null) { cc[1] = new float[5]; copyGroup_1(bc[1], cc[1]); } if (ac[2] != null) { cc[2] = new float[10]; if (bc[2] != null) { add2_2_2(ac[2], bc[2], cc[2]); } else copyGroup_2(ac[2], cc[2]); } else if (bc[2] != null) { cc[2] = new float[10]; copyGroup_2(bc[2], cc[2]); } if (ac[3] != null) { cc[3] = new float[10]; if (bc[3] != null) { add2_3_3(ac[3], bc[3], cc[3]); } else copyGroup_3(ac[3], cc[3]); } else if (bc[3] != null) { cc[3] = new float[10]; copyGroup_3(bc[3], cc[3]); } if (ac[4] != null) { cc[4] = new float[5]; if (bc[4] != null) { add2_4_4(ac[4], bc[4], cc[4]); } else copyGroup_4(ac[4], cc[4]); } else if (bc[4] != null) { cc[4] = new float[5]; copyGroup_4(bc[4], cc[4]); } if (ac[5] != null) { cc[5] = new float[1]; if (bc[5] != null) { add2_5_5(ac[5], bc[5], cc[5]); } else copyGroup_5(ac[5], cc[5]); } else if (bc[5] != null) { cc[5] = new float[1]; copyGroup_5(bc[5], cc[5]); } return new mv(cc); }
/// <summary>Returns a * b * inverse(a) using default metric. /// </summary> public static mv applyVersor(mv_if a, mv_if b) { return extractGrade(gp(gp(a, b), versorInverse(a)), b.to_mv().gu()); }
/// <summary>Returns versor inverse of a using default metric. /// </summary> public static mv versorInverse(mv_if a) { float n2 = norm2_returns_scalar(a.to_mv()); float[][] ac = a.to_mv().c(); float[][] cc = new float[6][]; if (ac[0] != null) { cc[0] = new float[1]; copyDiv_0(ac[0], cc[0], n2); } if (ac[1] != null) { cc[1] = new float[5]; copyDiv_1(ac[1], cc[1], n2); } if (ac[2] != null) { cc[2] = new float[10]; copyDiv_2(ac[2], cc[2], -n2); } if (ac[3] != null) { cc[3] = new float[10]; copyDiv_3(ac[3], cc[3], -n2); } if (ac[4] != null) { cc[4] = new float[5]; copyDiv_4(ac[4], cc[4], n2); } if (ac[5] != null) { cc[5] = new float[1]; copyDiv_5(ac[5], cc[5], n2); } return new mv(cc); }
/// <summary>Returns true if all coordinates of a are abs <= b /// </summary> public static bool zero(mv_if a, float b) { float[][] ac = a.to_mv().c(); if (ac[0] != null) { if (!zeroGroup_0(ac[0], b)) return false; } if (ac[1] != null) { if (!zeroGroup_1(ac[1], b)) return false; } if (ac[2] != null) { if (!zeroGroup_2(ac[2], b)) return false; } if (ac[3] != null) { if (!zeroGroup_3(ac[3], b)) return false; } if (ac[4] != null) { if (!zeroGroup_4(ac[4], b)) return false; } if (ac[5] != null) { if (!zeroGroup_5(ac[5], b)) return false; } return true; }
/// <summary> /// Converts a multivector to a string according to a float format like "F". /// </summary> /// <param name="fp">floating point format. Use 'null' for the default format (see setStringFormat()).</param> public static string String(mv_if value, string fp) { mv obj = value.to_mv(); System.Text.StringBuilder result = new System.Text.StringBuilder(); int ia = 0; // global index into coordinates (runs from 0 to 31) int cnt = 0; // how many coordinates printed so far // set up the floating point precision if (fp == null) fp = string_fp; // start the string result.Append(string_start); // print all coordinates for (int g = 0; g < 6; g++) { float[] Cg = obj.m_c[g]; if (Cg != null) { for (int b = 0; b < GroupSize[g]; b++) { double coord = (double)BasisElementSignByIndex[ia] * Cg[b]; // goal: print [+|-]obj.m_c[k][* basisVector1 ^ ... ^ basisVectorN] string tmpFloatStr = Math.Abs(coord).ToString(fp); if (Double.Parse(tmpFloatStr) != 0.0) { // print [+|-] result.Append((coord >= 0.0) ? ((cnt>0) ? string_plus : "") : string_minus); // print obj.m_c[k] result.Append(tmpFloatStr); if (g != 0) { // if not grade 0, print [* basisVector1 ^ ... ^ basisVectorN] result.Append(string_mul); // print all basis vectors int bei = 0; while (BasisElements[ia][bei] >= 0) { if (bei > 0) result.Append(string_wedge); result.Append(BasisVectorNames[BasisElements[ia][bei]]); bei++; } } cnt++; } ia++; } } else ia += GroupSize[g]; } // if no coordinates printed: 0 if (cnt == 0) result.Append("0"); // end the string result.Append(string_end); return result.ToString(); }
/// <summary>Returns scalar product of mv and mv. /// </summary> public static float sp(mv_if a, mv_if b) { float[][] ac = a.to_mv().c(); float[][] bc = b.to_mv().c(); float[][] cc = new float[6][]; cc[0] = new float[1]; if (ac[0] != null) { if (bc[0] != null) { gp_default_0_0_0(ac[0], bc[0], cc[0]); } } if (ac[1] != null) { if (bc[1] != null) { gp_default_1_1_0(ac[1], bc[1], cc[0]); } } if (ac[2] != null) { if (bc[2] != null) { gp_default_2_2_0(ac[2], bc[2], cc[0]); } } if (ac[3] != null) { if (bc[3] != null) { gp_default_3_3_0(ac[3], bc[3], cc[0]); } } if (ac[4] != null) { if (bc[4] != null) { gp_default_4_4_0(ac[4], bc[4], cc[0]); } } if (ac[5] != null) { if (bc[5] != null) { gp_default_5_5_0(ac[5], bc[5], cc[0]); } } return cc[0][0]; }
/// <summary>Returns float b * mv a + float c. /// </summary> public static mv sas(mv_if a, float b, float c) { float[][] ac = a.to_mv().c(); float[][] cc = new float[6][]; if (ac[0] != null) { cc[0] = new float[1]; copyMul_0(ac[0], cc[0], b); cc[0][0] += c; } else if (c != 0.0) { cc[0] = new float[1]; cc[0][0] = c; } if (ac[1] != null) { cc[1] = new float[5]; copyMul_1(ac[1], cc[1], b); } if (ac[2] != null) { cc[2] = new float[10]; copyMul_2(ac[2], cc[2], b); } if (ac[3] != null) { cc[3] = new float[10]; copyMul_3(ac[3], cc[3], b); } if (ac[4] != null) { cc[4] = new float[5]; copyMul_4(ac[4], cc[4], b); } if (ac[5] != null) { cc[5] = new float[1]; copyMul_5(ac[5], cc[5], b); } return new mv(cc); }
/// <summary>Returns norm2 of mv using default metric. /// </summary> public static float norm2(mv_if a) { float n2 = 0.0f; float[] c = new float[1]; float[][] ac = a.to_mv().c(); if (ac[0] != null) { /* group 0 (grade 0) */ c[0] = 0.0f; gp_default_0_0_0(ac[0], ac[0], c); n2 += c[0]; } if (ac[1] != null) { /* group 1 (grade 1) */ c[0] = 0.0f; gp_default_1_1_0(ac[1], ac[1], c); n2 += c[0]; } if (ac[2] != null) { /* group 2 (grade 2) */ c[0] = 0.0f; gp_default_2_2_0(ac[2], ac[2], c); n2 -= c[0]; } if (ac[3] != null) { /* group 3 (grade 3) */ c[0] = 0.0f; gp_default_3_3_0(ac[3], ac[3], c); n2 -= c[0]; } if (ac[4] != null) { /* group 4 (grade 4) */ c[0] = 0.0f; gp_default_4_4_0(ac[4], ac[4], c); n2 += c[0]; } if (ac[5] != null) { /* group 5 (grade 5) */ c[0] = 0.0f; gp_default_5_5_0(ac[5], ac[5], c); n2 += c[0]; } return n2; }
/// <summary>Returns negation of mv. /// </summary> public static mv negate(mv_if a) { float[][] ac = a.to_mv().c(); float[][] cc = new float[6][]; if (ac[0] != null) { cc[0] = new float[1]; neg_0(ac[0], cc[0]); } if (ac[1] != null) { cc[1] = new float[5]; neg_1(ac[1], cc[1]); } if (ac[2] != null) { cc[2] = new float[10]; neg_2(ac[2], cc[2]); } if (ac[3] != null) { cc[3] = new float[10]; neg_3(ac[3], cc[3]); } if (ac[4] != null) { cc[4] = new float[5]; neg_4(ac[4], cc[4]); } if (ac[5] != null) { cc[5] = new float[1]; neg_5(ac[5], cc[5]); } return new mv(cc); }