oILAB
Loading...
Searching...
No Matches
Rotation.h
Go to the documentation of this file.
1//
2// Created by Nikhil Chandra Admal on 12/31/23.
3//
4
5#ifndef OILAB_ROTATION_H
6#define OILAB_ROTATION_H
7
8#include<Eigen/Eigen>
9#include<numbers>
10
11template<int dim>
12class Rotation : public Eigen::Matrix<double,dim,dim>
13{
14 template<int dm=dim>
15 typename std::enable_if<dm==2, Eigen::Matrix<double,dim,dim> >::type
16 static getMatrix(const Eigen::Matrix<double,dim,dim-1>& orthogonalVectors)
17 {
18 Eigen::Matrix<double,dim,dim> output;
19 output.row(0)= orthogonalVectors.col(0).normalized();
20 output.row(1)=Eigen::Rotation2D<double>(std::numbers::pi/2)*orthogonalVectors.col(0).normalized();
21 return output;
22 }
23 template<int dm=dim>
24 typename std::enable_if<dm==3, Eigen::Matrix<double,dim,dim> >::type
25 static getMatrix(const Eigen::Matrix<double,dim,dim-1>& orthogonalVectors)
26 {
27 assert(abs(orthogonalVectors.col(0).dot(orthogonalVectors.col(1))) < FLT_EPSILON);
28 Eigen::Matrix<double,dim,dim> output;
29 output.row(0)= orthogonalVectors.col(0).normalized();
30 output.row(1)= orthogonalVectors.col(1).normalized();
31 output.row(2)= (output.row(0).cross(output.row(1))).normalized();
32 return output;
33 }
34public:
35 Rotation(const Eigen::Matrix<double,dim,dim-1> orthogonalVectors) :
36 Eigen::Matrix<double,dim,dim>(getMatrix(orthogonalVectors))
37 {
38 }
39};
40#endif //OILAB_ROTATION_H
static std::enable_if< dm==2, Eigen::Matrix< double, dim, dim > >::type getMatrix(const Eigen::Matrix< double, dim, dim-1 > &orthogonalVectors)
Definition Rotation.h:16
static std::enable_if< dm==3, Eigen::Matrix< double, dim, dim > >::type getMatrix(const Eigen::Matrix< double, dim, dim-1 > &orthogonalVectors)
Definition Rotation.h:25
Rotation(const Eigen::Matrix< double, dim, dim-1 > orthogonalVectors)
Definition Rotation.h:35