/// <summary>
        /// Initialize a <see cref = "Transformer" />.
        /// </summary>
        /// <param name="transformer"> The transformer. </param>
        public TransformerBorder(ITransformerLTRB transformer)
        {
            float left   = float.MaxValue;
            float top    = float.MaxValue;
            float right  = float.MinValue;
            float bottom = float.MinValue;

            void aaa(Vector2 vector)
            {
                if (left > vector.X)
                {
                    left = vector.X;
                }
                if (top > vector.Y)
                {
                    top = vector.Y;
                }
                if (right < vector.X)
                {
                    right = vector.X;
                }
                if (bottom < vector.Y)
                {
                    bottom = vector.Y;
                }
            }

            aaa(transformer.LeftTop);
            aaa(transformer.RightTop);
            aaa(transformer.RightBottom);
            aaa(transformer.LeftBottom);

            this.Left    = left;
            this.Top     = top;
            this.Right   = right;
            this.Bottom  = bottom;
            this.CenterX = (left + right) / 2;
            this.CenterY = (Top + bottom) / 2;
        }
Beispiel #2
0
        /// <summary>
        /// Find Homography.
        /// </summary>
        /// <param name="source"> The source Transformer. </param>
        /// <param name="destination"> The destination Transformer. </param>
        /// <returns> The homologous matrix. </returns>
        public static Matrix3x2 FindHomography(ITransformerLTRB source, ITransformerLTRB destination)
        {
            float x0 = source.LeftTop.X, x1 = source.RightTop.X, x2 = source.LeftBottom.X, x3 = source.RightBottom.X;
            float y0 = source.LeftTop.Y, y1 = source.RightTop.Y, y2 = source.LeftBottom.Y, y3 = source.RightBottom.Y;
            float u0 = destination.LeftTop.X, u1 = destination.RightTop.X, u2 = destination.LeftBottom.X, u3 = destination.RightBottom.X;
            float v0 = destination.LeftTop.Y, v1 = destination.RightTop.Y, v2 = destination.LeftBottom.Y, v3 = destination.RightBottom.Y;

            MathNet.Numerics.LinearAlgebra.Double.DenseMatrix matrix = MathNet.Numerics.LinearAlgebra.Double.DenseMatrix.OfArray(new double[008, 008]
            {
                { x0, y0, 1, 0, 0, 0, -u0 * x0, -u0 * y0 },
                { 0, 0, 0, x0, y0, 1, -v0 * x0, -v0 * y0 },
                { x1, y1, 1, 0, 0, 0, -u1 * x1, -u1 * y1 },
                { 0, 0, 0, x1, y1, 1, -v1 * x1, -v1 * y1 },
                { x3, y3, 1, 0, 0, 0, -u3 * x3, -u3 * y3 },
                { 0, 0, 0, x3, y3, 1, -v3 * x3, -v3 * y3 },
                { x2, y2, 1, 0, 0, 0, -u2 * x2, -u2 * y2 },
                { 0, 0, 0, x2, y2, 1, -v2 * x2, -v2 * y2 },
            });

            MathNet.Numerics.LinearAlgebra.Double.DenseVector vector = new MathNet.Numerics.LinearAlgebra.Double.DenseVector(new double[008]
            {
                u0, v0, u1, v1,
                u3, v3, u2, v2
            });

            MathNet.Numerics.LinearAlgebra.Matrix <double> PseudoInverse = Transformer.PseudoInverse2(matrix);

            MathNet.Numerics.LinearAlgebra.Vector <double> ret = Transformer.Multiply2(PseudoInverse, vector);

            return(new Matrix3x2
                   (
                       m11: (float)ret[0], m12: (float)ret[3],
                       m21: (float)ret[1], m22: (float)ret[4],
                       m31: (float)ret[2], m32: (float)ret[5]
                   ));
        }
 /// <summary>
 /// Create a new rectangle geometry.
 /// </summary>
 /// <param name="resourceCreator"> The resource-creator. </param>
 /// <param name="transformerLTRB"> The ITransformer-LTRB. </param>
 /// <param name="matrix"> The matrix. </param>
 /// <returns> The product geometry. </returns>
 public static CanvasGeometry CreateRectangle(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformerLTRB, Matrix3x2 matrix) => TransformerGeometry.CreateRectangle(resourceCreator, transformerLTRB.LeftTop, transformerLTRB.RightTop, transformerLTRB.RightBottom, transformerLTRB.LeftBottom, matrix);
