midpoint calc for line strings
This commit is contained in:
parent
0875208c5b
commit
27a880fe99
1 changed files with 52 additions and 2 deletions
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue