Spec-Zone.ru › Eigen3

Модуль геометрии

Этот модуль предоставляет поддержку для:

  • однородных преобразований фиксированного размера
  • перевода, масштабирования, 2D и 3D вращений
  • кватернионов
  • векторных произведений (MatrixBase::cross, MatrixBase::cross3)
  • генерации ортогональных векторов (MatrixBase::unitOrthogonal)
  • некоторых линейных компонентов: параметризованные линии и гиперплоскости
  • объёмные прямоугольники
  • сопоставление преобразований методом наименьших квадратов
#include <Eigen/Geometry>
Глобальные псевдонимы для объёмных прямоугольников
класс Eigen::AlignedBox< _Scalar, _AmbientDim >
Объёмный прямоугольник. Подробнее...
класс Eigen::AngleAxis< _Scalar >
Представляет 3D вращение как угол вращения вокруг произвольной 3D оси. Подробнее...
класс Eigen::Homogeneous< MatrixType, _Direction >
Выражение одного (или набора) однородного вектора(ов) Подробнее...
класс Eigen::Hyperplane< _Scalar, _AmbientDim, _Options >
Гиперплоскость. Подробнее...
класс Eigen::Map< const Quaternion< _Scalar >, _Options >
Картирование кватерниона из постоянного буфера памяти. Подробнее...
класс Eigen::Map< Quaternion< _Scalar >, _Options >
Выражение кватерниона из буфера памяти. Подробнее...
класс Eigen::ParametrizedLine< _Scalar, _AmbientDim, _Options >
Параметризованная линия. Подробнее...
класс Eigen::Quaternion< _Scalar, _Options >
Класс кватернионов для представления 3D ориентаций и вращений. Подробнее...
класс Eigen::QuaternionBase< Derived >
Базовый класс для выражений кватернионов. Подробнее...
класс Eigen::Rotation2D< _Scalar >
Представляет вращение/ориентацию в двумерном пространстве. Подробнее...
класс Eigen::Transform< _Scalar, _Dim, _Mode, _Options >
Представляет однородное преобразование в N-мерном пространстве. Подробнее...
класс Eigen::Translation< _Scalar, _Dim >
Представляет сдвиговое преобразование. Подробнее...
класс Eigen::UniformScaling< _Scalar >
Представляет масштабирование с одинаковым коэффициентом. Подробнее...
typedef AngleAxis< double > Eigen::AngleAxisd
typedef AngleAxis< float > Eigen::AngleAxisf
typedef Quaternion< double > Eigen::Quaterniond
typedef Quaternion< float > Eigen::Quaternionf
typedef Map< Quaternion< double >, Aligned > Eigen::QuaternionMapAlignedd
typedef Map< Quaternion< float >, Aligned > Eigen::QuaternionMapAlignedf
typedef Map< Quaternion< double >, 0 > Eigen::QuaternionMapd
typedef Map< Quaternion< float >, 0 > Eigen::QuaternionMapf
typedef Rotation2D< double > Eigen::Rotation2Dd
typedef Rotation2D< float > Eigen::Rotation2Df
template<typename OtherDerived >
PlainObject Eigen::MatrixBase< Derived >::cross (const MatrixBase< OtherDerived > &other) const
template<typename OtherDerived >
const CrossReturnType Eigen::VectorwiseOp< ExpressionType, Direction >::cross (const MatrixBase< OtherDerived > &other) const
template<typename OtherDerived >
PlainObject Eigen::MatrixBase< Derived >::cross3 (const MatrixBase< OtherDerived > &other) const
Matrix< Scalar, 3, 1 > Eigen::MatrixBase< Derived >::eulerAngles (Index a0, Index a1, Index a2) const
const HNormalizedReturnType Eigen::MatrixBase< Derived >::hnormalized () const
однородная нормализация Подробнее...
const HNormalizedReturnType Eigen::VectorwiseOp< ExpressionType, Direction >::hnormalized () const
Столбцовая или строчная однородная нормализация Подробнее...
HomogeneousReturnType Eigen::MatrixBase< Derived >::homogeneous () const
HomogeneousReturnType Eigen::VectorwiseOp< ExpressionType, Direction >::homogeneous () const
template<typename Derived , typename OtherDerived >
internal::umeyama_transform_matrix_type< Derived, OtherDerived >::type Eigen::umeyama (const MatrixBase< Derived > &src, const MatrixBase< OtherDerived > &dst, bool with_scaling=true)
Возвращает преобразование между двумя множествами точек. Подробнее...
PlainObject Eigen::MatrixBase< Derived >::unitOrthogonal (void) const

AngleAxisd

typedef AngleAxis<double> Eigen::AngleAxisd

тип angle-axis с двойной точностью

AngleAxisf

