|
Geometry : |
Subject: [ggl] Clipping/Intersecting efficiency
From: Barend Gehrels (Barend.Gehrels)
Date: 2009-05-29 04:12:28
Hi Chris,
Welcome to the list!
> Profiling my application (Merkaartor, which uses, notably, ggl to do
> linestring clipping), I came to realize that clipping takes about 70%
> of the time it takes to draw a frame!
That is too bad indeed.
>
> 2 reasons for that:
>
> 1) My "linestrings" are vectors of POINTERS to points.
> I didn't find a way to use pointers as valid point_2D, so I have to
> recreate a linestring_2D before intersecting -> malloc -> poor
> performance.
> Is there a way to use a std::vector<point*> as a linestring?
That must be possible, using traits classes. You have to register a
point* as a valid point, implementing the traits classes with access
methods to get and set the coordinates. c01_custom_point_example.cpp is
an example, but there are registration macro's used, probably you cannot
use those. So then it will be something like (from a sample with a 3D
point "my_color" with fields red,green,blue):
namespace ggl { namespace traits {
template<> struct tag<my_color>
{ typedef point_tag type; };
template<> struct coordinate_type<my_color>
{ typedef double type; };
template<> struct coordinate_system<my_color>
{ typedef cs::cartesian type; };
template<> struct dimension<my_color>
: boost::mpl::int_<3> {};
template<>
struct access<my_color>
{
template <std::size_t I>
static double get(const my_color& p)
{
return I == 0 ? p.red : I == 1 ? p.green : p.blue;
// Or implement an accessor with specializations
}
template <int I>
static void set(my_color& p, const double& value)
{
// Or (better) implement an accessor with specializations
if (I == 0) p.red = value;
else if (I == 1) p.green = value;
else if (I == 2) p.blue = value;
}
};
}} // namespace ggl::traits
(If you have your sources from boost, replace ggl:: by geometry::, this
is from the new version).
If you need help with it I can create another sample with a point* or a
template-wrapper around a point*
> 2) intersecting uses outputstream to store its results. This again
> means malloc -> poor performances.
> Would it be possible to have an option to use a callback function
> returning the ordered result?
The output iterator is the most generic option. The first version
outputted to a multi-line, but now programmers can decide themselves
what to do with it (multi-line, console, etc). However, it internally
has to append points to lines. It is probably also possible to
specialize also that one for specific situations -> this will probably
have the same effect as a callback.
>
> Other programming practice suggestions are obviously welcome.
Having the point* (or a template-wrapper around it) registered as a
point, and a vector<point*> as a linestring, you should be able to call
all ggl-algorithms more naturally.
Regards, Barend
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/ggl/attachments/20090529/038dccf7/attachment.html
Geometry list run by mateusz at loskot.net