示例#1
0
        public void InvertTest()
        {
            var m1 = new Matrix44d();
            m1.Translate(100, 20, -899);
            m1.Scale(20, 0.5, 0.5);
            m1.Rotate(30, 0.0, 0.0, 1.0);
            m1.Translate(40, -50, 30);

            var m2 = new Matrix44d();
            m2.Translate(-40, 50, -30);
            m2.Rotate(-30, 0.0, 0.0, 1.0);
            m2.Scale(1.0 / 20, 1.0 / 0.5, 1.0 / 0.5);
            m2.Translate(-100, -20, 899);

            Assert.True(m1.HasInverse);
            Assert.True(m2.HasInverse);
            Assert.AreEqual(m2, m1.Invert());

            var m = Matrix44d.FromRowMajorArray(new double[]
            {
                0, 0, 0, 0,
                0, 0, 0, 0,
                0, 0, 0, 0,
                0, 0, 0, 0,
            });
            Assert.False(m.HasInverse);
            Assert.Catch<MatrixException>(() => m.Invert());
        }
示例#2
0
        /// <summary>
        /// 描画オブジェクトを追加します。
        /// </summary>
        public void AddRender(BlendType blend, RectangleF bounds,
                              Matrix44d transform, Color color, double zorder)
        {
            var transform2 = ToMatrix(bounds, transform);

            AddRender(blend, color, transform2, zorder);
        }
示例#3
0
        public void InvertTest()
        {
            var m1 = new Matrix44d();

            m1.Translate(100, 20, -899);
            m1.Scale(20, 0.5, 0.5);
            m1.Rotate(30, 0.0, 0.0, 1.0);
            m1.Translate(40, -50, 30);

            var m2 = new Matrix44d();

            m2.Translate(-40, 50, -30);
            m2.Rotate(-30, 0.0, 0.0, 1.0);
            m2.Scale(1.0 / 20, 1.0 / 0.5, 1.0 / 0.5);
            m2.Translate(-100, -20, 899);

            Assert.True(m1.HasInverse);
            Assert.True(m2.HasInverse);
            Assert.AreEqual(m2, m1.Invert());

            var m = Matrix44d.FromRowMajorArray(new double[]
            {
                0, 0, 0, 0,
                0, 0, 0, 0,
                0, 0, 0, 0,
                0, 0, 0, 0,
            });

            Assert.False(m.HasInverse);
            Assert.Catch <MatrixException>(() => m.Invert());
        }
示例#4
0
        private Tuple <Mesh, Matrix44d> CreateArrowData(int priority,
                                                        Pointd fromPoint, Pointd toPoint)
        {
            var diff      = toPoint - fromPoint;
            var length    = diff.Distance;
            var lengthMax = SquareSize.Width * 9.0;

            // 距離が近いものほど小さくなる
            var lengthRate = Math.Min(length, lengthMax) / lengthMax;

            // 優先順位の低い矢印ほど、小さくなる値
            var priorityRate = 1.0 / priority;

            // 先にメッシュを作成
            var mesh = MeshUtil.CreateArrow(
                MathEx.InterpLiner(0.4, 0.2, lengthRate),
                0.2, 0.05);

            var rad       = Math.Atan2(diff.Y, diff.X);
            var transform = new Matrix44d();

            transform.Translate(fromPoint.X, fromPoint.Y, 1.0);
            transform.Rotate(rad - Math.PI / 2, 0, 0, 1);
            transform.Scale(
                SquareSize.Width *
                MathEx.InterpLiner(1.2, 1.5, lengthRate) *
                priorityRate,
                length, 1.0);

            return(Tuple.Create(mesh, transform));
        }
示例#5
0
        public void SubtractTest()
        {
            var result1 = Matrix44d.FromRowMajorArray(new double[]
            {
                2, 0, 6, 0,
                0, 12, 0, 16,
                0, 20, 0, 24,
                0, 28, 0, 32,
            });
            var result2 = Matrix44d.FromRowMajorArray(new double[]
            {
                -2, 0, -6, 0,
                0, -12, 0, -16,
                0, -20, 0, -24,
                0, -28, 0, -32,
            });

            var m = m1.Clone(); m.Subtract(m2);

            Assert.AreEqual(result1, m);

            m = m2.Clone(); m.Subtract(m1);
            Assert.AreEqual(result2, m);

            Assert.AreEqual(result1, m1 - m2);
            Assert.AreEqual(result2, m2 - m1);
        }