typedef AngleAxis<float> Eigen::AngleAxisf

тип angle-axis с одинарной точностью

Quaterniond

typedef Quaternion<double> Eigen::Quaterniond

тип кватерниона с двойной точностью

Quaternionf

typedef Quaternion<float> Eigen::Quaternionf

тип кватерниона с одинарной точностью

QuaternionMapAlignedd

typedef Map<Quaternion<double>, Aligned> Eigen::QuaternionMapAlignedd

Отображение 16-байтового выровненного массива скаляров с двойной точностью как кватерниона

QuaternionMapAlignedf

typedef Map<Quaternion<float>, Aligned> Eigen::QuaternionMapAlignedf

Отображение 16-байтового выровненного массива скаляров с одинарной точностью как кватерниона

QuaternionMapd

typedef Map<Quaternion<double>, 0> Eigen::QuaternionMapd

Отображение невыровненного массива скаляров с двойной точностью как кватерниона

QuaternionMapf

typedef Map<Quaternion<float>, 0> Eigen::QuaternionMapf

Отображение невыровненного массива скаляров с одинарной точностью как кватерниона

Rotation2Dd

typedef Rotation2D<double> Eigen::Rotation2Dd

тип 2D вращения с двойной точностью

Rotation2Df

typedef Rotation2D<float> Eigen::Rotation2Df

тип 2D вращения с одинарной точностью

cross() [1/2]

template<typename Derived >
template<typename OtherDerived >
MatrixBase< Derived >::PlainObject Eigen::MatrixBase< Derived >::cross ( const MatrixBase< OtherDerived > & other ) const
inline

Это определено в модуле Geometry.

#include <Eigen/Geometry> 
Возвращает
векторное произведение векторов *this и other

Вот очень хорошее объяснение векторного произведения: http://xkcd.com/199/

Для комплексных чисел векторное произведение реализуется как \( (\mathbf{a}+i\mathbf{b}) \times (\mathbf{c}+i\mathbf{d}) = (\mathbf{a} \times \mathbf{c} - \mathbf{b} \times \mathbf{d}) - i(\mathbf{a} \times \mathbf{d} - \mathbf{b} \times \mathbf{c})\)

См. также
MatrixBase::cross3()

cross() [2/2]

template<typename ExpressionType , int Direction>
template<typename OtherDerived >
const VectorwiseOp< ExpressionType, Direction >::CrossReturnType Eigen::VectorwiseOp< ExpressionType, Direction >::cross ( const MatrixBase< OtherDerived > & other ) const

Это определено в модуле Geometry.

#include <Eigen/Geometry> 
Возвращает
матричное выражение векторного произведения каждой колонки или строки указанного выражения с вектором other.

Указанная матрица должна иметь размерность, равную 3. Результирующая матрица имеет те же размеры, что и указанная.

См. также
MatrixBase::cross()

cross3()

шаблон<typename Derived >
шаблон<typename OtherDerived >
MatrixBase< Derived >::PlainObject Eigen::MatrixBase< Derived >::cross3 ( const MatrixBase< OtherDerived > & other ) const
inline

Это определено в модуле Geometry.

#include <Eigen/Geometry> 
Возвращает
векторное произведение *this и other, используя только коэффициенты x, y и z

Размер *this и other должен быть четыре. Эта функция особенно полезна при использовании 4D векторов вместо 3D, чтобы получить преимущества векторной оптимизации SSE/AltiVec.

См. также
MatrixBase::cross()

eulerAngles()

шаблон<typename Derived >
Matrix< typename MatrixBase< Derived >::Scalar, 3, 1 > Eigen::MatrixBase< Derived >::eulerAngles ( Index a0,
Index a1,
Index a2
) const
inline

Это определено в модуле Geometry.

#include <Eigen/Geometry> 
Возвращает
углы Эйлера матрицы вращения *this, используя соглашение, заданное тройкой (a0,a1,a2)

Каждый из трёх параметров a0,a1,a2 представляет соответствующую ось вращения как целое число из {0,1,2}. Например, в:

Vector3f ea = mat.eulerAngles(2, 0, 2); 

"2" представляет ось z, а "0" ось x и т. д.

Возвращаемые углы таковы, что у нас есть следующее равенство:

mat == AngleAxisf(ea[0], Vector3f::UnitZ())
     * AngleAxisf(ea[1], Vector3f::UnitX())
     * AngleAxisf(ea[2], Vector3f::UnitZ()); 

Это соответствует соглашениям правого умножения (с правыми системами координат).

Возвращаемые углы находятся в диапазонах [0:pi]x[-pi:pi]x[-pi:pi].

См. также
класс AngleAxis

hnormalized() [1/2]

шаблон<typename Derived >
const MatrixBase< Derived >::HNormalizedReturnType Eigen::MatrixBase< Derived >::hnormalized
inline

