Skip to content

Commit b03ae30

Browse files
author
wonder
committed
Additional cost factor for line labels: penalize label positions further from the line's center.
Might need some tuning, but seems to choose more appropriate label positions now. git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@11310 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 8333949 commit b03ae30

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

src/core/pal/feature.cpp

+14-4
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,11 @@ void FeaturePart::removeDuplicatePoints()
571571
if ( cost > 0.98 )
572572
cost = 0.0001;
573573
else
574-
cost = ( 1 - cost ) / 100;
574+
cost = ( 1 - cost ) / 100; // < 0.0001, 0.01 > (but 0.005 is already pretty much)
575575

576+
// penalize positions which are further from the line's midpoint
577+
double costCenter = vabs( ll/2 - (l+xrm/2) ) / ll; // <0, 0.5>
578+
cost += costCenter / 1000; // < 0, 0.0005 >
576579

577580
if (( vabs( ey - by ) < EPSILON ) && ( vabs( ex - bx ) < EPSILON ) )
578581
{
@@ -723,7 +726,7 @@ void FeaturePart::removeDuplicatePoints()
723726
double end_x = 0;
724727
double end_y = 0;
725728

726-
std::cerr << "segment len " << segment_length << " distance " << distance << std::endl;
729+
//std::cerr << "segment len " << segment_length << " distance " << distance << std::endl;
727730
if (segment_length - distance >= ci.width)
728731
{
729732
// if the distance remaining in this segment is enough, we just go further along the segment
@@ -883,15 +886,22 @@ void FeaturePart::removeDuplicatePoints()
883886
{
884887
diff = fabs(tmp->getAlpha() - angle_last);
885888
if (diff > 2*M_PI) diff -= 2*M_PI;
889+
diff = min(diff, 2*M_PI - diff); // difference 350 deg is actually just 10 deg...
886890
angle_diff += diff;
887891
}
888892

889893
angle_last = tmp->getAlpha();
890894
tmp = tmp->getNextPart();
891895
}
892-
double cost = angle_diff/100.0;
896+
double angle_diff_avg = angle_diff / (f->labelInfo->char_num-1); // <0, pi> but pi/8 is much already
897+
double cost = angle_diff_avg / 100; // <0, 0.031 > but usually <0, 0.003 >
893898
if (cost < 0.0001) cost = 0.0001;
894-
std::cerr << "cost " << angle_diff << std::endl;
899+
900+
// penalize positions which are further from the line's midpoint
901+
double labelCenter = (i*delta) + f->label_x/2;
902+
double costCenter = vabs( total_distance/2 - labelCenter ) / total_distance; // <0, 0.5>
903+
cost += costCenter / 1000; // < 0, 0.0005 >
904+
//std::cerr << "cost " << angle_diff << " vs " << costCenter << std::endl;
895905
slp->setCost(cost);
896906

897907
positions->push_back(slp);

0 commit comments

Comments
 (0)