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