гомогенная нормализация

Это определено в модуле Geometry.

#include <Eigen/Geometry> 
Возвращает
выражение вектора первых N-1 коэффициентов *this, деленное на последний коэффициент.

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

По существу, это сокращение для:

this->head(this->size()-1)/this->coeff(this->size()-1);

Пример:

Vector4d v = Vector4d::Random();
Projective3d P(Matrix4d::Random());
cout << "v                   = " << v.transpose() << "]^T" << endl;
cout << "v.hnormalized()     = " << v.hnormalized().transpose() << "]^T" << endl;
cout << "P*v                 = " << (P*v).transpose() << "]^T" << endl;
cout << "(P*v).hnormalized() = " << (P*v).hnormalized().transpose() << "]^T" << endl;

Вывод:

v                   =   0.68 -0.211  0.566  0.597]^T
v.hnormalized()     =   1.14 -0.354  0.949]^T
P*v                 = 0.663 -0.16 -0.13  0.91]^T
(P*v).hnormalized() =  0.729 -0.176 -0.143]^T
См. также
VectorwiseOp::hnormalized()

hnormalized() [2/2]

шаблон<typename ExpressionType , int Direction>
const VectorwiseOp< ExpressionType, Direction >::HNormalizedReturnType Eigen::VectorwiseOp< ExpressionType, Direction >::hnormalized
inline

столбцовая или строчная гомогенная нормализация

Это определено в модуле Geometry.

#include <Eigen/Geometry> 
Возвращает
выражение первых N-1 коэффициентов каждого столбца (или строки) *this, делённых на последний коэффициент каждого столбца (или строки).

Это концептуально эквивалентно вызову MatrixBase::hnormalized() для каждого столбца (или строки) *this.

Пример:

Matrix4Xd M = Matrix4Xd::Random(4,5);
Projective3d P(Matrix4d::Random());
cout << "The matrix M is:" << endl << M << endl << endl;
cout << "M.colwise().hnormalized():" << endl << M.colwise().hnormalized() << endl << endl;
cout << "P*M:" << endl << P*M << endl << endl;
cout << "(P*M).colwise().hnormalized():" << endl << (P*M).colwise().hnormalized() << endl << endl;

Вывод:

The matrix M is:
   0.68   0.823  -0.444   -0.27   0.271
 -0.211  -0.605   0.108  0.0268   0.435
  0.566   -0.33 -0.0452   0.904  -0.717
  0.597   0.536   0.258   0.832   0.214

M.colwise().hnormalized():
  1.14   1.53  -1.72 -0.325   1.27
-0.354  -1.13  0.419 0.0322   2.03
 0.949 -0.614 -0.175   1.09  -3.35

P*M:
  0.186  -0.589   0.369    1.33   -1.23
 -0.871  -0.337   0.127  -0.715   0.091
 -0.158 -0.0104   0.312   0.429  -0.478
  0.992   0.777  -0.373   0.468  -0.651

(P*M).colwise().hnormalized():
  0.188  -0.759  -0.989    2.85    1.89
 -0.877  -0.433  -0.342   -1.53   -0.14
  -0.16 -0.0134  -0.837   0.915   0.735

См. также
MatrixBase::hnormalized()

homogeneous() [1/2]

шаблон<typename Derived >
MatrixBase< Derived >::HomogeneousReturnType Eigen::MatrixBase< Derived >::homogeneous
inline

Это определено в модуле Geometry.

#include <Eigen/Geometry> 
Возвращает
выражение вектора, на один элемент длиннее аргумента вектора, с символично добавленным значением 1 в качестве последнего коэффициента.

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

Это только для векторов (строковых или столбцовых векторов), т.е. для матриц, которые известны во время компиляции, как имеющие одну строку или один столбец.

Пример:

Vector3d v = Vector3d::Random(), w;
Projective3d P(Matrix4d::Random());
cout << "v                                   = [" << v.transpose() << "]^T" << endl;
cout << "h.homogeneous()                     = [" << v.homogeneous().transpose() << "]^T" << endl;
cout << "(P * v.homogeneous())               = [" << (P * v.homogeneous()).transpose() << "]^T" << endl;
cout << "(P * v.homogeneous()).hnormalized() = [" << (P * v.homogeneous()).eval().hnormalized().transpose() << "]^T" << endl;

Вывод:

v                                   = [  0.68 -0.211  0.566]^T
h.homogeneous()                     = [  0.68 -0.211  0.566      1]^T
(P * v.homogeneous())               = [  1.27  0.772 0.0154 -0.419]^T
(P * v.homogeneous()).hnormalized() = [  -3.03   -1.84 -0.0367]^T
См. также
VectorwiseOp::homogeneous(), класс Homogeneous

