Example #1
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));
        }
Example #2
0
        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));
        }
Example #3
0
        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));
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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"));
        }
Example #7
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);
        }
Example #8
0
        /// <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])));
        }
Example #9
0
        /// <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])));
        }
Example #11
0
 /// <summary>
 /// 変換を行います。
 /// </summary>
 public static Point ToPoint(this Pointd p)
 {
     return(new Point(Convert.ToInt32(p.X), Convert.ToInt32(p.Y)));
 }
Example #12
0
 /// <summary>
 /// 変換を行います。
 /// </summary>
 public static PointF ToPointF(this Pointd p)
 {
     return(new PointF(Convert.ToSingle(p.X), Convert.ToSingle(p.Y)));
 }
Example #13
0
 public BlockF(Pointd position, int num)
 {
     this.position = position;
     this.num      = num;
 }
Example #14
0
 /// <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]);
 }