|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Scale и Rotation одновременно
Потерял всю надежду сделать одновременно вращение и увеличение обьекта при помощи тригонометрии.
Уже второй день не могу даже понять в чем причина и возможно ли это сделать без дополнительных контейнеров и матриц. Все что я могу представить, это не округлённые координаты, но после округления ( уже везде расставил Math.round ) все тоже самое. Если кто то уже это прошёл, хоть на словах обьясните что для нужно для правильной работы. package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; public class Main extends Sprite { public function Main() { _frameRate = stage.frameRate; var circle:Sprite = new Sprite(); circle.graphics.lineStyle(1,0xffffff); circle.graphics.drawCircle(0, 0, 75); circle.graphics.endFill(); circle.x = circle.y = 250; addChild(circle); var _circle:Sprite = new Sprite(); _circle.graphics.lineStyle(1,0xffffff); _circle.graphics.drawCircle(0, 0, 125); _circle.graphics.endFill(); _circle.x = _circle.y = 250; addChild(_circle); _sprite = new Sprite(); _sprite.graphics.beginFill(0x8E6828); _sprite.graphics.drawRect(0, 0, 100, 100); _sprite.graphics.endFill(); _sprite.x = _sprite.y = 200; addChild(_sprite); addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private var _frameRate:Number; private var _allTime:Number = 0; private var _duration:Number = 3; private function enterFrameHandler(event:Event):void { var time:Number = 1 / 1000 * _frameRate; _allTime += time; var ratio:Number = _allTime / _duration; if (_allTime >= _duration) { ratio = 1; removeEventListener(Event.ENTER_FRAME, enterFrameHandler); } this.rotateAroundPoint(_sprite, new Point(250, 250), ratio * 360); this.scalePoint(_sprite, ratio * 1 + 1, ratio * 1 + 1, new Point(250, 250)); } private var _sprite:Sprite; private static const DEG_TO_RAD:Number = 3.1415926535897932 / 180; public function rotateAroundPoint(target:DisplayObject, point:Point, angle:Number):void { var a0:Number = -target.rotation * DEG_TO_RAD; var c0:Number = Math.cos(a0); var s0:Number = Math.sin(a0); var dX0:Number = target.x - point.x; var dY0:Number = target.y - point.y; target.rotation = 0; target.x = Math.round(point.x + dX0 * c0 - dY0 * s0); target.y = Math.round(point.y + dX0 * s0 + dY0 * c0); var c:Number = Math.cos(angle * DEG_TO_RAD); var s:Number = Math.sin(angle * DEG_TO_RAD); var dX:Number = target.x - point.x; var dY:Number = target.y - point.y; target.rotation = angle; target.x = Math.round(point.x + dX * c - dY * s); target.y = Math.round(point.y + dX * s + dY * c) } public function scalePoint(target:DisplayObject, scaleX:Number, scaleY:Number, point:Point):void { const dXS:Number = Math.round((target.x - point.x) / target.scaleX); const dYS:Number = Math.round((target.y - point.y) / target.scaleY); target.scaleX = scaleX; target.scaleY = scaleY; target.x = Math.round(point.x + dXS * target.scaleX) target.y = Math.round(point.y + dYS * target.scaleY) trace(_sprite.x,_sprite.y) } } } |
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
рисовать фигуры вокруг координаты (0,0)
и вращать просто через rotation |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
|
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
в drawPath - работает, в битмап - не пробовал
|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
in4core вот я уже сто раз думал, что я не капельки не умный и за семь месяцев не чего не сделал и уже пора "хоть как то" делать.. Но не могу, вот я задал вопрос и чуть позже понял в чем может быть проблема, при вращении точка регистрации тоже ведь крутится. Пойду проверять.
|
|
|||||
.
|
Оффтоп немного. Расскажи, пожалуйста, где ты научился писать if без пробела перед скобкой?
|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
После ещё одного дня попыток совместить scale и rotation с помощью тригонометрии, пришёл к выводу, что если это и возможно, то оно просто того не стоит. Максимум что получилось, это приблизить точность с разницей 0.5 пикселя, НО только на маленьких скоростях. И после нескольких проб крутить обьект на высокой скорости, по формулам которые я взял на форуме, тоже происходит жуткое смещение. Не знаю, из - за предельно высокой скорости это или нет, но я выставлял её только для того, чтобы, как я думал, посмотреть что произойдёт через некоторое время. По этому я хочу спросить, если делать тоже самое с помощью матриц, то это будет возможно? И с чего лучше начать, со scale или rotation? В общем, можно что то одно заменить матрицей, а что то оставить? Или нужно обязательно всё матрицами?
Добавлено через 25 минут И если кто то знает уроки или записи в блогах по матрицам, поделитесь. |
Часовой пояс GMT +4, время: 18:59. |
|
« Предыдущая тема | Следующая тема » |
|
|