LINUX.ORG.RU
решено  
post-factum

Угол вектора после сложения двух векторов


0

1

Реализовываю сложение векторов.

Есть два вектора A и B, заданные длиной и углом. Нужно найти угол вектора C, который получился в результате сложения векторов A и B.

С длиной вектора C проблем не возникло, по теореме косинусов считается элементарно.

А с углом непонятки. По теореме синусов выходит, что угол нового вектора лежит в пределах от -90° до 90°, но мне нужно от 0° до 360°.

Как правильно вычислить угол?


[#]  

1. Переведи из полярных координат в евклидовы. 2. Сложи векторы. 3. Переведи из евклидовых обратно в полярные. 4. PROFIT

anonymous ()
[#] Ответ на: комментарий от post-factum 11.09.2011 17:12:45  
buddhist

Если вам принципиально знать именно угол в каждом конкретном случае, то лучше действительно хранить вектора в полярном виде. А если вам это непринципиально, то что мешает считать угол каждый раз, когда он нужен?

*** ()
[#] Ответ на: комментарий от anonymous 11.09.2011 17:11:32  
eugeno
>>-----Цитата---->>

Переведи из полярных координат в евклидовы.

<<-----Цитата----<<

Это называется декартовы координаты, а не евклидовы.

* ()
[#] Ответ на: комментарий от post-factum 11.09.2011 17:39:10  
adriano32

Если ты по теореме синусов нашёл угол, это один из двух углов внутри треугольника из векторов — двух слагаемых и результатирующего, верно? Так прибавь его куда надо

*** ()
[#] Ответ на: комментарий от adriano32 11.09.2011 17:46:16  
eugeno
>>-----Цитата---->>

Если ты по теореме синусов нашёл угол, это один из двух углов внутри треугольника из векторов — двух слагаемых и результатирующего, верно? Так прибавь его куда надо

<<-----Цитата----<<

Таки да, ты задаёшь углы относительно какой-то оси, а в итоге получаешь внутренний угол треугольника. Чтобы тоже посчитать угол относительно оси, нужно действительно перевести всё в декартовы координаты, сложить, вернуться обратно в полярные. Это Ъ-way.

* ()
[#] Ответ на: комментарий от eugeno 11.09.2011 17:49:10  
adriano32

Я так вижу задачу: есть длины векторов и углы от 0 до 360 градусов. Первым шагом первый вектор ставим в начало координат, затем второй вектор переносим в конец первого. Теперь считаем угол между этими векторами: макс (угол1,угол2) - мин (угол1,угол2). Теперь расчёты длины по теореме косинусов, расчёт угла в треугольнике между вектором с наибольшим абсолютным углом и результатирующим по теореме синусов. В итоге, чтобы получить абсолютный угол результатирующего, вычитаем из угла вектора с наибольшим абсолютным углом расчитанный на предыдущем шаге угол.

*** ()
[#] Ответ на: комментарий от adriano32 11.09.2011 18:37:19  
eugeno
>>-----Цитата---->>

Конечно, синусы и косинусы быстрее считать, чем Min, Max и Abs. :D

<<-----Цитата----<<

Хорошо, уговорил:) Но при более сложных вычислениях лучше пожертвовать скоростью в пользу читабельности кода.

* ()
[#] Ответ на: комментарий от post-factum 11.09.2011 18:10:21  
adriano32

Смотри: пускай у тебя вектора длин A и B, углы, например, 30 и 300 (у тебя же от 0 до 360 углы).

Посчитай модуль разности abs(30-300)=270. Больше 180? Да, в треугольник не влазит, значит (360-270)=90 градусов угол между векторами-слагаемыми в образуемом треугольнике. Если бы были углы 30 и 120, то так и оставили бы.

Посчитал по теореме косинусов длину результатирующего вектора, беря угол 90 между векторами-сторонами треугольника.

Теперь по теореме синусов расчитай угол между результатирующим вектором и вторым, который определишь по правилу: если модуль разности углов был больше 180, то берёшь для расчёта сторону напротив угла результатирующего вектора с вектором с меньшим углом, если модуль разности углов был меньше 180, то берёшь для расчёта сторону напротив угла результатирующего вектора с вектором с большим углом.

Посчитал угол, теперь осталось отсчитать его от угла одного из векторов слагаемых, если модуль разности углов был больше 180, то отними посчитанный перед этим угол от угла вектора с меньшим углом, если модуль разности углов был меньше 180, то отними посчитанный угол от угла вектора с большим углом.

Проверь, не выполз ли результат в минус, добавь 360 если надо.

Как-то так.

*** ()
[#] Ответ на: комментарий от post-factum 11.09.2011 19:27:23  
adriano32

Тогда надо хранить для вектора не угод и длину, а координаты в декартовой, а для расчёта угла и длины держать функции-методы класса.

*** ()
[#]  
no-dashi

А почему бы просто не определить угол результируючего вектора относительно одного из базисных???

> По теореме синусов выходит, что угол нового вектора лежит в пределах от -90° до 90°, но мне нужно от 0° до 360°

Для определния угла, нужно оперировать арксинусом и арккосинусом, и на их основании их знаков делать выводы. Элементарная геометрия.

***** ()
[#]  

Что-то я не понял, в чем проблемы-то? Переводим векторы в декартовы координаты, складываем, а затем переводим обратно...

**** ()
[#] Ответ на: комментарий от no-dashi 11.09.2011 20:06:00  
no-dashi

v1=(x1,y1) v2=(x2,y2)

Xn = x1+y1
Yn = y1+y2

Берем арктангенс угла (Atan = atg(Xn/Yn))

Определяем по знаку Xn и Yn четверть:

Xn>0, Yn>0 => 1-я четверть, Ag = Atan
Xn<0, Yn>0 => 2-я четверть, An = Pi - Ang
Xn<0, Yn<0 => 3-я четверть, An = Pi + Ang
Xn>0, Yn<0 => 4-я четверть, An = 2*Pi - Ang

***** ()
[#] Ответ на: комментарий от post-factum 11.09.2011 21:23:28  
no-dashi

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

***** ()
[#] Ответ на: комментарий от post-factum 11.09.2011 21:40:55  
no-dashi

> This produces results in the range (−π, π]

Арктангенс??? Где ты ЭТО вычитал??? Все классические обратные тригонометрические функции возвращают диапазон длиной не более одного Пи, буде то [-Pi/2 ... +Pi/2] или [0 ... Pi]

***** ()
[#] Ответ на: комментарий от no-dashi 11.09.2011 22:57:18  
quickquest

>тригонометрические функции возвращают диапазон длиной не более одного Пи

«... в военное время значение косинуса может достигать пяти!!!» (c) :)

***** ()