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

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

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

Регистрация: Nov 2009
Адрес: в златоглавой
Сообщений: 745
По умолчанию Перевод реальных координат мыши в координаты искажённого объекта (flash.geom.Matrix)

Есть сетка квадратных тайлов, мы делаем её "изометрической": поворачиваем на 45°, скейлим по 'y' на 0.8, задаём необходимые координаты.



Затем, нужно получить старые координаты вершин (как будто сетка не была повёрнута). Кликаем поочерёдно по вершинам, по CLICK выполняем функцию:
Код AS3:
var mtrx:Matrix = new Matrix();
mtrx.translate(-grid.x, -grid.y);	// сдвигаем назад на ноль
mtrx.scale(1, 1.2);					// скейлим обратно в бОльшую сторону
mtrx.rotate(-Math.PI/4);			// поворачиваем обратно на 45°
var pnt:Point = mtrx.transformPoint(new Point(mouseX, mouseY));	// получаем здесь нужную нам точку
Результаты кликов по красным вершинам:
Код:
(x = 0, y = 0)
(x = 49, y = 0)
(x = 98, y = -1)
(x = 147, y = -2)
(x = 196, y = -2)
Результаты кликов по зелёным вершинам:
Код:
(x = 0, y = 0)
(x = 0, y = 49)
(x = -1, y = 97)
(x = -2, y = 146)
(x = -3, y = 197)
Ширина клетки = 50 пикселей, считает ПОЧТИ правильно. Откуда выпадает эта ошибка-погрешность? Что я не учёл?

Чтобы было понятнее:
Клики должны выдавать:
Код:
(x = 0, y = 0)
(x = 50, y = 0)
(x = 100, y = 0)
...
(x = 0, y = 50)
(x = 0, y = 100)
(x = 0, y = 150)
...
__________________
Нормально делай — нормально будет!

Старый 20.12.2012, 23:13
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 2  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Попробуйте умножать текущие координаты точки на обратную матрицу трансформации, получите начальные координаты точки.
__________________
interplanety

Старый 20.12.2012, 23:48
tsarapkabel вне форума Посмотреть профиль Отправить личное сообщение для tsarapkabel Найти все сообщения от tsarapkabel
  № 3  
Ответить с цитированием
tsarapkabel
 
Аватар для tsarapkabel

Регистрация: Nov 2009
Адрес: в златоглавой
Сообщений: 745
Цитата:
Сообщение от Korchy Посмотреть сообщение
Попробуйте умножать текущие координаты точки на обратную матрицу трансформации, получите начальные координаты точки.
Вы имеете ввиду mtrx.invert ?
Получаются вообще другие цифры. Если можно, уточните кодом.
__________________
Нормально делай — нормально будет!

Старый 21.12.2012, 01:12
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 4  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
я думаю имелось ввиду
Код AS3:
	var mtrx:Matrix = grid.transform.matrix;
	mtrx.invert();
	var pnt:Point = mtrx.transformPoint(new Point(mouseX, mouseY));
или
Код AS3:
	var mtrx:Matrix = new Matrix();
	mtrx.rotate(Math.PI/4);
	mtrx.scale(1, 0.8);
	mtrx.invert();
	var pnt:Point = mtrx.transformPoint(new Point(mouseX, mouseY));

Старый 21.12.2012, 01:30
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 5  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
mtrx.scale(1, 0.8);
О! Спасибо. Я теперь обратил внимание.
Обратный масштаб в оригинальном коде выбран неправильно:
Цитата:
mtrx.scale(1, 1.2);
1.2 * 0.8 = 0.96. 4% разницы, с учетом прочих погрешностей и дадут +-4 на сотню пикселей.

Всегда, когда идет увеличение/уменьшение на X процентов, нужно учитывать, от исходной или от целевой величины идут проценты. Т.е. фраза "А меньше Б на 20%" совершенно не означает, что "Б больше А на 20%".

Старый 21.12.2012, 13:02
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 6  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Цитата:
Сообщение от tsarapkabel Посмотреть сообщение
Вы имеете ввиду mtrx.invert ?
Получаются вообще другие цифры. Если можно, уточните кодом.
Каким образом могут получиться другие цифры? Вот элементарный пример:

Код AS3:
// спрайт. поместим в точку 10,10
var TS:Sprite = new Sprite();
addChild(TS);
TS.x = 10;
TS.y = 10;
// начальная точка
var CP:Point = new Point(TS.x, TS.y);
trace(CP);   // (x=10, y=10)
// допустим переместили спрайт в точку 100,100
var M:Matrix = new Matrix();
M.tx = 100;
M.ty = 100;
trace(M);   // (a=1, b=0, c=0, d=1, tx=100, ty=100)
var M0:Matrix = TS.transform.matrix;
M0.concat(M);
TS.transform.matrix = M0;
// текущая точка
CP = new Point(TS.x, TS.y);
trace(CP);   // (x=110, y=110)
// Как получить начальную координату - взять обратную матрицу
var M1:Matrix = M.clone();
M1.invert();
trace(M1);   // (a=1, b=0, c=0, d=1, tx=-100, ty=-100)
// кординаты начальной точки
var PP:Point = M1.transformPoint(CP);
trace(PP);   // (x=10, y=10)
__________________
interplanety

Старый 21.12.2012, 16:54
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 7  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Может просто sprite2.globalToLocal(sprite1.localToGlobal(newPoint(x, y)) сделать?
А потом округлить, если целые x, y в координатах повёрнутого поля нужны

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

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

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


 


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


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