58 / 58 / 9
Регистрация: 09.01.2013
Сообщений: 247
1

Угол одной позиции относительно другой

23.01.2013, 10:35. Показов 2545. Ответов 2
Метки нет (Все метки)

Всем доброго дня. Ни как не могу сообразить: даны два Vector2, нужно найти угол первой позиции (в градусах) относительно второй позиции:
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2013, 10:35
Ответы с готовыми решениями:

Вращение одной точки относительно другой
Правильно ли я понимаю, что сначала надо вращать точку A вокруг B так как будто B - начало...

Удаление элементов из списка с одной позиции до другой
Помогите, пожалуйста, написать программу: Напишите предикат p(+L, +N1, +N2, ?R), который удаляет...

Найти схожие позиции ячеек из одной таблицы в другой
Существуют ли какие-нибудь методы, способы или алгоритмы, чтобы найти схожие позиции ячеек из одной...

Из файла выбрать определенные символы с одной позиции до другой
всем привет, подскажите как написать программу на C# , чтоб из txt файла выбирала определенные...

2
25 / 25 / 0
Регистрация: 02.10.2012
Сообщений: 63
24.01.2013, 08:08 2
Странно, такую тему уже вроде кто-то заводил, и ему ответили...
C#
1
2
3
4
(float)Math.Atan2(
    (Искомая_Позиция - Центральная_Позиция).Y,
    (Искомая_Позиция - Центральная_Позиция).X * (180f / Math.PI)
);
Этот вызов арктангенса вернет угол как направление в градусах, не тот к которому мы привыкли (0-360), а (-180-0 - 0 +180).

Чтобы перевести такой угол в угол обычный (0-360) воспользуемся логикой:
C#
1
Angle >= 0 ? 360.0f - Angle : Math.Abs(Angle)
Чтобы перевести обычный угол в угол типа (-180-0 - 0 +180) делаем аналогично:
C#
1
Angle > 180 ? 360.0f - Angle : -Angle
Как можно использовать угол (-180-0 - 0 +180) ?
- Очень просто, из-за того что -180-0 лежит вверху а +180-0 внизу, значит можно использовать его как направление движения по экрану, ибо ось Y в экранных координатах направлена как раз сверху вниз.
Допустим у нас есть персонаж Hero, и его надо двигать в направлении Angle, со скоростью 100 px:
C#
1
2
3
4
Hero.Position += new Vector2(
    (float)Math.Cos(MathHelper.ToRadians(Angle)) * 100f,
    (float)Math.Sin(MathHelper.ToRadians(Angle)) * 100f
);
И после этого персонаж переместится на 100 px в направлении Angle (который был найден через Atan2()).

Вот видишь как тебе повезло что я про всё это рассказал) раньше я до этого сам доходил изучая кучу инфы в интернете)) совет на будущее: больше пользуйся бумагой и карандашом когда что-то не понятно.
2
58 / 58 / 9
Регистрация: 09.01.2013
Сообщений: 247
24.01.2013, 18:51  [ТС] 3
Спасибо=) Все работает. Просто только учусь работать с геометрией в xna

Добавлено через 39 минут
Написал что все работает раньше чем проверил))

C#
1
2
3
4
5
6
7
8
9
10
11
                        
                          //РАСЧЕТ УГЛА ПРИ НАЖАТИЕ МЫШИ (get - координаты(Vector2))
                          Rotation = (float)Math.Atan2(
                           (_ShipPosition - get).X,
                           (_ShipPosition - get).Y * (180f / Math.PI));
 
                        //ЭТОТ КОД В МТОДЕ ОБНОВЛЕНИЯ...
                        //Текущие позиции
                        _ShipPosition += new Vector2(
                            (float)Math.Cos(MathHelper.ToRadians(Rotation)) * 5f,
                            (float)Math.Sin(MathHelper.ToRadians(Rotation)) * 5f);
В итоге, ку да бы я не нажал, объект всегда двигается в правую сторону, с отклонением +-0.1

Добавлено через 1 час 40 минут
Хотя нет, это все же я немного все перепутал. Сделал по-другому, и все заработало:

При изменение позиции назначения:

C#
1
2
3
4
Vector2 get = new Vector2(_GetPosition.X, _GetPosition.Y);
            Rotation = (float)Math.Atan2(
                (get - _ShipPosition).Y,
                (get - _ShipPosition).X /** (180f / Math.PI)*/);
Обновление:

C#
1
2
Vector2 velocity = Speed * new Vector2((float)Math.Cos(Rotation), (float)Math.Sin(Rotation));
                        _ShipPosition += velocity;
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2013, 18:51
Помогаю со студенческими работами здесь

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

Написать программу, демонстрирующую движение одной плоской фигуры относительно другой
Ребята помогите! анимация, ни одной идеи в голове:cry: Написать программу, демонстрирующую...

Написать программу, демонстрирующую движение одной плоской фигуры относительно другой
Ребята, есть такое задание:Написать программу, демонстрирующую движение одной плоской фигуры ...

Автоматическое изменение количества в одной таблице при выборе позиции из другой таблицы
Добрый день, уважаемые! Помогите советом, подсказкой:gconfusion: Штука такая. Есть первая...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru