Форум программистов, компьютерный форум, киберфорум
ActionScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/27: Рейтинг темы: голосов - 27, средняя оценка - 4.56
2 / 2 / 1
Регистрация: 21.05.2013
Сообщений: 129
1

Поворот объекта вокруг оси

21.06.2013, 12:22. Показов 5303. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, есть объект в виде круга,на нем две прозрачных области левая и правая при нажатии на которые объект должен вращаться относительно своего центра,а не верхнего левого угла. При этом области нажатия должны находиться сверху объекта и быть неподвижными.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2013, 12:22
Ответы с готовыми решениями:

Поворот объекта вокруг центра
Имеется векторная картинка. Хочу, чтобы она всегда была повернута на указатель мыши. просто obj.rotation не подходит, потому что...

Вращение наклоненного 3Д-объекта вокруг своей оси
Доброго времени суток. У меня есть два объекта и мне нужно, чтобы оба они вертелись вокруг своей оси(см. скриншот ниже), с первым объектом...

Поворот объекта
Здравствуйте! Есть местность (обычный квадрат), в котором по клику мыши двигается персонаж. В верхнем правом углу есть дерево...

6
Модератор
 Аватар для TanaTiX
2914 / 1772 / 180
Регистрация: 19.02.2011
Сообщений: 6,520
21.06.2013, 15:04 2
Поместить центр объекта в нулевые координаты? Это самое простое.
0
2 / 2 / 1
Регистрация: 21.05.2013
Сообщений: 129
21.06.2013, 15:44  [ТС] 3
пробовал,но rotation всё-равно крутит относительно нуля X и Y

Добавлено через 49 секунд
пробовал сделать подложку из контейнера, но тогда начинают крутиться и области нажатия, что совершенно неверно.
0
2 / 2 / 1
Регистрация: 21.05.2013
Сообщений: 129
24.06.2013, 09:15  [ТС] 4
Помогите пожалуйста,вопрос так и небыл решен,и тему напрасно перенесли из раздела actionscript. Ведь этот поворот мне необходимо осуществить именно программным способом именно с помощью данного языка
0
17 / 17 / 4
Регистрация: 31.05.2013
Сообщений: 38
24.06.2013, 10:26 5
Лучший ответ Сообщение было отмечено как решение

Решение

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package
{
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Matrix;
    import flash.geom.Point;
    
    public class testRotation extends Sprite
    {
        private var clip:Shape;
        public function testRotation()
        {
            this.stage.scaleMode = StageScaleMode.NO_SCALE;
            this.stage.align = StageAlign.TOP_LEFT;
            //
            clip = new Shape();
            clip.graphics.beginFill(0xff0000, 1);
            clip.graphics.drawRect(0, 0, 100, 100);
            clip.graphics.endFill();
            this.addChild(clip);
            //
            // запоминаем глобальные координаты клипа
            globalPosition = new Point(150, 150);
            clip.x = globalPosition.x;
            clip.y = globalPosition.y;
            //
            // локальная координата клипа относительно которой будет поворачиваться объект
            centerPoint = new Point();
            centerPoint.x = clip.width/2;
            centerPoint.y = clip.height/2;
            // угол поворота в градусах
            currentAngle = 0;
            //
            this.addEventListener(Event.ENTER_FRAME, frameHandler);
            rotateAroundPoint(centerPoint, currentAngle);
        }
        
        private var globalPosition:Point;
        private var centerPoint:Point;
        private var currentAngle:Number;
        private function frameHandler(event:Event):void
        {
            currentAngle += 1;
            rotateAroundPoint(centerPoint, currentAngle*Math.PI/180);
        }
        
        /**
         * Повернуть объект относительной заданной точки на угол angle
         * @param center Точка поворота(локальные координаты поворачиваемого клипа)
         * @param angle Угол в градусах
         * 
         */
        private function rotateAroundPoint(center:Point, angle:Number):void
        {
            var matrix:Matrix = new Matrix();
            matrix.translate(-center.x, -center.y);
            matrix.rotate(angle);
            matrix.translate(globalPosition.x, globalPosition.y);
            clip.transform.matrix = matrix;
        }
    }
}
Как это будет выглядеть смотрите здесь.

