LINUX.ORG.RU

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


0

1

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

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

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

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

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

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

anonymous
()
Ответ на: комментарий от post-factum

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

buddhist ★★★★★
()
Ответ на: комментарий от anonymous

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

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

eugeno ★★★★★
()
Ответ на: комментарий от post-factum

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

adriano32 ★★★
()
Ответ на: комментарий от adriano32

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

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

eugeno ★★★★★
()
Ответ на: комментарий от eugeno

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

adriano32 ★★★
()
Ответ на: комментарий от adriano32

А не слишком ли сложно? По-моему, лучше перейти в декартову систему, и не нужны будут всякие Min, Max и Abs.

eugeno ★★★★★
()
Ответ на: комментарий от adriano32

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

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

eugeno ★★★★★
()
Ответ на: комментарий от post-factum

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

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

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

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

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

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

Как-то так.

adriano32 ★★★
()
Ответ на: комментарий от adriano32

Я пока решил копать декартову систему. Вроде, получилось. В ходе полевых испытаний будет видно :).

post-factum ★★★★★
() автор топика
Ответ на: комментарий от post-factum

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

adriano32 ★★★
()
Ответ на: комментарий от post-factum

Тогда пересчёт в декартову - ненужный оверхед.

adriano32 ★★★
()
Ответ на: комментарий от post-factum

На чём пишешь? Просто в фортране есть встроенный тип -complex. С помощью него проблема решается автоматически.

Rakot ★★
()

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

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

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

no-dashi ★★★★★
()

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от 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

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

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

Booster ★★
()
Ответ на: комментарий от no-dashi

Кажется, решил вопрос вот так:

public double getPhase()
{
	double angle = Math.atan2(y, x);
	if (angle < 0)
		return 2 * Math.PI + angle;
	else
		return angle;
}

Надеюсь, правильно.

post-factum ★★★★★
() автор топика
Ответ на: комментарий от post-factum

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

no-dashi ★★★★★
()
Ответ на: комментарий от post-factum

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

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

no-dashi ★★★★★
()
Ответ на: комментарий от post-factum

Тьфу ты блин, ты про atan2...

Это не тригонометрическая функция, это обертка над atan с теми условиями которые я описал :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

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

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

quickquest ★★★★★
()

вектор лежит на прямой
y = k*x+b
Где k = tg(a);
где a - угол наклона к оси абсцис
откуда
a = arctg((y-b)/x)

Jetty ★★★★★
()
Ответ на: комментарий от post-factum

То же самое что и no-dashi только примитавами геометрии 6-го класса :)

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

Спроси у КО, какой диапазон возвращаемых значений у арктангенса.

post-factum ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.