Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.11.2010, 21:18
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 21  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
а откуда он поступает?
рукоятку крутите?

Старый 15.11.2010, 21:40
FieryWall вне форума Посмотреть профиль Отправить личное сообщение для FieryWall Найти все сообщения от FieryWall
  № 22  
Ответить с цитированием
FieryWall
 
Аватар для FieryWall

Регистрация: Nov 2010
Сообщений: 190
Отправить сообщение для FieryWall с помощью ICQ Отправить сообщение для FieryWall с помощью Skype™
Именно, и градус объекта относительно точки должен быть равен градусу курсора относительно той же точки

Старый 15.11.2010, 21:46
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 23  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
что-то мне подсказывает, что все идет к Math.atan2()

Старый 15.11.2010, 21:46
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 24  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
а саму рукоятку сделать-то удалось?
потому что если удалось, то снимать угол можно с нее
а если не удалось, то решите сначала эту задачу - когда сможете показать рукоятку, угол получите автоматически

Старый 15.11.2010, 21:54
FieryWall вне форума Посмотреть профиль Отправить личное сообщение для FieryWall Найти все сообщения от FieryWall
  № 25  
Ответить с цитированием
FieryWall
 
Аватар для FieryWall

Регистрация: Nov 2010
Сообщений: 190
Отправить сообщение для FieryWall с помощью ICQ Отправить сообщение для FieryWall с помощью Skype™
Собственно такой код (демо) с некоторыми результатами (отдельное спасибо другим as-программистам). Все что осталось - корректный поворот вокруг точки на заданном радиусе и указать точку поворота самого object в его центре:
Код AS3:
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);
		}
	}
}
Добавлено через 13 минут
Цитата:
Сообщение от OFFmind Посмотреть сообщение
Может оффтопик:

Почему бы не использовать класс TransformTool от senocular. Это если важен только результат, а не сам принцип... просто сам недавно сталкивался с подобной проблемой, используя этот можно в Runtime изменять объект как в стандартом Flash редакторе.

А для поворота при нажатии кнопки идеально подходит TweenLite.

Еще раз извините, если это офф-топ, и тут главное - реализовать своими руками)))
И как эти классы включить в RunTime ?


Последний раз редактировалось FieryWall; 15.11.2010 в 22:09.
Старый 15.11.2010, 22:56
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 26  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
"/ (modul01 * modul02)" - не надо, если длины катетов вырастут в одинаковое число раз, то углы в тр-ке не изменятся.
И я таки считаю, что нефик студенту помогать, если что из математики и пригодится после армии, то это вот эта геометрия.
И почему тупо от прошлого угла новый угол не отнимать? Вродь попроще.
Код AS3:
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);
		}
	}
}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 19.11.2010, 00:59
FieryWall вне форума Посмотреть профиль Отправить личное сообщение для FieryWall Найти все сообщения от FieryWall
  № 27  
Ответить с цитированием
FieryWall
 
Аватар для FieryWall

Регистрация: Nov 2010
Сообщений: 190
Отправить сообщение для FieryWall с помощью ICQ Отправить сообщение для FieryWall с помощью Skype™
Всем опять привет!!
Решил я єту задачу, вот такая значит там основная система:
Объект является чилдом спрайта который в свою очередь является чилдом еще одного спрайта, точка поворота - центр основного спрайта, и вложенный спрайт с объектом вращается только относительно ее. Объект в дополнительном спрайте, на случай если с ним нужно что нибудь сделать, типа Трансформации.
Может возникнуть проблема относительно переноса точки поворота, в этом случаи нужно на момент перетаскивания точки сохранить размещение вложенного спрайта в глобальном контейнере (относительно основной оси координат) с помощью localToGlobal, и возвращать его значение уже в главном контейнере с помощью globalToLocal соответственно.
Простите что нету кода, с классами я еще работать не научился и весь код у меня в одном классе, а там очень много не по теме.
Всем спасибо за помощ

Старый 19.11.2010, 21:47
makanmel вне форума Посмотреть профиль Отправить личное сообщение для makanmel Найти все сообщения от makanmel
  № 28  
Ответить с цитированием
makanmel
[+4 15.11.07]
 
Аватар для makanmel

Регистрация: Dec 2006
Адрес: Lviv
Сообщений: 34
Отправить сообщение для makanmel с помощью ICQ Отправить сообщение для makanmel с помощью Skype™
Возможно оффтоп, но тема наиболее подходящая, не хочу создавать отдельную для одного вопроса.

Использую TransformTool для поворота объектов в редакторе на любой угол.
Также мне нужно вращать отдельной кнопкой по 90 градусов (относительно центра). Пробую задавать напрямую объекту rotation но тогда сетка TransformTool "съезжает".

Код AS3:
selectedElement.transformX = selectedElement.width / 2;
selectedElement.transformY = selectedElement.height / 2;
selectedElement.rotation += 90;
SelectElement(selectedElement);


Как лучше сделать? Может вызывать TransformTool.toolMatrix.rotate()?

Создать новую тему Ответ Часовой пояс GMT +4, время: 08:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
AS3 , алгоритмы , маркер , поворот , трансформация

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 08:28.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.