14 #ifndef ECL_GEOMETRY_CARTESIAN_POINT_HPP_ 15 #define ECL_GEOMETRY_CARTESIAN_POINT_HPP_ 21 #include <ecl/config/macros.hpp> 22 #include <ecl/exceptions/standard_exception.hpp> 23 #include <ecl/linear_algebra.hpp> 24 #include <ecl/math.hpp> 45 template <
typename T,
unsigned int N>
57 CartesianPoint(
const ecl::linear_algebra::Matrix<T,N,1> &point_vector) : elements(point_vector) {}
75 ecl::linear_algebra::CommaInitializer< ecl::linear_algebra::Matrix<T,N,1> >
operator<<(
const T &value) {
76 return elements.operator<<(value);
88 return elements[index];
100 return elements[index];
113 ecl::linear_algebra::Matrix<T,N,1>& positionVector() {
return elements; }
121 const ecl::linear_algebra::Matrix<T,N,1>& positionVector()
const {
return elements; }
123 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
126 ecl::linear_algebra::Matrix<T,N,1> elements;
155 CartesianPoint(
const ecl::linear_algebra::Matrix<T,3,1> &vec) : elements(vec) {}
163 CartesianPoint(
const T &x_i,
const T &y_i,
const T &z_i) {
164 elements << x_i, y_i, z_i;
167 virtual ~CartesianPoint() {}
185 ecl::linear_algebra::CommaInitializer< ecl::linear_algebra::Matrix<T,3,1> >
operator<<(
const T &value) {
186 return elements.operator<<(value);
196 ecl::linear_algebra::Matrix<T,3,1>& positionVector() {
return elements; }
205 const ecl::linear_algebra::Matrix<T,3,1>& positionVector()
const {
return elements; }
214 unsigned int size() {
return 3; }
221 const T&
x()
const {
return elements[0]; }
227 const T&
y()
const {
return elements[1]; }
233 const T&
z()
const {
return elements[2]; }
239 T
x() {
return elements[0]; }
245 T
y() {
return elements[1]; }
251 T
z() {
return elements[2]; }
253 void x(
const T& value) { elements[0] = value; }
254 void y(
const T& value) { elements[1] = value; }
255 void z(
const T& value) { elements[2] = value; }
257 template <
typename OutputStream,
typename Type>
258 friend OutputStream& operator<<(OutputStream &ostream , const CartesianPoint<Type,3> &point);
261 ecl::linear_algebra::Matrix<T,3,1> elements;
278 template <
typename OutputStream,
typename Type>
279 OutputStream& operator<<(OutputStream &ostream , const CartesianPoint<Type,3> &point) {
280 ostream <<
"[ " << point.x() <<
" " << point.y() <<
" " << point.z() <<
" ]";
304 CartesianPoint(
const T &
value = T()) : elements(ecl::linear_algebra::Matrix<T,2,1>::Constant(
value)) {}
310 CartesianPoint(
const ecl::linear_algebra::Matrix<T,2,1> &vec) : elements(vec) {}
318 CartesianPoint(
const T &x_i,
const T &y_i) {
319 elements << x_i, y_i;
322 virtual ~CartesianPoint() {}
340 ecl::linear_algebra::CommaInitializer< ecl::linear_algebra::Matrix<T,2,1> >
operator<<(
const T &
value) {
341 return elements.operator<<(value);
346 return elements[index];
351 return elements[index];
366 ecl::linear_algebra::Matrix<T,2,1>& positionVector() {
return elements; }
375 const ecl::linear_algebra::Matrix<T,2,1>& positionVector()
const {
return elements; }
384 unsigned int size() {
return 2; }
391 const T&
x()
const {
return elements[0]; }
397 const T&
y()
const {
return elements[1]; }
403 T
x() {
return elements[0]; }
409 T
y() {
return elements[1]; }
413 if( other.
x() !=
x() || other.
y() !=
y() )
return false;
419 if( other.
x() !=
x() || other.
y() !=
y() )
return true;
425 double c = cos(angle);
426 double s = sin(angle);
427 double tx =
x()*c -
y()*s;
428 double ty =
x()*s +
y()*c;
434 double get_angle(
void)
436 return atan2(
y(),
x() );
446 ecl::linear_algebra::Matrix<T,2,1> temp_element = elements - other.
positionVector();
447 return static_cast<T
>( sqrt( temp_element[0]*temp_element[0]+temp_element[1]*temp_element[1]) );
454 if ( mag == static_cast<T>(0) )
460 elements[0] *= (1.0/mag);
461 elements[1] *= (1.0/mag);
487 void x(
const T& value) { elements[0] = value; }
488 void y(
const T& value) { elements[1] = value; }
490 template <
typename OutputStream,
typename Type>
491 friend OutputStream& operator<<(OutputStream &ostream , const CartesianPoint<Type,2> &point);
493 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
496 ecl::linear_algebra::Matrix<T,2,1> elements;
513 template <
typename OutputStream,
typename Type>
514 OutputStream& operator<<(OutputStream &ostream , const CartesianPoint<Type,2> &point) {
515 ostream <<
"[ " << point.x() <<
" " << point.y() <<
" ]";
CartesianPoint< float, 3 > CartesianPoint3f
ecl::linear_algebra::Matrix< T, 2, 1 > & positionVector()
CartesianPoint< double, 2 > CartesianPoint2d
Specialisation for a cartesian point of dimension 2.
#define LOC
Stringify the line of code you are at.
CartesianPoint< double, 3 > CartesianPoint3d
OutputStream & operator<<(OutputStream &ostream, const Void void_object)
Output stream operator for Void objects.
TFSIMD_FORCE_INLINE const tfScalar & y() const
TFSIMD_FORCE_INLINE tfScalar angle(const Quaternion &q1, const Quaternion &q2)
#define ecl_assert_throw(expression, exception)
Debug mode throw with a logical condition check.
Standard exception type, provides code location and error string.
CartesianPoint< int, 3 > CartesianPoint3i
TFSIMD_FORCE_INLINE const tfScalar & x() const
Functor for euclidean norms.
TFSIMD_FORCE_INLINE const tfScalar & z() const
ecl_geometry_PUBLIC int size(const Trajectory2D &trajectory)
#define ecl_assert_throw_decl(exception)
Assure throw exception declaration.
const GenericPointer< typename T::ValueType > T2 value
TFSIMD_FORCE_INLINE Vector3 rotate(const Vector3 &wAxis, const tfScalar angle) const
Generic container storing a cartesian point of dimension N.
CartesianPoint< float, 2 > CartesianPoint2f
CartesianPoint< int, 2 > CartesianPoint2i
ecl_geometry_PUBLIC double distance(const Pose2D &pose, const Trajectory2D &trajectory)