MerlinDS

Поворот BitmapData

написал Merlin Июль.31, 2009, в ActionScript3, Статьй

Недавно мне понадобилось создать вращающуюся BitmapData’у с помощью преобразования через матрицу. При поисках в интернете нашел лишь кривые классы с неправильными тригонометрическими формулами и пришлось написать класс вращения самому.

И вот что вышло:

А вот сам класс:

  1. package asml.utils
  2. {
  3. import flash.display.BitmapData;
  4. import flash.display.DisplayObject;
  5. import flash.display.IBitmapDrawable;
  6. import flash.geom.Matrix;
  7.  
  8. public final class UBitmapData
  9. {
  10. public static function rotation(source:IBitmapDrawable, angle:Number = 0, tWidth:int = 0, tHeight:int = 0):BitmapData{
  11. //IBitmapDrawable - для возможности загонять ресурс типа BitmapData или DisplayObject.
  12. var bitmapData:BitmapData;
  13. var width:int, height:int;
  14. var matrix:Matrix = new Matrix();
  15. var radians:Number;
  16. //Если при повороте меняется размер ресурса
  17. if(tWidth && tHeight){
  18. matrix.scale(tWidth/source['width'], tHeight/source['height']);
  19. width = tWidth;
  20. height = tHeight;
  21. }else{
  22. width = source['width'];
  23. height = source['height'];
  24. }
  25. //центровка и вращение ресурса
  26. if(angle){
  27. if(angle < 0)angle = (360 - angle) % 360;
  28. radians = UMath.radians(angle);
  29. matrix.translate(-width / 2, -height / 2);
  30. matrix.rotate(radians);
  31. matrix.translate(width / 2, height /2 );
  32.  
  33. //устанавливаю новый разхмер и позицию в зависимости от угла поворота
  34. var w:int, h:int;
  35. if(angle >= 0 && angle <= 90){
  36. /* 0 - 90*/
  37. w = Math.sin(radians)*height + Math.cos(radians)*width;
  38. h = Math.sin(radians)*width + Math.cos(radians)*height;
  39. matrix.tx += (w - width)/2;
  40. matrix.ty += (h - height)/2;
  41. }else if(angle > 90 && angle <= 180){
  42. /* 90 - 180*/
  43. w = Math.sin(radians)*height - Math.cos(radians)*width;
  44. h = Math.sin(radians)*width - Math.cos(radians)*height;
  45. matrix.tx += (w - width)/2;
  46. matrix.ty += (h - height)/2;
  47. }else if(angle > 180 && angle <= 270){
  48. /* 180 - 270*/
  49. w = -(Math.sin(radians)*height + Math.cos(radians)*width);
  50. h = -(Math.sin(radians)*width + Math.cos(radians)*height);
  51. matrix.tx += (w - width)/2;
  52. matrix.ty += (h - height)/2;
  53. }else if(angle > 270 && angle <= 360){
  54. /* 270 - 360*/
  55. w = -(Math.sin(radians)*height - Math.cos(radians)*width);
  56. h = -(Math.sin(radians)*width - Math.cos(radians)*height);
  57. matrix.tx += (w - width)/2;
  58. matrix.ty += (h - height)/2;
  59. }
  60.  
  61. bitmapData = new BitmapData(w, h, true, 0x000000);
  62. bitmapData.draw(source, matrix);
  63. return bitmapData;
  64. }
  65.  
  66. bitmapData = new BitmapData(width, height, true, 0);
  67. bitmapData.draw(source, matrix);
  68. return bitmapData;
  69. }
  70. }
  71. }
2 комментариев к этой статье:
  1. scenarist

    Здравствуйте, как на Вас подписаться? Я пользуюсь хромом, кнопка RSS не реагирует, ссылка “RSS ленту” выдает страницу полную неформатированного текста… :( Извините что вопрос не по теме… пользоваться привык гуглридером…

  2. Merlin

    Google Chrome сам по себе неумеет читать Rss, для этого нужно использовать внешние программы и внести страничку с GoogleReader в закладки.
    взято отсюда http://otvety.google.ru/otvety/thread?tid=4a0086a6fb3992a8

Написать комментарий

Ищите чего-то?

Используйте форму поиска по сайту:

До сих пор не нашли искомое? Напишите мне на почту merlinds@merlinds.com и я постараюсь дать Вам ответ по интересующей Вас теме!

Посетите моих друзей!

Ссылки на интересные ресурсы и на сайты(блоги) моих друзей...