
Herewith the URL to the second preview of Geodan's Geometry Library, including documentation and examples.
Hello, Thanks for this submission, I have compiled and run successfully all the examples provided, and had a quick look at the documentation and implementation. What I've seen until now is quite convincing :-) Here are a few remarks... * I think a lot of people will most often choose to initialize their points to 0. Maybe it would be better if the default behavior was init_zero, and to have an additional "init_none" value in the "init" enum, that could be used explicitly when needed? If non-init is the default, I'm already afraid about all the "uninitialized value" bugs that programmers will mistakenly produce... * Maybe the parameterized constructor of point should be declared explicit, since implicitly converting a scalar to a point is likely to be an unintended error. * You could take advantage of the "dimension-agnosticness" of your point concept more than you're currently doing in your algorithms. For example, I have rewritten the pythagoras algorithm to make it dimension-agnostic, this way: template <typename P1, typename P2, size_t I, typename T> struct compute_pythagoras { static T result(const P1& p1, const P2& p2) { T d = p2.template value<I-1>() - p1.template value<I-1>(); return d*d + compute_pythagoras<P1, P2, I-1, T>::result(p1, p2); } }; template <typename P1, typename P2, typename T> struct compute_pythagoras<P1, P2, 0, T> { static T result(P1, P2) { return 0; } }; template <typename P1, typename P2 = P1> struct pythagoras { static inline bool squared() { return true; } inline distance_result operator()(const P1& p1, const P2& p2) const { typedef typename select_type_traits<typename P1::coordinate_type, typename P2::coordinate_type>::type T; return distance_result(compute_pythagoras<P1, P2, P1::coordinate_count, T>::result(p1, p2), true); } }; This way you can use pythagoras either with a point_xy or with other point classes of higher dimensions. I've quickly made up a point_xyz class and it worked perfectly after having defined a strategy for it. Every algorithm doesn't have to be that generic, sometimes it just doesn't make sense. But for the simplest ones, and if it's not too much effort, I think it's worth it. Regards Bruno