Advertisement
Guest User

Code

a guest
Aug 11th, 2013
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.51 KB | None | 0 0
  1. /*
  2. More details about transforms here: http://msdn.microsoft.com/en-us/library/system.windows.media.transform.aspx
  3.  
  4. ROTATE TRANSFORM (θ)
  5. |+cosθ -sinθ 0|
  6. |+sinθ +cosθ 0|
  7.  
  8. SCALE TRANSFORM (scale_x, scale_y)
  9. |scale_x 0       0|
  10. |0       scale_y 0|
  11.  
  12. SKEW TRANSFORM (skew_x, skew_y)
  13. |1      skew_x 0|
  14. |skew_y 1      0|
  15. skew_x = tan(angle_x)
  16. skew_y = tan(angle_y)
  17.  
  18. TRANSLATE TRANSFORM (offset_x, offset_y)
  19. |1 0 offset_x|
  20. |0 1 offset_y|
  21.  
  22. SCALE*ROTATE*TRANSLATE: // I prefer to using this one because rotating is more common than skewing
  23. |+scale_x*cosθ -scale_y*sinθ offset_x|
  24. |+scale_x*sinθ +scale_y*cosθ offset_y|
  25.  
  26. SCALE*SKEW*TRANSLATE:   // this one can be used on any matrix
  27. |scale_x        scale_y*skew_x offset_x|
  28. |scale_x*skew_y scale_y        offset_y|
  29.  
  30. assume: scale_x != 0 && scale_y != 0
  31. so this code won't work if it's a singular matrix
  32. */
  33. const float epsilon = 1e-4;
  34. Console.WriteLine("<transforms>");
  35. float ratio_a = _11 / _22;
  36. float ratio_b = -(_21 / _12);       // if it is rotation, ratio_a=ratio_b=scale_x/scale_y
  37. if (float_equals(ratio_a, ratio_b)) // SCALE*ROTATE
  38. {
  39.     // 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
  40.     float scale_x = Math.Sqrt(_11 * _11 + _21 * _21);
  41.     float scale_y = Math.Sqrt(_12 * _12 + _22 * _22);
  42.     float theta = Math.Acos(_11 / scale_x); // =acos(scale_x*cosθ/scale_x)=acos(cosθ)=θ
  43.     if (Math.Abs(scale_x - 1) > epsilon || Math.Abs(scale_y - 1) > epsilon) Console.WriteLine("<scale factor='{0},{1}' />");
  44.     if (Math.Abs(theta) > epsilon) Console.WriteLine("<rotate angle='{0}' />", theta);
  45. }
  46. else                                // SCALE*SKEW
  47. {
  48.     float scale_x = _11;
  49.     float scale_y = _22;
  50.     float skew_x = _12 / scale_y;
  51.     float skew_y = _21 / scale_x;
  52.     if (Math.Abs(scale_x - 1) > epsilon || Math.Abs(scale_y - 1) > epsilon) Console.WriteLine("<scale factor='{0},{1}' />");
  53.     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));
  54. }
  55. if (Math.Abs(_13) > epsilon || Math.Abs(_23) > epsilon) Console.WriteLine("  <translate Offset='{0},{1}' />", _13, _23);    // *TRANSLATE
  56. Console.WriteLine("</transforms>");
  57.  
  58. bool float_equals(float a, float b)
  59. {
  60.     return float.IsNaN(a) || float.IsNaN(b) || float.IsPositiveInfinity(a) && float.IsPositiveInfinity(b) || float.IsNegativeInfinity(a) && float.IsNegativeInfinity(b) || Math.Abs(a - b) < epsilon;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement