midpoint calc for line strings

This commit is contained in:
Artem Pavlenko 2006-01-26 23:52:22 +00:00
parent 0875208c5b
commit 27a880fe99

View file

@ -25,7 +25,6 @@
#include "vertex_transform.hpp"
#include "ctrans.hpp"
#include "geom_util.hpp"
#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>
@ -242,7 +241,58 @@ namespace mapnik
}
void label_position(double *x, double *y) const
{
cont_.get_vertex(0,x,y);
// calculate mid point on line string
unsigned size = cont_.size();
if (size == 1)
{
cont_.get_vertex(0,x,y);
}
else if (size == 2)
{
double x0;
double y0;
double x1;
double y1;
cont_.get_vertex(0,&x0,&y0);
cont_.get_vertex(1,&x1,&y1);
*x = 0.5 * (x1 + x0);
*y = 0.5 * (y1 + y0);
}
else
{
double x0;
double y0;
double x1;
double y1;
double len=0.0;
for (unsigned pos = 1; pos < size; ++pos)
{
cont_.get_vertex(pos-1,&x0,&y0);
cont_.get_vertex(pos,&x1,&y1);
double dx = x1 - x0;
double dy = y1 - y0;
len += sqrt(dx * dx + dy * dy);
}
double midlen = 0.5 * len;
double dist = 0.0;
for (unsigned pos = 1; pos < size;++pos)
{
cont_.get_vertex(pos-1,&x0,&y0);
cont_.get_vertex(pos,&x1,&y1);
double dx = x1 - x0;
double dy = y1 - y0;
double seg_len = sqrt(dx * dx + dy * dy);
if (( dist + seg_len) >= midlen)
{
double r = (midlen - dist)/seg_len;
*x = x0 + (x1 - x0) * r;
*y = y0 + (y1 - y0) * r;
break;
}
dist += seg_len;
}
}
}
void line_to(value_type x,value_type y)
{