Beispiel #4
0
        /// <summary>
        /// Create a new arrow geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource - creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="matrix"> The matrix. </param>
        /// <param name="isAbsolute"> Is absolute? </param>
        /// <param name="width"> The absolute width. </param>
        /// <param name="value"> The relative value. </param>
        /// <param name="leftTail"> The left - tail. </param>
        /// <param name="rightTail"> The right - tail. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateArrow(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, Matrix3x2 matrix, bool isAbsolute = false, float width = 10, float value = 0.5f, GeometryArrowTailType leftTail = GeometryArrowTailType.None, GeometryArrowTailType rightTail = GeometryArrowTailType.Arrow)
        {
            Vector2 center      = Vector2.Transform(transformer.Center, matrix);
            Vector2 centerLeft  = Vector2.Transform(transformer.CenterLeft, matrix);
            Vector2 centerRight = Vector2.Transform(transformer.CenterRight, matrix);

            // horizontal
            Vector2 horizontal       = transformer.Horizontal;
            float   horizontalLength = horizontal.Length();
            // vertical
            Vector2 vertical       = transformer.Vertical;
            float   verticalLength = vertical.Length();

            Vector2 widthVector = TransformerGeometry.GetArrowWidthVector(isAbsolute, width, value, vertical, verticalLength);

            Vector2 focusVector         = TransformerGeometry.GetArrowFocusVector(verticalLength, horizontalLength, horizontal);
            Vector2 leftFocusTransform  = Vector2.Transform(transformer.CenterLeft + focusVector, matrix);
            Vector2 rightFocusTransform = Vector2.Transform(transformer.CenterRight - focusVector, matrix);

            return(TransformerGeometry.CreateArrowCore
                   (
                       resourceCreator,
                       Vector2.Transform(widthVector + transformer.Center, matrix) - center,

                       // Left
                       centerLeft,
                       Vector2.Transform(transformer.LeftBottom, matrix),

                       Vector2.Transform(transformer.LeftTop, matrix),
                       (leftFocusTransform - centerLeft),
                       leftFocusTransform,

                       // Right
                       centerRight,
                       Vector2.Transform(transformer.RightBottom, matrix),

                       Vector2.Transform(transformer.RightTop, matrix),
                       (rightFocusTransform - centerRight),
                       rightFocusTransform,

                       leftTail, rightTail
                   ));
        }
Beispiel #5
0
        /// <summary>
        /// Create a new heart geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource - creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="spread"> The spread. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateHeart(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, Matrix3x2 matrix, float spread)
        {
            Matrix3x2 oneMatrix  = Transformer.FindHomography(Transformer.One, transformer);
            Matrix3x2 oneMatrix2 = oneMatrix * matrix;

            return(TransformerGeometry.CreateHeartCore(resourceCreator, spread, oneMatrix2));
        }
Beispiel #6
0
        /// <summary>
        /// Create a new capsule geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource - creator. </param>
        /// <param name="transformerLTRB"> The ITransformer - LTRB. </param>
        /// <param name="matrix"> The matrix. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateCapsule(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, Matrix3x2 matrix)
        {
            Vector2 leftTop     = Vector2.Transform(transformer.LeftTop, matrix);
            Vector2 rightTop    = Vector2.Transform(transformer.RightTop, matrix);
            Vector2 rightBottom = Vector2.Transform(transformer.RightBottom, matrix);
            Vector2 leftBottom  = Vector2.Transform(transformer.LeftBottom, matrix);

            Vector2 centerLeft   = Vector2.Transform(transformer.CenterLeft, matrix);
            Vector2 centerTop    = Vector2.Transform(transformer.CenterTop, matrix);
            Vector2 centerRight  = Vector2.Transform(transformer.CenterRight, matrix);
            Vector2 centerBottom = Vector2.Transform(transformer.CenterBottom, matrix);

            // Horizontal
            Vector2 horizontal       = (centerRight - centerLeft);
            float   horizontalLength = horizontal.Length();
            Vector2 horizontalUnit   = horizontal / horizontalLength;
            // Vertical
            Vector2 vertical       = (centerBottom - centerTop);
            float   verticalLength = vertical.Length();

            if (horizontalLength < verticalLength)
            {
                return(TransformerGeometry.CreateEllipse(resourceCreator, transformer, matrix));
            }

            return(TransformerGeometry.CreateCapsuleCore(resourceCreator,
                                                         verticalLength,
                                                         horizontalUnit,

                                                         centerTop,
                                                         centerLeft,
                                                         centerRight,
                                                         centerBottom,

                                                         leftTop,
                                                         rightTop,
                                                         rightBottom,
                                                         leftBottom));
        }
