23 template <
class TScalar>
25 -> Eigen::Vector2<TScalar> {
26 return foo_rotation_line.matrix().col(1);
34 template <
class TScalar>
38 normal_in_foo.squaredNorm() > kEpsilon<TScalar>,
40 normal_in_foo.transpose().eval());
41 normal_in_foo.normalize();
43 {normal_in_foo.y(), -normal_in_foo.x()});
49 template <
class TScalar>
51 -> Eigen::Vector3<TScalar> {
52 return foo_rotation_plane.matrix().col(2);
67 template <
class TScalar>
69 Eigen::Vector3<TScalar>
const& normal_in_foo,
70 Eigen::Vector3<TScalar> x_dir_hint_foo =
71 Eigen::Vector3<TScalar>(TScalar(1), TScalar(0), TScalar(0)),
72 Eigen::Vector3<TScalar> y_dir_hint_foo = Eigen::Vector3<TScalar>(
73 TScalar(0), TScalar(1), TScalar(0))) -> Eigen::Matrix3<TScalar> {
75 x_dir_hint_foo.dot(y_dir_hint_foo) < kEpsilon<TScalar>,
76 "xDirHint ({}) and yDirHint ({}) must be perpendicular.",
77 x_dir_hint_foo.transpose(),
78 y_dir_hint_foo.transpose());
81 TScalar
const x_dir_hint_foo_sqr_length = x_dir_hint_foo.squaredNorm();
82 TScalar
const y_dir_hint_foo_sqr_length = y_dir_hint_foo.squaredNorm();
83 TScalar
const normal_foo_sqr_length = normal_in_foo.squaredNorm();
85 x_dir_hint_foo_sqr_length > kEpsilon<TScalar>,
87 x_dir_hint_foo.transpose());
89 y_dir_hint_foo_sqr_length > kEpsilon<TScalar>,
91 y_dir_hint_foo.transpose());
93 normal_foo_sqr_length > kEpsilon<TScalar>,
95 normal_in_foo.transpose());
97 Eigen::Matrix3<TScalar> basis_foo;
98 basis_foo.col(2) = normal_in_foo;
100 if (abs(x_dir_hint_foo_sqr_length - TScalar(1)) > kEpsilon<TScalar>) {
101 x_dir_hint_foo.normalize();
103 if (abs(y_dir_hint_foo_sqr_length - TScalar(1)) > kEpsilon<TScalar>) {
104 y_dir_hint_foo.normalize();
106 if (abs(normal_foo_sqr_length - TScalar(1)) > kEpsilon<TScalar>) {
107 basis_foo.col(2).normalize();
110 TScalar abs_x_dot_z = abs(basis_foo.col(2).dot(x_dir_hint_foo));
111 TScalar abs_y_dot_z = abs(basis_foo.col(2).dot(y_dir_hint_foo));
112 if (abs_x_dot_z < abs_y_dot_z) {
114 basis_foo.col(1) = basis_foo.col(2).cross(x_dir_hint_foo).normalized();
115 basis_foo.col(0) = basis_foo.col(1).cross(basis_foo.col(2));
118 basis_foo.col(0) = y_dir_hint_foo.cross(basis_foo.col(2)).normalized();
119 basis_foo.col(1) = basis_foo.col(2).cross(basis_foo.col(0));
121 TScalar det = basis_foo.determinant();
127 "Determinant of basis is not 1, but {}. Basis is \n{}\n",
138 template <
class TScalar>
150 template <
class TScalar>
152 -> Eigen::Hyperplane<TScalar, 2> {
153 return Eigen::Hyperplane<TScalar, 2>(
155 foo_from_line.translation());
162 template <
class TScalar>
165 TScalar
const d = line_in_foo.offset();
166 Eigen::Vector2<TScalar>
const n = line_in_foo.normal();
176 template <
class TScalar>
178 -> Eigen::Hyperplane<TScalar, 3> {
179 return Eigen::Hyperplane<TScalar, 3>(
188 template <
class TScalar>
191 TScalar
const d = plane_in_foo.offset();
192 Eigen::Vector3<TScalar>
const n = plane_in_foo.normal();
200 template <
class TScalar,
int kMatrixDim>
202 -> Eigen::Hyperplane<TScalar, kMatrixDim> {
203 if (plane.offset() >= 0) {
207 return Eigen::Hyperplane<TScalar, kMatrixDim>(
208 -plane.normal(), -plane.offset());