Implement find_points_on_line().

This commit is contained in:
Hermann Kraus 2012-08-02 17:53:02 +02:00
parent 0c90f0f22b
commit b062af211a
3 changed files with 99 additions and 11 deletions

View file

@ -0,0 +1,61 @@
#ifndef MAPNIK_PATH_PROCESSOR_HPP
#define MAPNIK_PATH_PROCESSOR_HPP
//mapnik
#include "pixel_position.hpp"
// agg
#include "agg_path_length.h"
namespace mapnik
{
template <typename T>
class path_processor
{
public:
path_processor(T &path)
: path_(path), length_(agg::path_length(path_)), valid_(true)
{
rewind();
}
double length() const { return length_ ;}
bool next()
{
if (!valid_) return false;
valid_ = path_.vertex(&current_point_.x, &current_point_.y);
return valid_;
}
pixel_position const& current_point() const
{
return current_point_;
}
void rewind()
{
path_.rewind(0);
valid_ = true;
}
bool valid() const { return valid_; }
/** Skip a certain amount of space.
*
* This function automatically calculates new points if the position is not exactly
* on a point on the path.
*/
bool skip(double length)
{
//TODO
return valid_;
}
private:
T &path_;
double length_;
bool valid_;
pixel_position current_point_;
};
}
#endif // PATH_PROCESSOR_HPP

View file

@ -32,6 +32,7 @@
//stl
#include <vector>
#include <list>
//boost
#include <boost/utility.hpp>
@ -85,7 +86,8 @@ private:
};
typedef boost::shared_ptr<glyph_positions> glyph_positions_ptr;
struct text_symbolizer_properties;
typedef std::list<glyph_positions_ptr> placements_list;
typedef boost::shared_ptr<placements_list> placements_list_ptr;
class placement_finder_ng : boost::noncopyable
{
@ -101,10 +103,10 @@ public:
glyph_positions_ptr find_point_placement(pixel_position pos);
/** Iterate over the given path, placing line-following labels with respect to label_spacing. */
template <typename T>
glyph_positions_ptr find_line_placements(T & path);
placements_list_ptr find_line_placements(T & path);
/** Iterate over the given path, placing point labels with respect to label_spacing. */
template <typename T>
glyph_positions_ptr find_point_on_line_placements(T & path);
placements_list_ptr find_point_on_line_placements(T & path);
/** Try next position alternative from placement_info. */
bool next_position();
private:

View file

@ -26,6 +26,7 @@
#include <mapnik/debug.hpp>
#include <mapnik/label_collision_detector.hpp>
#include <mapnik/ctrans.hpp>
#include <mapnik/path_processor.hpp>
//boost
#include <boost/make_shared.hpp>
@ -222,15 +223,39 @@ glyph_positions_ptr placement_finder_ng::find_point_placement(pixel_position pos
template <typename T>
glyph_positions_ptr placement_finder_ng::find_point_on_line_placements(T & path)
placements_list_ptr placement_finder_ng::find_point_on_line_placements(T & path)
{
return glyph_positions_ptr();
path_processor<T> pp(path);
placements_list_ptr list = boost::make_shared<placements_list>();
if (!pp.valid() || !layout_.size()) return list;
if (pp.length() == 0.0)
{
list->push_back(find_point_placement(pp.current_point()));
return list;
}
int num_labels = 1;
if (info_->properties.label_spacing > 0)
num_labels = static_cast<int> (floor(pp.length() / info_->properties.label_spacing * scale_factor_));
if (info_->properties.force_odd_labels && num_labels % 2 == 0)
num_labels--;
if (num_labels <= 0)
num_labels = 1;
double spacing = pp.length() / num_labels;
pp.skip(spacing/2.); // first label should be placed at half the spacing
do
{
list->push_back(find_point_placement(pp.current_point()));
} while (pp.skip(spacing));
return list;
}
template <typename T>
glyph_positions_ptr placement_finder_ng::find_line_placements(T & path)
placements_list_ptr placement_finder_ng::find_line_placements(T & path)
{
return glyph_positions_ptr();
return placements_list_ptr();
}
@ -291,10 +316,10 @@ void glyph_positions::set_base_point(pixel_position base_point)
typedef agg::conv_clip_polyline<geometry_type> clipped_geometry_type;
typedef coord_transform<CoordTransform,clipped_geometry_type> ClippedPathType;
typedef coord_transform<CoordTransform,geometry_type> PathType;
template glyph_positions_ptr placement_finder_ng::find_point_on_line_placements<ClippedPathType>(ClippedPathType &);
template glyph_positions_ptr placement_finder_ng::find_line_placements<ClippedPathType>(ClippedPathType &);
template glyph_positions_ptr placement_finder_ng::find_point_on_line_placements<PathType>(PathType &);
template glyph_positions_ptr placement_finder_ng::find_line_placements<PathType>(PathType &);
template placements_list_ptr placement_finder_ng::find_point_on_line_placements<ClippedPathType>(ClippedPathType &);
template placements_list_ptr placement_finder_ng::find_line_placements<ClippedPathType>(ClippedPathType &);
template placements_list_ptr placement_finder_ng::find_point_on_line_placements<PathType>(PathType &);
template placements_list_ptr placement_finder_ng::find_line_placements<PathType>(PathType &);
}// ns mapnik