Beispiel #7
0
        /// <summary>
        /// Create a new dount geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="matrix"> The matrix. </param>
        /// <param name="holeRadius"> The hole-radius. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateDount(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, Matrix3x2 matrix, float holeRadius)
        {
            bool           zeroHoleRadius = holeRadius == 0;
            CanvasGeometry outter         = TransformerGeometry.CreateEllipse(resourceCreator, transformer, matrix);

            if (zeroHoleRadius)
            {
                return(outter);
            }
            else
            {
                Vector2 center = Vector2.Transform(transformer.Center, matrix);

                return(TransformerGeometry.CreateDountCore(outter, holeRadius, center));
            }
        }
        /// <summary>
        /// Create a new pentagon geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="points"> The points count. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreatePentagon(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, int points)
        {
            Matrix3x2 oneMatrix = Transformer.FindHomography(Transformer.One, transformer);

            return(TransformerGeometry.CreatePentagonCore(resourceCreator, points, oneMatrix));
        }
        /// <summary>
        /// Create a new round rect geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="matrix"> The matrix. </param>
        /// <param name="corner"> The corner. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateRoundRect(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, Matrix3x2 matrix, float corner)
        {
            return(TransformerGeometry.CreateRoundRectCore
                   (
                       resourceCreator,

                       Vector2.Transform(transformer.LeftTop, matrix),
                       Vector2.Transform(transformer.RightTop, matrix),
                       Vector2.Transform(transformer.RightBottom, matrix),
                       Vector2.Transform(transformer.LeftBottom, matrix),

                       Vector2.Transform(transformer.CenterLeft, matrix),
                       Vector2.Transform(transformer.CenterTop, matrix),
                       Vector2.Transform(transformer.CenterRight, matrix),
                       Vector2.Transform(transformer.CenterBottom, matrix),

                       corner
                   ));
        }
        /// <summary>
        /// Create a new diamond geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="mid"> The mid value. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateDiamond(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, Matrix3x2 matrix, float mid)
        {
            return(TransformerGeometry.CreateDiamondCore(resourceCreator,
                                                         Vector2.Transform(transformer.LeftTop, matrix),
                                                         Vector2.Transform(transformer.RightTop, matrix),
                                                         Vector2.Transform(transformer.RightBottom, matrix),
                                                         Vector2.Transform(transformer.LeftBottom, matrix),

                                                         Vector2.Transform(transformer.CenterLeft, matrix),
                                                         Vector2.Transform(transformer.CenterRight, matrix),

                                                         mid
                                                         ));
        }
        /// <summary>
        /// Create a new diamond geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="mid"> The mid value. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateDiamond(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, float mid)
        {
            return(TransformerGeometry.CreateDiamondCore(resourceCreator,
                                                         transformer.LeftTop,
                                                         transformer.RightTop,
                                                         transformer.RightBottom,
                                                         transformer.LeftBottom,

                                                         transformer.CenterLeft,
                                                         transformer.CenterRight,

                                                         mid
                                                         ));
        }
        /// <summary>
        /// Create a new round rect geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="corner"> The corner. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateRoundRect(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, float corner)
        {
            return(TransformerGeometry.CreateRoundRectCore
                   (
                       resourceCreator,

                       transformer.LeftTop,
                       transformer.RightTop,
                       transformer.RightBottom,
                       transformer.LeftBottom,

                       transformer.CenterLeft,
                       transformer.CenterTop,
                       transformer.CenterRight,
                       transformer.CenterBottom,

                       corner
                   ));
        }
 /// <summary>
 /// Create a new triangle geometry.
 /// </summary>
 /// <param name="resourceCreator"> The resource-creator. </param>
 /// <param name="transformerLTRB"> The ITransformer-LTRB. </param>
 /// <param name="matrix"> The matrix. </param>
 /// <returns> The product geometry. </returns>
 public static CanvasGeometry CreateTriangle(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformerLTRB, Matrix3x2 matrix, float center) => TransformerGeometry.CreateTriangleCore(resourceCreator, Vector2.Transform(transformerLTRB.LeftTop, matrix), Vector2.Transform(transformerLTRB.RightTop, matrix), Vector2.Transform(transformerLTRB.RightBottom, matrix), Vector2.Transform(transformerLTRB.LeftBottom, matrix), center);
 /// <summary>
 /// Create a new triangle geometry.
 /// </summary>
 /// <param name="resourceCreator"> The resource-creator. </param>
 /// <param name="transformerLTRB"> The ITransformer-LTRB. </param>
 /// <returns> The product geometry. </returns>
 public static CanvasGeometry CreateTriangle(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformerLTRB, float center) => TransformerGeometry.CreateTriangleCore(resourceCreator, transformerLTRB.LeftTop, transformerLTRB.RightTop, transformerLTRB.RightBottom, transformerLTRB.LeftBottom, center);
