Модуль геометрии
Этот модуль предоставляет поддержку для:
- однородных преобразований фиксированного размера
- перевода, масштабирования, 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]
| 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]
| const VectorwiseOp< ExpressionType, Direction >::CrossReturnType Eigen::VectorwiseOp< ExpressionType, Direction >::cross | ( | const MatrixBase< OtherDerived > & | other | ) | const |
Это определено в модуле Geometry.
#include <Eigen/Geometry>
- Возвращает
- матричное выражение векторного произведения каждой колонки или строки указанного выражения с вектором other.
Указанная матрица должна иметь размерность, равную 3. Результирующая матрица имеет те же размеры, что и указанная.
- См. также
- MatrixBase::cross()
cross3()
| inline |
Это определено в модуле Geometry.
#include <Eigen/Geometry>
- Возвращает
- векторное произведение
*thisи other, используя только коэффициенты x, y и z
Размер *this и other должен быть четыре. Эта функция особенно полезна при использовании 4D векторов вместо 3D, чтобы получить преимущества векторной оптимизации SSE/AltiVec.
- См. также
- MatrixBase::cross()
eulerAngles()
| 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]
| 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]
| 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]
| 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]
| 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()
| 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()
| 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