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() << 
" ]";