Beispiel #15
0
        /// <summary>
        /// Create a new pie geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="sweepAngle"> The sweep-angle. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreatePie(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, float sweepAngle)
        {
            bool zeroSweepAngle = sweepAngle == 0;

            if (zeroSweepAngle)
            {
                return(TransformerGeometry.CreateEllipse(resourceCreator, transformer));
            }
            else
            {
                Matrix3x2 oneMatrix = Transformer.FindHomography(Transformer.One, transformer);

                return(TransformerGeometry.CreatePieCore(resourceCreator, oneMatrix, sweepAngle));
            }
        }
 /// <summary>
 /// Create a new ellipse geometry.
 /// </summary>
 /// <param name="resourceCreator"> The resource-creator. </param>
 /// <param name="transformerLTRB"> The ITransformer-LTRB. </param>
 /// <returns> The product geometry. </returns>
 public static CanvasGeometry CreateEllipse(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformerLTRB) => TransformerGeometry.CreateEllipseCore(resourceCreator, transformerLTRB.CenterLeft, transformerLTRB.CenterTop, transformerLTRB.CenterRight, transformerLTRB.CenterBottom);
        /// <summary>
        /// Create a new cog geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="count"> The point count. </param>
        /// <param name="innerRadius"> The inner-radius. </param>
        /// <param name="tooth"> The tooth. </param>
        /// <param name="notch"> The notch. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateCog(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, Matrix3x2 matrix, int count, float innerRadius, float tooth, float notch)
        {
            Matrix3x2 oneMatrix  = Transformer.FindHomography(Transformer.One, transformer);
            Matrix3x2 oneMatrix2 = oneMatrix * matrix;

            return(TransformerGeometry.CreateCogCore(resourceCreator, count, innerRadius, tooth, notch, oneMatrix2));
        }
Beispiel #18
0
        /// <summary>
        /// Create a new capsule geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource - creator. </param>
        /// <param name="transformer"> The ITransformer - LTRB. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateCapsule(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer)
        {
            Vector2 centerLeft   = transformer.CenterLeft;
            Vector2 centerTop    = transformer.CenterTop;
            Vector2 centerRight  = transformer.CenterRight;
            Vector2 centerBottom = transformer.CenterBottom;

            // Horizontal
            Vector2 horizontal       = transformer.Horizontal;
            float   horizontalLength = horizontal.Length();
            Vector2 horizontalUnit   = horizontal / horizontalLength;
            // Vertical
            Vector2 vertical       = transformer.Vertical;
            float   verticalLength = vertical.Length();

            if (horizontalLength < verticalLength)
            {
                return(TransformerGeometry.CreateEllipse(resourceCreator, transformer));
            }

            return(TransformerGeometry.CreateCapsuleCore(resourceCreator,
                                                         verticalLength,
                                                         horizontalUnit,

                                                         centerTop,
                                                         centerLeft,
                                                         centerRight,
                                                         centerBottom,

                                                         transformer.LeftTop,
                                                         transformer.RightTop,
                                                         transformer.RightBottom,
                                                         transformer.LeftBottom
                                                         ));
        }
        /// <summary>
        /// Create a new star geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="points"> The point count. </param>
        /// <param name="innerRadius"> The inner-radius. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateStar(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, Matrix3x2 matrix, int points, float innerRadius)
        {
            Matrix3x2 oneMatrix  = Transformer.FindHomography(Transformer.One, transformer);
            Matrix3x2 oneMatrix2 = oneMatrix * matrix;

            return(TransformerGeometry.CreateStarCore(resourceCreator, points, innerRadius, oneMatrix2));
        }
Beispiel #20
0
        /// <summary>
        /// Create a new cookie geometry.
        /// </summary>
        /// <param name="resourceCreator"> The resource-creator. </param>
        /// <param name="transformer"> The source transformer. </param>
        /// <param name="innerRadius"> The inner-radius. </param>
        /// <param name="sweepAngle"> The sweep-angle. </param>
        /// <returns> The product geometry. </returns>
        public static CanvasGeometry CreateCookie(ICanvasResourceCreator resourceCreator, ITransformerLTRB transformer, Matrix3x2 matrix, float innerRadius, float sweepAngle)
        {
            bool zeroInnerRadius = innerRadius == 0;
            bool zeroSweepAngle  = sweepAngle == 0;

            if (zeroSweepAngle)
            {
                CanvasGeometry ellipse = TransformerGeometry.CreateEllipse(resourceCreator, transformer, matrix);

                if (zeroInnerRadius)
                {
                    return(ellipse);
                }
                else
                {
                    Vector2 center = Vector2.Transform(transformer.Center, matrix);

                    return(TransformerGeometry.CreateDountCore(ellipse, innerRadius, center));
                }
            }
            else
            {
                Matrix3x2 oneMatrix  = Transformer.FindHomography(Transformer.One, transformer);
                Matrix3x2 oneMatrix2 = oneMatrix * matrix;

                if (zeroInnerRadius)
                {
                    return(TransformerGeometry.CreatePieCore(resourceCreator, oneMatrix2, sweepAngle));
                }
                else
                {
                    return(TransformerGeometry.CreateCookieCore(resourceCreator, oneMatrix2, innerRadius, sweepAngle));
                }
            }
        }