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