Hello all,
I am new to Boost library and I am trying to register our geometry types with boost. I am having trouble with LineString. Here is my sample that
I could reproduce the problem. Could someone please let me know what I am doing wrong? Thank you in advance.
#include
<iostream>
#include
<vector>
#include
<boost/assign/std/vector.hpp>
// for 'operator+=()'
#include
<boost/foreach.hpp>
#include
<boost/iterator/iterator_facade.hpp>
#include
<boost/range.hpp>
#include
<boost/geometry.hpp>
template<class
T>
class
QPoint
{
public:
T x;
T y;
QPoint(T x, T y) : x(x), y(y) {}
};
template<class
T>
class
QLineString
{
public:
bool cw;
std::vector<QPoint<T>>
points;
};
namespace boost
{
namespace geometry
{
namespace traits
{
// Adapt QPoint to Boost.Geometry
template<class
T> struct tag<QPoint<T>>
{
typedef point_tag type; };
template<class
T> struct coordinate_type<QPoint<T>>
{
typedef T type; };
template<class
T> struct coordinate_system<QPoint<T>>
{
typedef cs::cartesian type; };
template<class
T> struct dimension<QPoint<T>>
: boost::mpl::int_<2> {};
template<class
T>
struct access<QPoint<T>,
0>
{
static T get(QPoint<T>
const& p)
{
return p.x;
}
static
void
set(QPoint<T>&
p, T const& value)
{
p.x = value;
}
};
template<class
T>
struct access<QPoint<T>,
1>
{
static T get(QPoint<T>
const& p)
{
return p.y;
}
static
void
set(QPoint<T>&
p, T const& value)
{
p.y = value;
}
};
}
}
} // namespace boost::geometry::traits
namespace boost
{
namespace geometry
{
namespace traits
{
template<class
T>
struct tag<QLineString<T>>
{
typedef linestring_tag type;
};
}
}
} // namespace boost::geometry::traits
namespace boost
{
template <class
T>
struct range_iterator<QLineString<T>>
{ typedef std::vector<QPoint<T>>::iterator
type; };
template<class
T>
struct range_const_iterator<QLineString<T>>
{ typedef std::vector<QPoint<T>>::const_iterator
type; };
}
template<class
T>
inline std::vector<QPoint<T>>::iterator
range_begin(QLineString<T>& qls)
{
return qls.points.begin();
}
template<class
T>
inline std::vector<QPoint<T>>::iterator
range_end(QLineString<T>& qls)
{
return qls.points.end();
}
template<class
T>
inline std::vector<QPoint<T>>::const_iterator
range_begin(const
QLineString<T>& qls)
{
return qls.points.begin();
}
template<class
T>
inline std::vector<QPoint<T>>::const_iterator
range_end(const
QLineString<T>& qls)
{
return qls.points.end();
}
int main()
{
QPoint<int>
p(2,3);
QPoint<int>
p1(5,3);
QPoint<int>
p2(8,3);
QPoint<int>
p3(12,3);
QLineString<int>
ln;
ln.points.push_back(p);
ln.points.push_back(p1);
ln.points.push_back(p2);
ln.points.push_back(p3);
double length = boost::geometry::length(ln);
}
Thanks,
Suresh