using System; using SkiaSharp; namespace TheGameExtreme.view { public class TouchManipulationManager { public TouchManipulationMode Mode { set; get; } //float Magnitude(SKPoint point) //{ // return (float)Math.Sqrt(Math.Pow(point.X, 2) + Math.Pow(point.Y, 2)); //} public SKMatrix OneFingerManipulate(SKPoint prevPoint, SKPoint newPoint, SKPoint pivotPoint) { if (Mode == TouchManipulationMode.None) { return SKMatrix.MakeIdentity(); } SKMatrix touchMatrix = SKMatrix.MakeIdentity(); SKPoint delta = newPoint - prevPoint; //if (Mode == TouchManipulationMode.ScaleDualRotate) // One-finger rotation //{ // SKPoint oldVector = prevPoint - pivotPoint; // SKPoint newVector = newPoint - pivotPoint; // // Avoid rotation if fingers are too close to center // if (Magnitude(newVector) > 25 && Magnitude(oldVector) > 25) // { // float prevAngle = (float)Math.Atan2(oldVector.Y, oldVector.X); // float newAngle = (float)Math.Atan2(newVector.Y, newVector.X); // // Calculate rotation matrix // float angle = newAngle - prevAngle; // touchMatrix = SKMatrix.MakeRotation(angle, pivotPoint.X, pivotPoint.Y); // // Effectively rotate the old vector // float magnitudeRatio = Magnitude(oldVector) / Magnitude(newVector); // oldVector.X = magnitudeRatio * newVector.X; // oldVector.Y = magnitudeRatio * newVector.Y; // // Recalculate delta // delta = newVector - oldVector; // } //} // Multiply the rotation matrix by a translation matrix SKMatrix.PostConcat(ref touchMatrix, SKMatrix.MakeTranslation(delta.X, delta.Y)); return touchMatrix; } public SKMatrix TwoFingerManipulate(SKPoint prevPoint, SKPoint newPoint, SKPoint pivotPoint) { SKMatrix touchMatrix = SKMatrix.MakeIdentity(); //SKPoint oldVector = prevPoint - pivotPoint; //SKPoint newVector = newPoint - pivotPoint; //if (Mode == TouchManipulationMode.ScaleRotate || // Mode == TouchManipulationMode.ScaleDualRotate) //{ // // Find angles from pivot point to touch points // float oldAngle = (float)Math.Atan2(oldVector.Y, oldVector.X); // float newAngle = (float)Math.Atan2(newVector.Y, newVector.X); // // Calculate rotation matrix // float angle = newAngle - oldAngle; // touchMatrix = SKMatrix.MakeRotation(angle, pivotPoint.X, pivotPoint.Y); // // Effectively rotate the old vector // float magnitudeRatio = Magnitude(oldVector) / Magnitude(newVector); // oldVector.X = magnitudeRatio * newVector.X; // oldVector.Y = magnitudeRatio * newVector.Y; //} float scaleX = 1; float scaleY = 1; //if (Mode == TouchManipulationMode.AnisotropicScale) //{ // scaleX = newVector.X / oldVector.X; // scaleY = newVector.Y / oldVector.Y; //} //else if (Mode == TouchManipulationMode.IsotropicScale || // Mode == TouchManipulationMode.ScaleRotate || // Mode == TouchManipulationMode.ScaleDualRotate) //{ // scaleX = scaleY = Magnitude(newVector) / Magnitude(oldVector); //} if (!float.IsNaN(scaleX) && !float.IsInfinity(scaleX) && !float.IsNaN(scaleY) && !float.IsInfinity(scaleY)) { SKMatrix.PostConcat(ref touchMatrix, SKMatrix.MakeScale(scaleX, scaleY, pivotPoint.X, pivotPoint.Y)); } return touchMatrix; } } }