homogeneous() [2/2]

шаблон<typename ExpressionType , int Direction>
Homogeneous< ExpressionType, Direction > Eigen::VectorwiseOp< ExpressionType, Direction >::homogeneous
inline

Это определено в модуле Geometry.

#include <Eigen/Geometry> 
Возвращает
выражение, где значение 1 символично добавляется в качестве конечного коэффициента к каждому столбцу (или строке) матрицы.

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

Пример:

Matrix3Xd M = Matrix3Xd::Random(3,5);
Projective3d P(Matrix4d::Random());
cout << "The matrix M is:" << endl << M << endl << endl;
cout << "M.colwise().homogeneous():" << endl << M.colwise().homogeneous() << endl << endl;
cout << "P * M.colwise().homogeneous():" << endl << P * M.colwise().homogeneous() << endl << endl;
cout << "P * M.colwise().homogeneous().hnormalized(): " << endl << (P * M.colwise().homogeneous()).colwise().hnormalized() << endl << endl;

Вывод:

The matrix M is:
   0.68   0.597   -0.33   0.108   -0.27
 -0.211   0.823   0.536 -0.0452  0.0268
  0.566  -0.605  -0.444   0.258   0.904

M.colwise().homogeneous():
   0.68   0.597   -0.33   0.108   -0.27
 -0.211   0.823   0.536 -0.0452  0.0268
  0.566  -0.605  -0.444   0.258   0.904
      1       1       1       1       1

P * M.colwise().homogeneous():
0.0832 -0.477  -1.21 -0.545 -0.452
 0.998  0.779  0.695  0.894  0.277
-0.271 -0.608 -0.895 -0.544 -0.874
-0.728 -0.551  0.202  -0.21 -0.469

P * M.colwise().homogeneous().hnormalized(): 
-0.114  0.866     -6    2.6  0.962
 -1.37  -1.41   3.44  -4.27 -0.591
 0.373    1.1  -4.43    2.6   1.86

См. также
MatrixBase::homogeneous(), класс Homogeneous

umeyama()

шаблон<typename Derived , typename OtherDerived >
internal::umeyama_transform_matrix_type<Derived, OtherDerived>::type Eigen::umeyama ( const MatrixBase< Derived > & src,
const MatrixBase< OtherDerived > & dst,
bool with_scaling = true
)

Возвращает преобразование между двумя наборами точек.

Это определено в модуле Geometry.

#include <Eigen/Geometry> 

Алгоритм основан на: "Оценивание параметров преобразования методом наименьших квадратов между двумя наборами точек", Shinji Umeyama, PAMI 1991, DOI: 10.1109/34.88573

Он оценивает параметры \( c, \mathbf{R}, \) и \( \mathbf{t} \) такие, что

\begin{align*} \frac{1}{n} \sum_{i=1}^n \vert\vert y_i - (c\mathbf{R}x_i + \mathbf{t}) \vert\vert_2^2 \end{align*}

минимизируется.

Алгоритм основан на анализе ковариационной матрицы \( \Sigma_{\mathbf{x}\mathbf{y}} \in \mathbb{R}^{d \times d} \) входных наборов точек \( \mathbf{x} \) и \( \mathbf{y} \), где \(d\) соответствует размерности (которая обычно мала). Анализ включает SVD, имеющий сложность \(O(d^3)\), хотя фактические вычислительные затраты лежат в вычислении ковариационной матрицы, которая имеет асимптотическую нижнюю границу \(O(dm)\) при входных наборах точек размерности \(d \times m\).

В настоящее время метод работает только для матриц с плавающей точкой.

Параметры
src Точки источника \( \mathbf{x} = \left( x_1, \hdots, x_n \right) \).
dst Точки назначения \( \mathbf{y} = \left( y_1, \hdots, y_n \right) \).
with_scaling Устанавливает \( c=1 \), когда false передаётся.
Возвращает
Гомогенное преобразование

\begin{align*} T = \begin{bmatrix} c\mathbf{R} & \mathbf{t} \\ \mathbf{0} & 1 \end{bmatrix} \end{align*}

минимизирующее остаток выше. Это преобразование всегда возвращается как Eigen::Matrix.

unitOrthogonal()

template<typename Derived >
MatrixBase< Derived >::PlainObject Eigen::MatrixBase< Derived >::unitOrthogonal ( void ) const
inline

Это определено в модуле Geometry.

#include <Eigen/Geometry> 
Возвращает
вектор единичной длины, ортогональный к *this

Размер *this должен быть не меньше 2. Если размер равен точно 2, то возвращаемый вектор представляет собой против часовой стрелки поворот *this, т. е. (-y,x).normalized().

См. также
cross()

© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/group__Geometry__Module.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API