Go to the documentation of this file.00001
00011
00012
00013
00014
00015 #ifndef ECL_GEOMETRY_HOMOGENEOUS_POINT_HPP_
00016 #define ECL_GEOMETRY_HOMOGENEOUS_POINT_HPP_
00017
00018
00019
00020
00021
00022 #include <ecl/mpl.hpp>
00023 #include <ecl/type_traits.hpp>
00024
00025 #include <ecl/config/macros.hpp>
00026 #include <ecl/exceptions/standard_exception.hpp>
00027 #include <ecl/linear_algebra.hpp>
00028 #include <ecl/math.hpp>
00029
00030
00031
00032
00033
00034 namespace ecl {
00035
00036
00037
00038
00045 template <typename T, typename Enable = void>
00046 class HomogeneousPoint : public ecl::FailedObject {};
00047
00055 template<typename T>
00056 class HomogeneousPoint<T, typename ecl::enable_if< ecl::is_float<T> >::type> {
00057 public:
00058 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00062 HomogeneousPoint(const T &value = T()) {
00063 elements.template block<3,1>(0,0) = ecl::linear_algebra::Matrix<T,3,1>::Constant(value);
00064 elements(3,0) = 1.0;
00065 }
00074 HomogeneousPoint(const ecl::linear_algebra::Matrix<T,3,1> &vec) {
00075 elements.template block<3,1>(0,0) = vec;
00076 elements[3] = 1.0;
00077 }
00085 HomogeneousPoint(const ecl::linear_algebra::Matrix<T,4,1> &vec) : elements(vec) {
00086 ecl_assert_throw(elements[3] == 1.0, ecl::StandardException(LOC,ecl::InvalidInputError));
00087 }
00095 HomogeneousPoint(const T &x_i, const T &y_i, const T &z_i) {
00096 elements << x_i, y_i, z_i, 1.0;
00097 }
00098
00099 virtual ~HomogeneousPoint() {}
00100
00101
00102
00103
00117 ecl::linear_algebra::CommaInitializer< ecl::linear_algebra::Matrix<T,4,1> > operator<<(const T &value) {
00118 return elements.operator<<(value);
00119 }
00120
00128 ecl::linear_algebra::Matrix<T,4,1>& positionVector() { return elements; }
00129
00137 const ecl::linear_algebra::Matrix<T,4,1>& positionVector() const { return elements; }
00138
00144 const T& x() const { return elements[0]; }
00150 const T& y() const { return elements[1]; }
00156 const T& z() const { return elements[2]; }
00162 T x() { return elements[0]; }
00168 T y() { return elements[1]; }
00174 T z() { return elements[2]; }
00175
00176 void x(const T& value) { elements[0] = value; }
00177 void y(const T& value) { elements[1] = value; }
00178 void z(const T& value) { elements[2] = value; }
00180 template <typename OutputStream, typename Type>
00181 friend OutputStream& operator<<(OutputStream &ostream , const HomogeneousPoint<Type> &point);
00182
00183 private:
00184 ecl::linear_algebra::Matrix<T,4,1> elements;
00185 };
00186
00187 typedef HomogeneousPoint<float> HomogeneousPointf;
00188 typedef HomogeneousPoint<double> HomogeneousPointd;
00190
00191
00192
00200 template <typename OutputStream, typename Type>
00201 OutputStream& operator<<(OutputStream &ostream , const HomogeneousPoint<Type> &point) {
00202 ostream << "[ " << point.x() << " " << point.y() << " " << point.z() << " ]";
00203 return ostream;
00204 }
00205 }
00206
00207 #endif