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()); }
/// <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); }
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()); }
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)); }
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); }
/// <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)); } }
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); }
/// <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); }
/// <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); }
/// <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, }); }
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; }
/// <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); }
/// <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, }); }
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); }
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); }
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()); }
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 }