|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
а откуда он поступает?
рукоятку крутите? |
|
|||||
Именно, и градус объекта относительно точки должен быть равен градусу курсора относительно той же точки
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
что-то мне подсказывает, что все идет к Math.atan2()
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
а саму рукоятку сделать-то удалось?
потому что если удалось, то снимать угол можно с нее а если не удалось, то решите сначала эту задачу - когда сможете показать рукоятку, угол получите автоматически |
|
|||||
Собственно такой код (демо) с некоторыми результатами (отдельное спасибо другим as-программистам). Все что осталось - корректный поворот вокруг точки на заданном радиусе и указать точку поворота самого object в его центре:
package { import flash.display.Sprite; import flash.display.DisplayObject; import flash.events.MouseEvent; import flash.geom.Point; public class Main extends Sprite { var pot:Sprite; var rect:Sprite; var rec:Sprite; var point:Point; var save1:Point=new Point(0,0); var save2:Point=new Point(0,0);; var angle:Number; public function Main() { rect=new Sprite(); rect.graphics.lineStyle(1); rect.graphics.drawRect(0,0,100,100); rec=new Sprite(); rec.graphics.beginFill(0x000000); rec.graphics.drawRect(-5,-5,10,10); addChild(rect); rect.addChild(rec); rect.x=300; rect.y=170; point=new Point(100,100); pot=new Sprite; pot.graphics.beginFill(0xFF0000); pot.graphics.drawRect(-5,-5,10,10); addChild(pot); pot.x=point.x; pot.y=point.y; pot.addEventListener(MouseEvent.MOUSE_DOWN, potDownListener); pot.addEventListener(MouseEvent.MOUSE_UP, potUpListener); rec.addEventListener(MouseEvent.MOUSE_DOWN, onRecDown); stage.addEventListener(MouseEvent.MOUSE_UP, onRecUp); } private function potDownListener(event:MouseEvent):void{ pot.startDrag(false); } private function potUpListener(event:MouseEvent):void{ point.x=pot.x; point.y=pot.y; pot.stopDrag(); } private function onRecDown(event:MouseEvent):void{ rect.startDrag(false); save1.x=mouseX; save1.y=mouseY; addEventListener(MouseEvent.MOUSE_MOVE, onRecMove); } private function onRecMove(event:MouseEvent):void{ save2.x = mouseX; save2.y = mouseY; var p01:Point = save1.clone().subtract(point);//01 - значит вектор от точки 0 к точке 1 var p02:Point = save2.clone().subtract(point); var modul01:Number = p01.length; var modul02:Number = p02.length; var a:Number = Math.atan2( (p01.x * p02.y - p02.x * p01.y) / (modul01 * modul02), (p01.x * p02.x + p01.y * p02.y) / (modul01 * modul02) ); angle=a * 180 / Math.PI; rect.rotation=angle; } private function onRecUp(event:MouseEvent):void{ rect.stopDrag(); removeEventListener(MouseEvent.MOUSE_MOVE, onRecMove); } } } Цитата:
Последний раз редактировалось FieryWall; 15.11.2010 в 22:09. |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
"/ (modul01 * modul02)" - не надо, если длины катетов вырастут в одинаковое число раз, то углы в тр-ке не изменятся.
И я таки считаю, что нефик студенту помогать, если что из математики и пригодится после армии, то это вот эта геометрия. И почему тупо от прошлого угла новый угол не отнимать? Вродь попроще. package { import flash.display.Sprite; import flash.display.DisplayObject; import flash.events.MouseEvent; import flash.geom.Point; public class Main extends Sprite { public var pot:Sprite; public var rect:Sprite; public var rec:Sprite; public var point:Point; public var saveRot1:Number = 0;//rotation public var saveRot2:Number = 0;//baseAngle public var saveRot3:Number = 0;//newAngle public function Main() { rect=new Sprite(); rect.graphics.lineStyle(1); rect.graphics.drawRect(0,0,100,100); rec=new Sprite(); rec.graphics.beginFill(0x000000); rec.graphics.drawRect(-5,-5,10,10); addChild(rect); rect.addChild(rec); rect.x=300; rect.y=170; point=new Point(100,100); pot=new Sprite; pot.graphics.beginFill(0xFF0000); pot.graphics.drawRect(-5,-5,10,10); addChild(pot); pot.x=point.x; pot.y=point.y; pot.addEventListener(MouseEvent.MOUSE_DOWN, potDownListener); pot.addEventListener(MouseEvent.MOUSE_UP, potUpListener); rec.addEventListener(MouseEvent.MOUSE_DOWN, onRecDown); stage.addEventListener(MouseEvent.MOUSE_UP, onRecUp); saveRot2 = Math.atan2(rect.y - pot.y, rect.x - pot.x); } private function potDownListener(event:MouseEvent):void { pot.startDrag(false); saveRot1 = saveRot1 + saveRot3; } private function potUpListener(event:MouseEvent):void{ saveRot2 = Math.atan2(rect.y - pot.y, rect.x - pot.x); pot.stopDrag(); } private function onRecDown(event:MouseEvent):void{ rect.startDrag(false); addEventListener(MouseEvent.MOUSE_MOVE, onRecMove); } private function onRecMove(event:MouseEvent):void{ saveRot3 = Math.atan2(mouseY - pot.y, mouseX - pot.x) - saveRot2; rect.rotation = (saveRot1 + saveRot3) * 180 / Math.PI; } private function onRecUp(event:MouseEvent):void{ rect.stopDrag(); removeEventListener(MouseEvent.MOUSE_MOVE, onRecMove); } } }
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Всем опять привет!!
Решил я єту задачу, вот такая значит там основная система: Объект является чилдом спрайта который в свою очередь является чилдом еще одного спрайта, точка поворота - центр основного спрайта, и вложенный спрайт с объектом вращается только относительно ее. Объект в дополнительном спрайте, на случай если с ним нужно что нибудь сделать, типа Трансформации. Может возникнуть проблема относительно переноса точки поворота, в этом случаи нужно на момент перетаскивания точки сохранить размещение вложенного спрайта в глобальном контейнере (относительно основной оси координат) с помощью localToGlobal, и возвращать его значение уже в главном контейнере с помощью globalToLocal соответственно. Простите что нету кода, с классами я еще работать не научился и весь код у меня в одном классе, а там очень много не по теме. Всем спасибо за помощ |
|
|||||
[+4 15.11.07]
|
Возможно оффтоп, но тема наиболее подходящая, не хочу создавать отдельную для одного вопроса.
Использую TransformTool для поворота объектов в редакторе на любой угол. Также мне нужно вращать отдельной кнопкой по 90 градусов (относительно центра). Пробую задавать напрямую объекту rotation но тогда сетка TransformTool "съезжает". selectedElement.transformX = selectedElement.width / 2; selectedElement.transformY = selectedElement.height / 2; selectedElement.rotation += 90; SelectElement(selectedElement); Как лучше сделать? Может вызывать TransformTool.toolMatrix.rotate()? |
Часовой пояс GMT +4, время: 08:28. |
|
« Предыдущая тема | Следующая тема » |
Теги |
AS3 , алгоритмы , маркер , поворот , трансформация |
|
|