Добавлено через 3 минуты
Для наглядности дописал код так что бы при клике на квадрат, точка поворота менялась на ту, куда кликнули мышкой:
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package
{
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.geom.Point;
    
    public class testRotation extends Sprite
    {
        private var clip:Sprite;
        public function testRotation()
        {
            this.stage.scaleMode = StageScaleMode.NO_SCALE;
            this.stage.align = StageAlign.TOP_LEFT;
            //
            clip = new Sprite();
            clip.graphics.beginFill(0xff0000, 1);
            clip.graphics.drawRect(0, 0, 100, 100);
            clip.graphics.endFill();
            this.addChild(clip);
            clip.addEventListener(MouseEvent.CLICK, clickHandler);
            //
            // запоминаем глобальные координаты клипа
            globalPosition = new Point(150, 150);
            clip.x = globalPosition.x;
            clip.y = globalPosition.y;
            //
            // локальная координата клипа относительно которой будет поворачиваться объект
            centerPoint = new Point();
            centerPoint.x = clip.width/2;
            centerPoint.y = clip.height/2;
            // угол поворота в градусах
            currentAngle = 0;
            //
            this.addEventListener(Event.ENTER_FRAME, frameHandler);
            rotateAroundPoint(centerPoint, currentAngle);
        }
        
        private var globalPosition:Point;
        private var centerPoint:Point;
        private var currentAngle:Number;
        private function frameHandler(event:Event):void
        {
            currentAngle += 1;
            rotateAroundPoint(centerPoint, currentAngle*Math.PI/180);
        }
        
        /**
         * Повернуть объект относительной заданной точки на угол angle
         * @param center Точка поворота(локальные координаты поворачиваемого клипа)
         * @param angle Угол в градусах
         * 
         */
        private function rotateAroundPoint(center:Point, angle:Number):void
        {
            var matrix:Matrix = new Matrix();
            matrix.translate(-center.x, -center.y);
            matrix.rotate(angle);
            matrix.translate(globalPosition.x, globalPosition.y);
            clip.transform.matrix = matrix;
        }
        
        private function clickHandler(event:MouseEvent):void
        {
            //запоминаем глобальные координаты для смещения
            globalPosition.x = this.mouseX;
            globalPosition.y = this.mouseY;
            // запоминаем локальные координаты для поворота
            centerPoint.x = clip.mouseX;
            centerPoint.y = clip.mouseY;
        }
    }
}
Результат здесь.
4
2 / 2 / 1
Регистрация: 21.05.2013
Сообщений: 129
24.06.2013, 13:28  [ТС] 6
какая красота, большое Вам спасибо, очень помогли
0
24.06.2013, 13:39 7

Не по теме:

@banzay89, перемещал т.к. указанная вами задача решалась не программными способами. На данный момент есть программное решение (при чем универсальное) - вернул назад.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.06.2013, 13:39
Помогаю со студенческими работами здесь

Поворот объекта за курсором
хочу сделать поворота плеера в сторону курсора, но кажется в математику не смог спрайт всегда смотрит вверх и мне надо узнать угол между...

Поворот объекта внутри класса
Осваиваю actionscript и в процессе возник следующий вопрос: После помещения объекта в класс открыл для себя, что отныне mouseX и mouseY...

Вращение объекта вокруг произвольной точки
Добрый день. У всех создаваемых(по крайней мере мной) объектов "центр" находится в левом верхнем углу, что крайне неудобно если нужно...

Поворот объекта вокруг оси
Здравствуйте. Знаю что подобная тема уже поднималась на форуме, но интересующий меня ответ я не нашёл:(. Пробовал искать (Гуглить:)), но...

Поворот объекта вокруг своей оси! LUA
Доброго времени суток. Переду сразу к делу. Возникла необходимость написать игру на lua в LOVE2d. И мне , для начала нужно научиться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Что нового в C# 14
UnmanagedCoder 10.03.2025
Предстоящая версия C# 14 обещает принести изменения, которые сделают разработку еще более приятной и эффективной. Что стоит отметить, так это влияние сообщества разработчиков на формирование новых. . .
Формулы поворота
Igor3D 10.03.2025
Добрый день Тема Эти формулы приводятся во множестве тьюториалов, часто под видом "матрица вращения на плоскости". x' = x * cos(a) - y * sin(a) y' = y * cos(a) + x * sin(a) Как бы Вы их. . .
Что нового в .NET 10
UnmanagedCoder 10.03.2025
. NET 10 выходит как релиз с длительной поддержкой (LTS), включающей три года обновлений. В этом обновлении Microsoft сфокусировались на нескольких направлениях: производительность, оптимизация. . .
Отложенное высвобождение, RCU и Hazard Pointer в C++26
NullReferenced 09.03.2025
Многопоточное программирование стало важной частью современной разработки. Когда несколько потоков одновременно работают с общими данными, возникает целый ряд проблем, связанных с синхронизацией и. . .
Неблокирующийся стек на C++26
NullReferenced 09.03.2025
Традиционные способы синхронизации в многопоточном программировании — мьютексы, семафоры, условные переменные — часто превращаются в узкое место в плане производительности. При этом неблокирующиеся. . .
Обработка строк в C++26: Новые возможности string и string_view
NullReferenced 09.03.2025
Новый стандарт C++26 предлагает много улучшений для работы с привычными string и относительно новыми string_view. string_view - это невладеющая ссылка на последовательность символов, появившаяся в. . .
Мой первый аддон для Blender 3D, с помощью нейронки (не зная даже азов пайтона, но это не значит что так и с остальным).
Hrethgir 09.03.2025
Потратил весь день. Пол-дня мне хватило, чтобы понять что с версией с 14B мне не одолеть написание функционального кода, на языке с которым я вообще никак не знаком - пайтон. Версия 22B от другого. . .
Einstein@Home сегодня исполняется двадцать лет!
Programma_Boinc 09.03.2025
Einstein@Home сегодня исполняется двадцать лет! Отправлено 19 февраля 2025 года в 17:20:21 UTC Я хочу поздравить всех наших волонтеров, разработчиков и ученых из Einstein@Home. Мы официально. . .
Заполнители и расширенный набор символов в C++26
NullReferenced 09.03.2025
C++26 представляет два важных обновления: заполнители и расширенный набор символов. Заполнители (placeholders) решают давнюю проблему лаконичности кода в шаблонных выражениях и лямбда-функциях. Они. . .
Контракты в C++26
NullReferenced 09.03.2025
Контракты – это механизм, позволяющий указывать предусловия, постусловия и инварианты для функций в коде. Эта функциональность должна была стать частью C++20, но была исключена на встрече комитета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru