Ejemplo n.º 1
0
        private static Transformer ScaleCorner(Vector2 point, Transformer startingTransformer, Matrix3x2 inverseMatrix, bool isRatio, bool isCenter, Vector2 linePoint, Vector2 lineDiagonalPoint, Func <Vector2, Vector2, Vector2, Vector2, Transformer> func)
        {
            Vector2 canvasPoint = Vector2.Transform(point, inverseMatrix);

            if (isRatio)
            {
                Vector2 center    = isCenter ? startingTransformer.Center : lineDiagonalPoint;
                Vector2 footPoint = Math.FootPoint(canvasPoint, linePoint, center);

                LineDistance lineDistance = new LineDistance(footPoint, linePoint, center);
                Matrix3x2    scaleMatrix  = Matrix3x2.CreateScale(LineDistance.Scale(lineDistance), center);

                return(Transformer.Multiplies(startingTransformer, scaleMatrix));
            }
            else
            {
                Vector2 center     = isCenter ? startingTransformer.Center * 2 - canvasPoint : lineDiagonalPoint;
                Vector2 horizontal = startingTransformer.CenterRight - startingTransformer.CenterLeft;
                Vector2 vertical   = startingTransformer.CenterBottom - startingTransformer.CenterTop;

                Vector2 returnPoint           = canvasPoint;
                Vector2 returnDiagonalPoint   = center;
                Vector2 returnHorizontalPoint = Math.IntersectionPoint(canvasPoint, (canvasPoint - horizontal), (center + vertical), center);
                Vector2 returnVerticalPoint   = Math.IntersectionPoint(canvasPoint, (canvasPoint - vertical), (center + horizontal), center);

                return(func(returnPoint, returnDiagonalPoint, returnHorizontalPoint, returnVerticalPoint));
            }
        }
        /// <summary> Scale of [Foot Point] betwwen [Center Point] / scale of [Point] betwwen [Center Point] (may be negative)</summary>
        /// <param name="distance"> The distance </param>
        /// <returns>Scale</returns>
        public static float Scale(LineDistance distance)
        {
            float scale     = distance.FC / distance.PC;
            bool  isReverse = (distance.FP < distance.FD);

            return(isReverse ? scale : -scale);
        }
Ejemplo n.º 3
0
        private static Transformer ScaleAround(Vector2 point, Transformer startingTransformer, Matrix3x2 inverseMatrix, bool isRatio, bool isCenter, Vector2 linePoint, Vector2 lineDiagonalPoint, Func <Transformer, bool, Vector2, Transformer> func)
        {
            Vector2 canvasPoint = Vector2.Transform(point, inverseMatrix);
            Vector2 footPoint   = Math.FootPoint(canvasPoint, linePoint, lineDiagonalPoint);

            if (isRatio)
            {
                Vector2 center = isCenter ? startingTransformer.Center : lineDiagonalPoint;

                LineDistance distance    = new LineDistance(footPoint, linePoint, center);
                Matrix3x2    scaleMatrix = Matrix3x2.CreateScale(LineDistance.Scale(distance), center);

                return(Transformer.Multiplies(startingTransformer, scaleMatrix));
            }
            else
            {
                Vector2 vector = footPoint - linePoint;
                return(func(startingTransformer, isCenter, vector));
            }
        }