示例#6
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public EffectObject()
        {
            Children       = new EffectCollection(this);
            Scenario       = new Scenario();
            LocalTransform = new Matrix44d();
            BaseScale      = new Point3d(1.0, 1.0, 1.0);
            Scale          = new Point3d(1.0, 1.0, 1.0);
            Opacity        = 1.0;
            //Transform = new Matrix44d();
            InheritedOpacity = 1.0;

            // 値をForeverにすると、子要素があってもなくてもオブジェクトが
            // 終了しなくなります。
            // また0にすると最初のフレームでオブジェクトが破棄されてしまうため、
            // 初期化の仕方によってはDurationの設定に失敗することがあります。
            // そのため、ここでは非常に小さいけれど0より大きい値を設定しています。
            Duration = TimeSpan.FromSeconds(0.001);

            this.AddPropertyChangedHandler("Parent", (_, __) =>
            {
                OnDataContextChanged(true);
                UpdateInheritedOpacity();
            });
            this.AddPropertyChangedHandler("BasePath", (_, __) =>
                                           OnBasePathChanged(BasePath));
            this.AddPropertyChangedHandler("DataContext", (_, __) =>
                                           OnDataContextChanged(false));
            this.AddPropertyChangedHandler("Opacity", (_, __) =>
                                           UpdateInheritedOpacity());

            lock (instanceList)
            {
                instanceList.Add(new WeakReference(this));
            }
        }
示例#7
0
        static void Main(string[] args)
        {
            ClientContext.PreloadNativeLibraries();
            Pose3 pose = new Pose3
            {
                rotation = new Quaternion {
                    x = 0f, y = 0f, z = 1f, w = 0f
                },
                translation = new Vec3 {
                    x = 2.0f, y = 3.0f, z = 4.0f
                },
            };

#if !NET20
            Matrix44d matrixRH = pose.ToMatrixd(MatrixConventionsFlags.RHInput);
            Matrix44d matrixLH = pose.ToMatrixd(MatrixConventionsFlags.LHInput);
            Matrix44f matrixRM = pose.ToMatrixf(MatrixConventionsFlags.RowMajor);
#else
            Matrix44d matrixRH = MatrixConventions.ToMatrixd(pose, MatrixConventionsFlags.RHInput);
            Matrix44d matrixLH = MatrixConventions.ToMatrixd(pose, MatrixConventionsFlags.LHInput);
            Matrix44f matrixRM = MatrixConventions.ToMatrixf(pose, MatrixConventionsFlags.RowMajor);
#endif
            Console.WriteLine("pose as double matrix using right-handed coordinates: {0}", matrixRH.ToString());
            Console.WriteLine("pose as double matrix using left-handed coordinates: {0}", matrixLH.ToString());
            Console.WriteLine("pose as float matrix as row-major: {0}", matrixRM);
        }
示例#8
0
        /// <summary>
        /// 描画オブジェクトを追加します。
        /// </summary>
        public void AddRender(BlendType blend, Color color,
                              RectangleF bounds, Matrix44d transform,
                              double zorder, double opacity = 1.0)
        {
            var alphaByte  = (byte)Math.Min(color.A * opacity, 255);
            var color2     = Color.FromArgb(alphaByte, color);
            var transform2 = ToMatrix(bounds, transform);

            AddRender(blend, color2, transform2, zorder);
        }
示例#9
0
        /// <summary>
        /// RectangleF型を同じ変換を行う行列に直します。
        /// </summary>
        /// <param name="transform">
        /// 事前に積算する基準となる行列です。
        /// </param>
        private static Matrix44d ToMatrix(RectangleF bounds, Matrix44d transform)
        {
            var m = (transform != null ? transform.Clone() : new Matrix44d());

            m.Translate(
                bounds.Left + bounds.Width / 2,
                bounds.Top + bounds.Height / 2,
                0.0);
            m.Scale(bounds.Width, bounds.Height, 1.0);
            return(m);
        }
示例#10
0
 /// <summary>
 /// 描画オブジェクトを追加します。
 /// </summary>
 public void AddRender(BlendType blend, Color color,
                       Matrix44d transform, double zorder)
 {
     AddRenderInternal(new RenderData
     {
         Mesh      = DefaultMesh,
         Blend     = blend,
         Color     = color,
         Transform = transform,
         ZOrder    = zorder,
     });
 }
