Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повернуть вектор на угол, относительно другого 
V
    Опции темы
Rickert
Дата 15.1.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 1
Всего: 52



Есть два вектора, выходящие из одной точки. Надо повернуть один вектор относительно другого на опредлённый угол. Как?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
AlexST
Дата 15.1.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 30.4.2006
Где: Москва

Репутация: нет
Всего: 3



Можно так:

Есть вектора A(x1,y1,x2,y2) и B(x1,y1,x3,y3).
Углом вектора А будем считать угол между прямой на которой он лежит и осью абсцисс.
tg(А) этого угла = (y2-y1)/(x2-x1).
tg(В) вектора В будет = ( tg(A)+tg(с) )/( 1-tg(A)*tg(с) ), где с - угол поворота.

Ответ:
Тогда координаты вектора В длиной L будут равны:

x3=x2+√( L^2 / (1+tg(B)^2) )
y3=y2+√( L^2 / (1+tg(B)^-2) )

Чёт громоздко получилось. Может можно проще...

Это сообщение отредактировал(а) AlexST - 15.1.2007, 18:41
PM MAIL ICQ   Вверх
maxim1000
Дата 15.1.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



насколько я понял, речь идёт о 3-мерном пространстве...

можно сделать так (осью будет называть вектор, относительно которого идёт поворот):

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

2. рассмотрим плоскость, перпендикулярную оси: перпендикулярную составляющую нужно поворачивать именно в ней

3. выбираем базис для этой плоскости
первым вектором можно взять сам поворачиваемый (его перп. составляющую)
вторым - векторное произведение его на ось
при этом нужно нормировать ось, чтобы размеры получились одинаковые

4. дальше просто записываем формулу поворота p'=p*cos phi + n*sin phi
p - перпендикулярная составляющая исходного вектора
p' - повёрнутого вектора
n - второй базисный вектор (векторное произведение)


--------------------
qqq
PM WWW   Вверх
AlexST
Дата 15.1.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 30.4.2006
Где: Москва

Репутация: нет
Всего: 3



Цитата(maxim1000 @  15.1.2007,  18:42 Найти цитируемый пост)
насколько я понял, речь идёт о 3-мерном пространстве...
Rickert, вот сиди и догадывайся о чём писать...  smile 



Это сообщение отредактировал(а) AlexST - 15.1.2007, 19:00
PM MAIL ICQ   Вверх
Sartorius
Дата 15.1.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



Вот функция , возвращающая поворотную матрицу, относительно любого вектора на угол alph
Код

CMatrix CMatrix::getRotationMatrix(CVector v, float alpha) // returns rotation matrix for direction v, angle alpha
{
    float xy_proection = sqrtf(v.m_x * v.m_x + v.m_y * v.m_y);

    if(fabs(xy_proection) < 0.001) xy_proection = 0.001;

    float sinTetha  = v.m_y / xy_proection;
    float cosTetha  = v.m_x / xy_proection;
    float cosPhy    = v.m_z / v.length();
    float sinPhy    = sqrtf(v.m_x * v.m_x + v.m_y * v.m_y) / v.length();
    float cosAlpha  = cosf(alpha);
    float sinAlpha  = sinf(alpha);

    CMatrix Rz1(
                CVector(cosTetha, - sinTetha, 0.0f), 
                CVector(sinTetha, cosTetha,      0.0f), 
                CVector(0.0,      0.0,          1.0f)
                );
    CMatrix Ry1(
                CVector(cosPhy,  0.0f,        sinPhy), 
                CVector(0.0f,    1.0f,      0.0f), 
                CVector(-sinPhy, 0.0,        cosPhy)
                );
    CMatrix Rv(
                CVector(cosAlpha,    sinAlpha,    0.0f), 
                CVector(-sinAlpha,  cosAlpha,   0.0f), 
                CVector(0.0f,        0.0f,        1.0f)
                );
    CMatrix Ry(
                CVector(cosPhy,        0.0f,    -sinPhy), 
                CVector(0.0f,        1.0f,     0.0f), 
                CVector(sinPhy,        0.0f,     cosPhy)
                );
    CMatrix Rz(
                CVector(cosTetha,   sinTetha,  0.0f), 
                CVector(-sinTetha,    cosTetha,  0.0f), 
                CVector(0.0f,        0.0f,       1.0f)
                );


    return ~(Rz1 * Ry1 * Rv * Ry * Rz); // ~ = транспонировать

}


Если чего - пиши, я библиотеку полностью пришлю. Просто здесь вроде понятно, как надо CVector и CMatrix определять
PM MAIL ICQ   Вверх
Rickert
Дата 15.1.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 1
Всего: 52



БЕЗ матриц.
Пространство ествественно трёхмерное.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Sartorius
Дата 15.1.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



 А почему без матриц? Везде сначала оператор поворота получают, а затем просто умножают на него вектор... Можно D3DX подключить, там все есть
PM MAIL ICQ   Вверх
Rickert
Дата 16.1.2007, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 1
Всего: 52



Вот как я реализовал поворот:
Код

v2.avRotateAroundVector(v1, 90); //вращать вектор v2 относительно v1 на 90 градусов.
...
void aVector::avRotateAroundVector(aVector vec, float angle)
{
  aVector dx, dy, dz, tmp(0.0, 0.0, 0.0);
  float dot;

  dot = avDotMultiply(vec);
  dz.x = vec.x * dot;
  dz.y = vec.y * dot;
  dz.z = vec.z * dot;

  dx.x = x - dz.x;
  dx.y = y - dz.y;
  dx.z = z - dz.z;

  dy = dx.avCrossMultiply(vec);

  x = dx.x * cos(ATOR(angle)) + dy.x * sin(ATOR(angle)) + dz.x;
  y = dx.y * cos(ATOR(angle)) + dy.y * sin(ATOR(angle)) + dz.y;
  z = dx.z * cos(ATOR(angle)) + dy.z * sin(ATOR(angle)) + dz.z;
}
...


Добавлено @ 08:46 
Но где-то закралась ошибка ибо, когда я указываю v2 = (0.0; 1.0; 0.0), а v1 = (1.0; 1.0; 0.0), то он мне выдаёт вектор = (1.0; 1.0; -1.0). smile

Добавлено @ 08:49 
Может нормализации где не хватает?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 16.1.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 1
Всего: 52



Нашёл ошибку - это формула вращения вокруг вектора, а не относительного него.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Elfet
Дата 3.6.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Цитата(Rickert @  15.1.2007,  21:46 Найти цитируемый пост)
БЕЗ матриц

Расписать матрицу? smile


--------------------
PM MAIL WWW Skype   Вверх
Rickert
Дата 4.6.2007, 04:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 1
Всего: 52



Elfet, вопрос давно решён smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1025 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.