コード例 #1
0
ファイル: IPNS.cs プロジェクト: reloZid/algeosharp
        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);
        }
コード例 #2
0
ファイル: IPNS.cs プロジェクト: reloZid/algeosharp
        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;
        }
コード例 #3
0
ファイル: IPNS.cs プロジェクト: reloZid/algeosharp
 public static MultiVector CreateLine(MultiVector t, MultiVector d)
 {
     return(d * Basis.E123 + (MultiVector.CrossProduct(d, t) ^ Basis.E8));
 }