/// <summary> /// Calculates composition of two transformations, i.e. new transformation C(x) = A(B(x)) /// </summary> /// <param name="trA"></param> /// <param name="trB"></param> /// <returns></returns> public static IsometricTransform Compose(IsometricTransform trA, IsometricTransform trB) { var newAngle = Angles.NormalizeRad(trA.AngleRadians + trB.AngleRadians); var newPreShift = new Point(trB.preShiftX, trB.preShiftY); var newPostShift = trA.Transform(new Point(trB.postShiftX, trB.postShiftY)); return(new IsometricTransform(newAngle, newPostShift, newPreShift)); }
public static IsometricTransform DetectTransform(Func <Point, Point> transform) { var pntZeroImage = transform(new Point(0, 0)); var pntTestImage = transform(new Point(1000, 1000)); var cosPlusSin = (pntTestImage.x - pntZeroImage.x) / 1000; var cosMinusSin = (pntTestImage.y - pntZeroImage.y) / 1000; var cosAngle = (cosPlusSin + cosMinusSin) / 2; var sinAngle = (cosPlusSin - cosMinusSin) / 2; var angle = Angles.DecodeAngle(cosAngle, sinAngle); return(new IsometricTransform(angle, pntZeroImage)); }
public override string ToString() { return(string.Format("Pre: ({0:N2}, {1:N2}), Angle: {2:N2}, Post: ({3:N2}, {4:N2})", preShiftX, preShiftY, Angles.RadToDeg(angleRadians), postShiftX, postShiftY)); }