14 #ifndef ECL_GEOMETRY_CARTESIAN_POINT_HPP_
15 #define ECL_GEOMETRY_CARTESIAN_POINT_HPP_
45 template <
typename T,
unsigned int N>
51 CartesianPoint(
const T &value = T()) : elements(
ecl::linear_algebra::
Matrix<T,N,1>::Constant(value)) {}
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);
86 T& operator [](
const unsigned int& index) {
88 return elements[index];
98 const T& operator [](
const unsigned int& index)
const {
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;
149 CartesianPoint(
const T &value = T()) : elements(ecl::linear_algebra::Matrix<T,3,1>::Constant(value)) {}
155 CartesianPoint(
const ecl::linear_algebra::Matrix<T,3,1> &vec) : elements(vec) {}
164 elements << x_i, y_i, z_i;
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>
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) {}
319 elements << x_i, y_i;
340 ecl::linear_algebra::CommaInitializer< ecl::linear_algebra::Matrix<T,2,1> >
operator<<(
const T &value) {
341 return elements.operator<<(value);
344 T& operator [](
const unsigned int& index) {
346 return elements[index];
349 const T operator [](
const unsigned int& index)
const {
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;
423 void rotate(
const double & angle )
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() );
439 void operator += (
const CartesianPoint<T,2> & other )
441 elements += other.positionVector();
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);
466 CartesianPoint<T,2> operator * (
double d)
const
468 return CartesianPoint<T,2>( elements*d );
471 CartesianPoint<T,2> operator + (
const CartesianPoint<T,2> &v)
const
473 return CartesianPoint<T,2>( x()+v.x(), y()+v.y() );
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>
515 ostream <<
"[ " << point.x() <<
" " << point.y() <<
" ]";