b2api
B2000++ API Reference Manual, VERSION 4.6
 
Loading...
Searching...
No Matches
b2referential.H
Go to the documentation of this file.
1//------------------------------------------------------------------------
2// b2referential.H --
3//
4//
5// written by Mathias Doreille
6//
7// Copyright (c) 2004-2012,2017
8// SMR Engineering & Development SA
9// 2502 Bienne, Switzerland
10//
11// All Rights Reserved. Proprietary source code. The contents of
12// this file may not be disclosed to third parties, copied or
13// duplicated in any form, in whole or in part, without the prior
14// written permission of SMR.
15//------------------------------------------------------------------------
16
17#ifndef __B2REFERENTIAL_H__
18#define __B2REFERENTIAL_H__
19
24#include "b2ppconfig.h"
25#include "utils/b2object.H"
26#include "utils/b2type.H"
27
28namespace b2000 {
29
38template <typename T>
40public:
42 Transformation3D() : identity(true), rot_identity(true) {
43 mat[0] = inv[0] = T(1);
44 mat[1] = inv[1] = T(0);
45 mat[2] = inv[2] = T(0);
46 mat[3] = inv[3] = T(0);
47 mat[4] = inv[4] = T(1);
48 mat[5] = inv[5] = T(0);
49 mat[6] = inv[6] = T(0);
50 mat[7] = inv[7] = T(0);
51 mat[8] = inv[8] = T(1);
52 mat[9] = inv[9] = T(0);
53 mat[10] = inv[10] = T(0);
54 mat[11] = inv[11] = T(0);
55 }
56
59 : identity(t.identity), rot_identity(t.rot_identity) {
60 if (!identity) {
61 std::copy(t.mat, t.mat + 12, mat);
62 std::copy(t.inv, t.inv + 12, inv);
63 }
64 }
65
79 const T rotation_matrix[9], const T translation_vector[3] = 0,
80 const bool invert = false) {
81 init(rotation_matrix, translation_vector, invert);
82 }
83
85 bool operator==(const Transformation3D& trans) const {
86 if (&trans == this) { return true; }
87 if (identity != trans.identity || rot_identity != trans.rot_identity) { return false; }
88 return std::equal(mat, mat + 12, trans.mat);
89 }
90
103 void init(
104 const T rotation_matrix[9], const T translation_vector[3] = 0,
105 const bool invert = false) {
106 T *m, *i;
107 if (invert) {
108 m = inv;
109 i = mat;
110 } else {
111 m = mat;
112 i = inv;
113 }
114
115 m[0] = rotation_matrix[0];
116 m[1] = rotation_matrix[3];
117 m[2] = rotation_matrix[6];
118 m[3] = rotation_matrix[1];
119 m[4] = rotation_matrix[4];
120 m[5] = rotation_matrix[7];
121 m[6] = rotation_matrix[2];
122 m[7] = rotation_matrix[5];
123 m[8] = rotation_matrix[8];
124 if (translation_vector) {
125 m[9] = translation_vector[0];
126 m[10] = translation_vector[1];
127 m[11] = translation_vector[2];
128 } else {
129 m[9] = 0.0;
130 m[10] = 0.0;
131 m[11] = 0.0;
132 }
133
134 compute_invert(i, m);
135
136 rot_identity = std::equal(mat, mat + 9, identity_transformation.get_rotation_matrix());
137 identity = rot_identity || std::equal(mat + 9, mat + 12, inv);
138 }
139
142 const T* get_rotation_matrix() const { return mat; }
143
146 const T* get_inv_rotation_matrix() const { return inv; }
147
149 const T* get_translation_vector() const { return mat + 9; }
150
153 const T* get_inv_translation_vector() const { return inv + 9; }
154
157 bool is_identity() const { return identity; }
158
161 bool is_rotation_identity() const { return rot_identity; }
162
165 static const Transformation3D& get_identity() { return identity_transformation; }
166
167private:
168 bool identity;
169 bool rot_identity;
170 T mat[12];
171 T inv[12];
172 static const Transformation3D identity_transformation;
173
174 static void compute_invert(T i[12], const T m[12]) {
175 double inv_det = 1.0
176 / (m[0] * (m[4] * m[8] - m[5] * m[7]) + m[1] * (m[5] * m[6] - m[3] * m[8])
177 + m[2] * (m[3] * m[7] - m[4] * m[6]));
178 i[0] = (m[4] * m[8] - m[5] * m[7]) * inv_det;
179 i[1] = (m[2] * m[7] - m[1] * m[8]) * inv_det;
180 i[2] = (m[1] * m[5] - m[2] * m[4]) * inv_det;
181 i[3] = (m[5] * m[6] - m[3] * m[8]) * inv_det;
182 i[4] = (m[0] * m[8] - m[2] * m[6]) * inv_det;
183 i[5] = (m[2] * m[3] - m[0] * m[5]) * inv_det;
184 i[6] = (m[3] * m[7] - m[4] * m[6]) * inv_det;
185 i[7] = (m[1] * m[6] - m[0] * m[7]) * inv_det;
186 i[8] = (m[0] * m[4] - m[1] * m[3]) * inv_det;
187 i[9] = -(i[0] * m[9] + i[1] * m[10] + i[2] * m[11]);
188 i[10] = -(i[3] * m[9] + i[4] * m[10] + i[5] * m[11]);
189 i[11] = -(i[6] * m[9] + i[7] * m[10] + i[8] * m[11]);
190 }
191};
192
193template <typename T>
194const Transformation3D<T> Transformation3D<T>::identity_transformation;
195
196} // namespace b2000
197
198#endif /* __B2REFERENTIAL_H__ */
Definition b2referential.H:39
Transformation3D()
Definition b2referential.H:42
bool is_rotation_identity() const
Definition b2referential.H:161
bool operator==(const Transformation3D &trans) const
Definition b2referential.H:85
const T * get_inv_rotation_matrix() const
Definition b2referential.H:146
Transformation3D(const Transformation3D &t)
Definition b2referential.H:58
bool is_identity() const
Definition b2referential.H:157
Transformation3D(const T rotation_matrix[9], const T translation_vector[3]=0, const bool invert=false)
Definition b2referential.H:78
const T * get_translation_vector() const
Definition b2referential.H:149
const T * get_inv_translation_vector() const
Definition b2referential.H:153
const T * get_rotation_matrix() const
Definition b2referential.H:142
static const Transformation3D & get_identity()
Definition b2referential.H:165
void init(const T rotation_matrix[9], const T translation_vector[3]=0, const bool invert=false)
Definition b2referential.H:103
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32