コード例 #1
0
ファイル: IPNS.cs プロジェクト: reloZid/algeosharp
        public static MultiVector CreatePoint(MultiVector v)
        {
            if (IPNS.GetGeometricEntity(v) != GeometricEntity.Vector)
            {
                throw new InvalidEntityException();
            }

            return(v + 0.5 * MultiVector.ScalarProduct(v, v) * Basis.E8 + Basis.E0);
        }
コード例 #2
0
ファイル: IPNS.cs プロジェクト: reloZid/algeosharp
        public static void GetSphereParams(MultiVector obj, out MultiVector c, out double r)
        {
            if (!obj.ContainsOnly(1) || obj.E0 == 0.0)
            {
                throw new InvalidEntityException();
            }

            obj /= obj.E0;
            c    = MultiVector.Vector(obj.E1, obj.E2, obj.E3);
            r    = Math.Sqrt(Math.Abs(2 * obj.E8 - (double)MultiVector.ScalarProduct(c, c)));

            // HACK
            if (Math.Abs(r) < 1E-3)
            {
                r = 0.0;
            }
        }
コード例 #3
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;
        }
コード例 #4
0
ファイル: IPNS.cs プロジェクト: reloZid/algeosharp
        public static MultiVector CreateCircle(MultiVector n, MultiVector c, double r)
        {
            double d = (double)MultiVector.ScalarProduct(c, n);

            return(IPNS.CreatePlane(n, d) ^ IPNS.CreateSphere(c, r));
        }
コード例 #5
0
ファイル: IPNS.cs プロジェクト: reloZid/algeosharp
        public static MultiVector CreatePoint(double e1, double e2, double e3)
        {
            MultiVector v = MultiVector.Vector(e1, e2, e3);

            return(v + 0.5 * MultiVector.ScalarProduct(v, v) * Basis.E8 + Basis.E0);
        }