Esempio n. 1
0
 [MethodImpl(MethodImplOptions.AggressiveInlining)] // does not fully inline without
 static V3d TransformM33dPrecomputed_Inline(M33d m, V3d v)
 {
     return(new V3d(
                m.M00 * v.X + m.M01 * v.Y + m.M02 * v.Z,
                m.M10 * v.X + m.M11 * v.Y + m.M12 * v.Z,
                m.M20 * v.X + m.M21 * v.Y + m.M22 * v.Z
                ));
 }
Esempio n. 2
0
        /// <summary>
        /// Build a texture coordinate transformation from the given parameters as specified in TextureTransform
        /// http://gun.teipir.gr/VRML-amgem/spec/part1/nodesRef.html#TextureTransform
        /// </summary>
        public static Trafo2d BuildVrmlTextureTrafo(V2d center, double rotation, V2d scale, V2d translation)
        {
            M33d C = M33d.Translation(center), Ci = M33d.Translation(-center);
            M33d R = M33d.Rotation(rotation), Ri = M33d.Rotation(-rotation);
            M33d S = M33d.Scale(scale), Si = M33d.Scale(1 / scale);
            M33d T = M33d.Translation(translation), Ti = M33d.Translation(-translation);

            return(new Trafo2d(
                       Ci * S * R * C * T,
                       Ti * Ci * Ri * Si * C));
        }
Esempio n. 3
0
        private M33d Benchmark(Func <M44d, int, int, M33d> method)
        {
            M33d sum = M33d.Zero;

            for (int i = 0; i < count; i++)
            {
                sum += method(A[i], rows[i], columns[i]);
            }

            return(sum);
        }
Esempio n. 4
0
        public static void ConsistentWithMatrixScaleTest()
        {
            TrafoTesting.GenericTest(rnd =>
            {
                var scale = rnd.UniformV3d() * 10;
                var m     = M33d.Scale(scale);
                var r     = new Scale3d(scale);

                var p    = rnd.UniformV3d() * rnd.UniformInt(1000);
                var res  = m.Transform(p);
                var res2 = r.Transform(p);

                TrafoTesting.AreEqual(res, res2);
            });
        }
Esempio n. 5
0
            public static M33d Version3(M44d m, int row, int column)
            {
                M33d rs = new M33d();

                for (int k = 0; k < 9; k++)
                {
                    var i  = k / 3;
                    var j  = k % 3;
                    var ii = (i < row) ? i : i + 1;
                    var jj = (j < column) ? j : j + 1;

                    rs[k] = m[ii * 4 + jj];
                }

                return(rs);
            }
Esempio n. 6
0
        public static void NormalFrame()
        {
            TrafoTesting.GenericTest((rnd, i) =>
            {
                var n = rnd.UniformV3d().Normalized;

                var basis = M33d.NormalFrame(n);

                Assert.IsTrue(basis.C0.Length.ApproximateEquals(1, 1e-7));
                Assert.IsTrue(basis.C1.Length.ApproximateEquals(1, 1e-7));
                Assert.IsTrue(basis.C2.Length.ApproximateEquals(1, 1e-7));

                Assert.IsTrue(basis.C0.AngleBetween(basis.C1).ApproximateEquals(Constant.PiHalf, 1e-7));
                Assert.IsTrue(basis.C0.AngleBetween(basis.C2).ApproximateEquals(Constant.PiHalf, 1e-7));
                Assert.IsTrue(basis.C1.AngleBetween(basis.C2).ApproximateEquals(Constant.PiHalf, 1e-7));
            });
        }
Esempio n. 7
0
            public static M33d Version2(M44d m, int row, int column)
            {
                M33d rs  = new M33d();
                var  idx = 0;

                for (int k = 0; k < 16; k++)
                {
                    var i = k / 4;
                    var j = k % 4;

                    if (i != row && j != column)
                    {
                        rs[idx++] = m[k];
                    }
                }

                return(rs);
            }
Esempio n. 8
0
        /// <summary>
        /// Extracts texture transform from given node.
        /// </summary>
        public static Trafo2d ExtractVrmlTextureTrafo(this SymMapBase m)
        {
            if (m == null)
            {
                return(Trafo2d.Identity);
            }

            // get trafo parts
            var c = (V2d)m.Get <V2f>(Vrml97Sym.center, V2f.Zero);
            var r = (double)m.Get <float>(Vrml97Sym.rotation, 0.0f);
            var s = (V2d)m.Get <V2f>(Vrml97Sym.scale, new V2f(1, 1));
            var t = (V2d)m.Get <V2f>(Vrml97Sym.translation, V2f.Zero);

            M33d C = M33d.Translation(c), Ci = M33d.Translation(-c);
            M33d R = M33d.Rotation(r), Ri = M33d.Rotation(-r);
            M33d S = M33d.Scale(s), Si = M33d.Scale(1 / s);
            M33d T = M33d.Translation(t), Ti = M33d.Translation(-t);

            return(new Trafo2d(
                       Ci * S * R * C * T,
                       Ti * Ci * Ri * Si * C));
        }
Esempio n. 9
0
            public static M33d Version1(M44d m, int rowToDelete, int columnToDelete)
            {
                M33d result      = new M33d();
                int  checked_row = 0;

                for (int actual_row = 0; actual_row < 4; actual_row++)
                {
                    int checked_column = 0;

                    if (actual_row != rowToDelete)
                    {
                        for (int actual_column = 0; actual_column < 4; actual_column++)
                        {
                            if (actual_column != columnToDelete)
                            {
                                result[checked_row, checked_column] = m[actual_row, actual_column];
                                checked_column++;
                            }
                        }
                        checked_row++;
                    }
                }
                return(result);
            }
Esempio n. 10
0
 static V3d TransformM33dPrecomputed(M33d mat, V3d v)
 {
     return(mat.Transform(v));
 }
Esempio n. 11
0
 public void Write(M33d x)
 {
     Write(x.M00); Write(x.M01); Write(x.M02);
     Write(x.M10); Write(x.M11); Write(x.M12);
     Write(x.M20); Write(x.M21); Write(x.M22);
 }
Esempio n. 12
0
 public M34d(M33d r, V3d t)
 {
     M00 = r.M00; M01 = r.M01; M02 = r.M02; M03 = t.X;
     M10 = r.M10; M11 = r.M11; M12 = r.M12; M13 = t.Y;
     M20 = r.M20; M21 = r.M21; M22 = r.M22; M23 = t.Z;
 }