Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.03.2007, 19:00
незарегистрированный

 
Сообщений: n/a

ищу алгоритм вращения вектора вокруг произвольной оси в пространстве.
Ищу алгоритм вращения вектора вокруг произвольной оси в пространстве.
Или исходник этого алгоритма на vb.

Суть задачи:

Задана ось в пространстве A(x1,y1,z1) B(x2,y2,z2),
задан вектор, который имеет начало на этой оси, задан угол вращения.
Найти координаты вектора после поворота на данный угол около данной оси.
  #2  
Старый 03.05.2007, 19:17
Пётр Седов

 
Сообщений: n/a

вращение вектора на C++
Могу предложить код на C++:
Код:
#include <assert.h>
#include <math.h>

inline double Equals(double x, double y, double Tol)
{
  assert(Tol >= 0);
  return fabs(x - y) <= Tol;
}

// квадрат числа
inline double Squ(double x)
{
  return x * x;
}

// квадратный корень
inline double SquRoot(double x)
{
  assert(x >= 0);
  return sqrt(x);
}

// переводит из градусов в радианы
inline double RadFromDeg(double x)
{
  return (3.1415926535897932384626433832795 / 180) * x;
}

struct Vec3
{
  double x;
  double y;
  double z;
};

// скаляр * вектор
inline Vec3 operator*(double a, const Vec3& v)
{
  Vec3 Res = { a * v.x, a * v.y, a * v.z };
  return Res;
}

// вектор + вектор
inline Vec3 operator+(const Vec3& v1, const Vec3& v2)
{
  Vec3 Res = { v1.x + v2.x, v1.y + v2.y, v1.z + v2.z };
  return Res;
}

// вектор - вектор
inline Vec3 operator-(const Vec3& v1, const Vec3& v2)
{
  Vec3 Res = { v1.x - v2.x, v1.y - v2.y, v1.z - v2.z };
  return Res;
}

// длина вектора
inline double Len(const Vec3& v)
{
  return SquRoot(Squ(v.x) + Squ(v.y) + Squ(v.z));
}

// скалярное произведение векторов
inline double Dot(const Vec3& v1, const Vec3& v2)
{
  return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}

// векторное произведение векторов
// определитель:
// | i    j    k    |
// | v1.x v1.y v1.z |
// | v2.x v2.y v2.z |
inline Vec3 Cross(const Vec3& v1, const Vec3& v2)
{
  Vec3 Res =
  {
    /*x:*/ v1.y * v2.z - v2.y * v1.z,
    /*y:*/ v1.z * v2.x - v2.z * v1.x,
    /*z:*/ v1.x * v2.y - v2.x * v1.y,
  };
  return Res;
}

inline Vec3 Rotate(const Vec3& PointOnAxis, const Vec3& AxisDir, double Angle, const Vec3& Point)
{
  assert(Equals(Len(AxisDir), 1, /*Tol:*/1e-3)); // AxisDir must be unit vector
  Vec3 r = Point - PointOnAxis;
  return PointOnAxis + cos(RadFromDeg(Angle)) * r + ((1 - cos(RadFromDeg(Angle))) * Dot(AxisDir, r)) * AxisDir + sin(RadFromDeg(Angle)) * Cross(AxisDir, r);
}

// вектор / скаляр
inline Vec3 operator/(const Vec3& v, double a)
{
  assert(a != 0);
  Vec3 Res = { v.x / a, v.y / a, v.z / a };
  return Res;
}

// нормализует вектор
inline Vec3 Norm(const Vec3& v)
{
  return v / Len(v);
}

void Test()
{
  Vec3 A = { 1, 2, 3 }; // x1, y1, z1
  Vec3 B = { 3, 4, 5 }; // x2, y2, z2
  Vec3 OldPoint = { 1, 1, 1 };
  Vec3 NewPoint = Rotate(/*PointOnAxis:*/A, /*AxisDir:*/Norm(B - A), /*Angle:*/45, OldPoint);
}
Вам нужна функция Rotate. Вращение по правилу правого винта (угол увеличивается <=> вращение против часовой стрелки, если смотреть с конца оси).

Пётр Седов, почта: PSedov на Gmail-е
  #3  
Старый 18.05.2010, 23:54
danzewitsch@rambler.ru

 
Сообщений: n/a

спасибо
Ваша программа успешено применена при преобразовании углов Эйлера в вектор вращения по егопроекци на ось y b и плоскость x-z вычислили параметры привода антенны
  #4  
Старый 19.05.2010, 00:47
гость

 
Сообщений: n/a

Сообщение от danzewitsch@rambler.ru Посмотреть сообщение
Ваша программа успешено применена при преобразовании углов Эйлера в вектор вращения по егопроекци на ось y b и плоскость x-z вычислили параметры привода антенны
на патент уже подали?
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ищу алгоритм вращения вектора вокруг произвольной оси в пространстве. незарегистрированный Вычислительная геометрия 1 28.03.2007 14:23
построение выпуклой поверхности в пространстве pjr Вычислительная геометрия 2 10.11.2006 17:03