示例#11
0
        public static void MatrixVectorCalcExample()
        {
            //Create some 4x4 matrix
            Matrix44d H = new Matrix44d(1, 2, 3, 4,
                                        5, 6, 7, 8,
                                        9, 10, 11, 12,
                                        0, 0, 0, 1);

            //H = [  [R3]  T3]
            //    [ 0 0 0  1 ]

            //get 3x3 sub matrix (rotation matrix in homogeneous 4x4)
            var R = H.R3;
            //get 3x1 sub matrix (translation vector in homogeneous 4x4)
            var t = H.T3;


            //
            Matrix44d K = new Matrix44d();


            //matrix operation
            //inversion
            var Hi = H.Inv();
            //transpose
            var Ht = H.Transpose();
            //calc norm
            var norm = H.Norm();

            //set identity
            H.SetIdentity();

            //Hr, Hc, X
            // Hr*X*Hc.Inv()
            //Linear algebra
            H = (3 * H + K / 3) * 3.25;

            //Create 3d vector
            var v1 = new Vector3d(1, 2, 3);

            //rotate vector using [R,t]
            var v2 = R * v1 + t;

            //or using directly H
            // v1 is 3x1 vector
            var v3 = H * MU.ToHomogeneous(v1);
            //convert back to 3x1
            var v4 = MU.FromHomogeneous(v3);

            //Vector arithmetic
            var v5 = (4 * v2 + 2 * v1) / 0.5;
        }
示例#12
0
        /// <summary>
        /// 描画オブジェクトを追加します。
        /// </summary>
        public void AddRender(Texture texture, BlendType blend,
                              RectangleF bounds, Matrix44d transform,
                              double zorder, double opacity = 1.0)
        {
            if (texture == null || texture.TextureName == 0)
            {
                return;
            }

            var alphaByte  = (byte)Math.Min(256 * opacity, 255);
            var color      = Color.FromArgb(alphaByte, Color.White);
            var transform2 = ToMatrix(bounds, transform);

            AddRender(texture, blend, color, transform2, zorder);
        }
示例#13
0
        /// <summary>
        /// 描画オブジェクトを追加します。
        /// </summary>
        public void AddRender(BlendType blend, Color color, Mesh mesh,
                              Matrix44d transform, double zorder)
        {
            if (mesh == null)
            {
                throw new ArgumentNullException("mesh");
            }

            AddRenderInternal(new RenderData
            {
                Blend     = blend,
                Color     = color,
                Mesh      = mesh,
                Transform = transform,
                ZOrder    = zorder,
            });
        }
示例#14
0
        private void AddRenderArrow(RenderBuffer renderBuffer,
                                    Pointd fromPoint, Pointd toPoint,
                                    double priorityRate, Color color)
        {
            var diff      = toPoint - fromPoint;
            var length    = diff.Distance;
            var lengthMax = SquareSize.Width * 5.0;

            // 距離が近いものほど小さくなる
            var lengthRate = Math.Min(length, lengthMax) / lengthMax;

            var rad       = Math.Atan2(diff.Y, diff.X);
            var transform = new Matrix44d();

            transform.Translate(fromPoint.X, fromPoint.Y, 1.0);
            transform.Rotate(rad - Math.PI / 2, 0, 0, 1);
            transform.Scale(
                SquareSize.Width *
                MathEx.InterpLiner(0.8, 0.8, lengthRate) *
                MathEx.InterpLiner(0.8, 0.2, priorityRate),
                length, 1.0);

            // 矢印の不透明度を更新
            var newColor = Color.FromArgb(ArrowAlpha(priorityRate), color);

            // 矢印の中身を描画
            renderBuffer.AddRender(
                BlendType.Diffuse, newColor,
                CreateArrowMesh(length, priorityRate, false),
                transform, ShogiZOrder.PreEffectZ - priorityRate);

            // 矢印のアウトラインを描画
            renderBuffer.AddRenderAction(
                () =>
            {
                GL.Color4(newColor.R, newColor.G, newColor.B, (byte)(newColor.A + 50));
                GL.LineWidth(0.5f);
                GL.LoadMatrix(transform.AsColumnMajorArray);

                var mesh2 = CreateArrowMesh(length, priorityRate, true);
                GL.Begin(PrimitiveType.LineLoop);
                mesh2.VertexArray.ForEach(_ => GL.Vertex3(_.X, _.Y, _.Z));
                GL.End();
            },
                ShogiZOrder.PreEffectZ - priorityRate);
        }
示例#15
0
        public void AddTest()
        {
            var result = Matrix44d.FromRowMajorArray(new double[]
            {
                0, 4, 0, 8,
                10, 0, 14, 0,
                18, 0, 22, 0,
                26, 0, 30, 0,
            });

            var m = m1.Clone(); m.Add(m2);

            Assert.AreEqual(result, m);

            m = m2.Clone(); m.Add(m1);
            Assert.AreEqual(result, m);

            Assert.AreEqual(result, m1 + m2);
            Assert.AreEqual(result, m2 + m1);
        }
