public static void GetLineParams(MultiVector obj, out MultiVector t, out MultiVector d) { if (!obj.ContainsOnly(2)) { throw new InvalidEntityException(); } d = MultiVector.Vector( -obj[Basis.E23], obj[Basis.E13], -obj[Basis.E12]); double norm = d.Length; if (norm == 0.0) { throw new InvalidEntityException(); } d /= norm; // d cross t MultiVector dct = MultiVector.Vector( obj[Basis.E1 ^ Basis.E8], obj[Basis.E2 ^ Basis.E8], obj[Basis.E3 ^ Basis.E8]) / norm; t = MultiVector.CrossProduct(dct, d); }
public static void GetCircleParams(MultiVector obj, out MultiVector n, out MultiVector c, out double r) { if (!obj.ContainsOnly(2)) { throw new InvalidEntityException(); } // c cross n MultiVector ccd = MultiVector.Vector( -obj[Basis.E23], obj[Basis.E13], -obj[Basis.E12]); // c dot n double d = obj[Basis.EPLANE]; n = MultiVector.Vector( obj[Basis.E1 ^ Basis.E0], obj[Basis.E2 ^ Basis.E0], obj[Basis.E3 ^ Basis.E0]); c = MultiVector.CrossProduct(n, ccd) + n * d; c /= (double)MultiVector.ScalarProduct(n, n); double x; if (n.E1 != 0) { x = (obj[Basis.E1 ^ Basis.E8] + (double)d * c.E1) / n.E1; } else if (n.E2 != 0) { x = (obj[Basis.E2 ^ Basis.E8] + (double)d * c.E2) / n.E2; } else if (n.E3 != 0) { x = (obj[Basis.E3 ^ Basis.E8] + (double)d * c.E3) / n.E3; } else { throw new InvalidEntityException(); } r = Math.Sqrt((double)MultiVector.ScalarProduct(c, c) - 2 * x); n /= n.Length; }
public static MultiVector CreateLine(MultiVector t, MultiVector d) { return(d * Basis.E123 + (MultiVector.CrossProduct(d, t) ^ Basis.E8)); }