Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- More details about transforms here: http://msdn.microsoft.com/en-us/library/system.windows.media.transform.aspx
- ROTATE TRANSFORM (θ)
- |+cosθ -sinθ 0|
- |+sinθ +cosθ 0|
- SCALE TRANSFORM (scale_x, scale_y)
- |scale_x 0 0|
- |0 scale_y 0|
- SKEW TRANSFORM (skew_x, skew_y)
- |1 skew_x 0|
- |skew_y 1 0|
- skew_x = tan(angle_x)
- skew_y = tan(angle_y)
- TRANSLATE TRANSFORM (offset_x, offset_y)
- |1 0 offset_x|
- |0 1 offset_y|
- SCALE*ROTATE*TRANSLATE: // I prefer to using this one because rotating is more common than skewing
- |+scale_x*cosθ -scale_y*sinθ offset_x|
- |+scale_x*sinθ +scale_y*cosθ offset_y|
- SCALE*SKEW*TRANSLATE: // this one can be used on any matrix
- |scale_x scale_y*skew_x offset_x|
- |scale_x*skew_y scale_y offset_y|
- assume: scale_x != 0 && scale_y != 0
- so this code won't work if it's a singular matrix
- */
- const float epsilon = 1e-4;
- Console.WriteLine("<transforms>");
- float ratio_a = _11 / _22;
- float ratio_b = -(_21 / _12); // if it is rotation, ratio_a=ratio_b=scale_x/scale_y
- if (float_equals(ratio_a, ratio_b)) // SCALE*ROTATE
- {
- // sqrt((scale_x*cosθ)^2+(scale_x*sinθ)^2)=sqrt(scale_x^2*cos^2 θ+scale_x^2*sin^2 θ)=scale_x*sqrt(cos^2 θ+sin^2 θ)=scale_x*sqrt(1)=scale_x
- float scale_x = Math.Sqrt(_11 * _11 + _21 * _21);
- float scale_y = Math.Sqrt(_12 * _12 + _22 * _22);
- float theta = Math.Acos(_11 / scale_x); // =acos(scale_x*cosθ/scale_x)=acos(cosθ)=θ
- if (Math.Abs(scale_x - 1) > epsilon || Math.Abs(scale_y - 1) > epsilon) Console.WriteLine("<scale factor='{0},{1}' />");
- if (Math.Abs(theta) > epsilon) Console.WriteLine("<rotate angle='{0}' />", theta);
- }
- else // SCALE*SKEW
- {
- float scale_x = _11;
- float scale_y = _22;
- float skew_x = _12 / scale_y;
- float skew_y = _21 / scale_x;
- if (Math.Abs(scale_x - 1) > epsilon || Math.Abs(scale_y - 1) > epsilon) Console.WriteLine("<scale factor='{0},{1}' />");
- if (Math.Abs(skew_x) > epsilon || Math.Abs(skew_y) > epsilon) Console.WriteLine("<skew angle='{0},{1}' />", Math.Atan(skew_x), Math.Atan(skew_y));
- }
- if (Math.Abs(_13) > epsilon || Math.Abs(_23) > epsilon) Console.WriteLine(" <translate Offset='{0},{1}' />", _13, _23); // *TRANSLATE
- Console.WriteLine("</transforms>");
- bool float_equals(float a, float b)
- {
- return float.IsNaN(a) || float.IsNaN(b) || float.IsPositiveInfinity(a) && float.IsPositiveInfinity(b) || float.IsNegativeInfinity(a) && float.IsNegativeInfinity(b) || Math.Abs(a - b) < epsilon;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement