Я в основном пытаюсь создать менеджер преобразования экранных объектов, который позволит мне масштабировать / вращать объекты. В настоящее время я пытаюсь выяснить, как вращать объект, чтобы его угол следовал за текущими x и y мыши.
Пример 1 http://www.freeimagehosting.net/uploads/ae697efb80.jpg
Пример 2 http://www.freeimagehosting.net/uploads/1a968e5e2b.jpg
Пример 3 http://www.freeimagehosting.net/uploads/1270816f01.jpg
Я всегда запутываюсь в математике подобных вещей. Я знаю, как слушать события и все остальное, я просто не уверен, как рассчитать количество вращения, которое нужно применить. Я, вероятно, буду вращаться через Матрицу, чтобы я мог вращать объект вокруг его центра, а не в верхнем левом углу. Может ли кто-нибудь, кто более искусен в математике, помочь мне?
ОТВЕТ НА ТРОБАДУР
Ваш ответ настолько блестящий, что я вообще не могу его понять. Позвольте мне объяснить, что я могу понять, а что нет. Вот что я делаю / не понимаю:
Сначала сохраните то, что будет в центре изображения, так называемую точку регистрации, вокруг которой мы будем вращать все:
var box:Sprite = new BeautifulSprite();
box.width = box.height = 100;
/* ... */
var registrationPoint:Point = new Point(box.x + box.width / 2,
box.y + box.height / 2);
Я прав до сих пор? Если так, я продолжу.
Во-вторых, обозначить исходное положение мыши:
var mouseDownPoint:Point = new Point(box.mouseX, box.mouseY);
В-третьих, храните «вектор». Проблема в том, что я не уверен, что вы имеете в виду под вектором. Я знаком с типами Vector в Java и AS3, так как они хранят список значений определенного типа. Помимо этого, я потерян.
var vector:* = WTF.forReals();
Затем сохраните расстояние между registrationPoint
и mouseDownPoint
. Я помню, как учился вычислять расстояние между двумя точками еще в старшей школе, поэтому я уверен, что смогу найти формулу для расстояния между двумя 2d точками.
var distance:Number = calculateDistance(registrationPoint, mouseDownPoint);
Я знаю, что приближаюсь! Затем, чтобы определить ограниченный масштаб, мы получаем текущее местоположение мыши, определяем его расстояние до registrationPoint
и делим его на distance
.
var constrainedScale:Number = calculateDistance(registrationPoint, new Point(mouseX, mouseY)) / distance;
Мой вопрос здесь такой: как получить значения, когда я не хочу их ограничивать, например, scaleX и scaleY?
Теперь, чтобы получить фактическое вращение вокруг точки регистрации, я полностью потерян. Не могли бы вы помочь мне, используя переменные, которые я определил выше?