示例#16
0
        private void UpdateTransform()
        {
            // 行列変換は以下の操作が逆順で行われます。

            // 親の変換行列を基準に変換を行います。
            // (ワールド座標系から親座標系への変換行列)
            var m = (Parent != null ? Parent.Transform : new Matrix44d());

            // 親座標系からローカル座標系への変換
            m.Multiply(LocalTransform);

            // ローカル座標系での各種変換
            m.Translate(Coord.X, Coord.Y, Coord.Z);
            m.Rotate(RotateZ, 0.0, 0.0, 1.0);
            m.Scale(Scale.X, Scale.Y, Scale.Z);

            m.Scale(BaseScale.X, BaseScale.Y, BaseScale.Z);
            m.Translate(CenterPoint.X, CenterPoint.Y, CenterPoint.Z);

            Transform = m;

            Util.SafeCall(() => OnTransformUpdated());
        }
示例#17
0
        public Form1()
        {
            InitializeComponent();
            logView1.ShowDateTime = true;
            Logger.Add(new LogViewLogger(logView1));
            Library.Initialize();
            Global.Init();

            Library.NumberFormat = "0.000";

            Matrix44d A = new Matrix44d(1.23456389, 2, 3, 4,
                                        5, 6, 7, 8,
                                        9, 10, 11, 12,
                                        13, 14, 15, 16);

            //call some function
            //int err_code = DoSomething(43);
            //if(err_code != 0) {
            //    Logger.Error($"Some error message with code [{err_code}]");
            //}

            Logger.Debug("A=\n" + A);
            Logger.Debug("A*3-A=\n" + (A * 3 - A));
            Logger.Debug("I=\n" + Matrix44d.Eye());

            Vector4d v = new Vector4d(1, 23, 4, 5);

            Logger.Debug("v=\n" + v);
            Logger.Debug("A*v=\n" + (A * v));
            Logger.Debug("A*A=\n" + (A * A));

            Matrix44d B = new Matrix44d(1.23456389, 2, 3, 4,
                                        5, 6, 7, 8,
                                        9, 10, 11, 12,
                                        13, 14, 15, 16.2342345);

            Logger.Debug("Bi=\n" + (B.Inv()));
            Logger.Debug("Bi*B=\n" + (B.Inv() * B));


            //Error level
            // Normal, Debug, Trace, Warn, Info, Fatal


            //REGISTRY

            //Set value
            //bval.Value = true;
            ////read value
            //var ok = bval;
            //Logger.Debug("bval=" + ok);

            //

            //(new FormObjectProperty(Global.Setting,"MySettingDialog")).ShowDialog();


#if false
            Database db = null;
            //SQLite database init
            db = new SqliteDatabase("D:/dbfile.db");

            //SQLite database init
            //db = new SqlExpressDatabase(
            //    "localhost\\SQLEXPRESS", //host name
            //    "DbName",                //db name
            //    ""                    //(optional) extra string ...
            //    );

            db.Connect();

            //read table
            var dt = db.ExecuteQuery("select * from MyTable");
            dataGridView1.DataSource = dt;

            //usage
            //Define a table with given name
            Table tbl  = new Table("MyTable");
            Table tbl1 = new Table("MyTable1");

            tbl1.AddColumns(new Column[] {
                new IntColumn("ID"),
                new BoolColumn("BVal"),
                new TextColumn("Path"),
            });
            //add to database
            db.AddTable(tbl1);

            //Define columns names
            const string COL_ID   = "ID";
            const string COL_DATE = "DATE";
            const string COL_X    = "X";
            const string COL_Y    = "Y";
            const string COL_Z    = "Z";
            const string COL_OK   = "OK";
            const string COL_PATH = "PATH";

            //add columns to table
            tbl.AddColumns(new Column[] {
                new IntColumn(COL_ID),
                new DatetimeColumn(COL_DATE),
                new FloatColumn(COL_X),
                new FloatColumn(COL_Y),
                new FloatColumn(COL_Z),
                new BoolColumn(COL_OK),
                new TextColumn(COL_PATH),
            });

            //add table to database;
            db.AddTable(tbl);

            //Create a new row
            dynamic row = tbl.NewRow();
            //row.ID = 0;
            //row.DATE= DateTime.Now;

            row[COL_ID]   = 0;
            row[COL_DATE] = DateTime.Now;
            row[COL_X]    = (float)0.324345;
            row[COL_Y]    = 0.456f;
            row[COL_Z]    = 0.789f;
            row[COL_OK]   = true;
            row[COL_PATH] = "somewhere i belong";
            //and insert to the database
            tbl.InsertRow(row);
            //
#endif
        }