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 AddTest() { var p1 = new Pointd(3, 4); var p2 = new Pointd(-1999, 34344); var p3 = new Pointd(-1996, 34348); Assert.AreEqual(p3, Pointd.Add(p1, p2)); Assert.AreEqual(p3, Pointd.Add(p2, p1)); Assert.AreEqual(p3, (p1 + p2)); Assert.AreEqual(p3, (p2 + p1)); }
public void SubtractTest() { var p1 = new Pointd(3, 4); var p2 = new Pointd(-1999, 34344); var p3 = new Pointd(2002, -34340); var p4 = new Pointd(-2002, 34340); Assert.AreEqual(p3, Pointd.Subtract(p1, p2)); Assert.AreNotEqual(Pointd.Subtract(p1, p2), Pointd.Subtract(p2, p1)); Assert.AreEqual(p3, p1 - p2); Assert.AreEqual(p4, p2 - p1); }
public void ParseTest() { Assert.AreEqual(new Pointd(0, 0), Pointd.Parse("0,0")); Assert.AreEqual(new Pointd(0, 0), Pointd.Parse(" 0 , 0 ")); Assert.AreEqual(new Pointd(-93.9, 590), Pointd.Parse("-93.9,590")); Assert.AreEqual(new Pointd(-1E-5, 555.87), Pointd.Parse("-1E-5,+555.87")); Assert.Catch <ArgumentNullException>(() => Pointd.Parse(null)); Assert.Catch <FormatException>(() => Pointd.Parse("")); Assert.Catch <FormatException>(() => Pointd.Parse("test")); Assert.Catch <FormatException>(() => Pointd.Parse("4,")); Assert.Catch <FormatException>(() => Pointd.Parse("-5,-9d")); }
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); }
/// <summary> /// クライアント座標を(640,380)のローカル座標系に変換します。 /// </summary> private Point ClientToLocal(Point p) { if (GLContainer == null) { throw new InvalidOperationException( "親コンテナに追加されていません。"); } var m = Transform.Invert(); var s = GLContainer.ClientSize; var np = new Pointd( p.X * 640.0 / s.Width, p.Y * 360.0 / s.Height); return(new Point( (int)(np.X * m[0, 0] + np.Y * m[0, 1]), (int)(np.X * m[1, 0] + np.Y * m[1, 1]))); }
/// <summary> /// クライアント座標を(640,380)のローカル座標系に変換します。 /// </summary> private Point ClientToLocal(Point p) { if (GLContainer == null) { throw new InvalidOperationException( "親コンテナに追加されていません。"); } var m = Transform.Invert(); var s = GLContainer.ClientSize; var np = new Pointd( p.X * 640.0 / s.Width, p.Y * 360.0 / s.Height); return new Point( (int)(np.X * m[0,0] + np.Y * m[0,1]), (int)(np.X * m[1,0] + np.Y * m[1,1])); }
/// <summary> /// クライアント座標を(640,360)のローカル座標系に変換します。 /// </summary> private Point ClientToLocal(Point p) { if (GLContainer == null) { throw new InvalidOperationException( "親コンテナに追加されていません。"); } var clientSize = GLContainer.ClientSize; var screenSize = GLContainer.ScreenSize; // クライアント画面上で対応する仮想画面の位置を算出 var np = new Pointd( (double)p.X * screenSize.Width / clientSize.Width, (double)p.Y * screenSize.Height / clientSize.Height); var m = Transform.Invert(); return(new Point( (int)(np.X * m[0, 0] + np.Y * m[0, 1]), (int)(np.X * m[1, 0] + np.Y * m[1, 1]))); }
/// <summary> /// 変換を行います。 /// </summary> public static Point ToPoint(this Pointd p) { return(new Point(Convert.ToInt32(p.X), Convert.ToInt32(p.Y))); }
/// <summary> /// 変換を行います。 /// </summary> public static PointF ToPointF(this Pointd p) { return(new PointF(Convert.ToSingle(p.X), Convert.ToSingle(p.Y))); }
public BlockF(Pointd position, int num) { this.position = position; this.num = num; }
/// <summary> /// <paramref name="p"/>の値に座標変換を行います。 /// </summary> public Pointd Transform(Pointd p) { return new Pointd( p.X * this[0, 0] + p.Y * this[0, 1] + this[0, 3], p.X * this[1, 0] + p.Y * this[1, 1] + this[1, 3]); }