[QGIS Commit] r11178 - branches/symbology-ng-branch/src/core/pal
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Sun Jul 26 07:01:48 EDT 2009
Author: wonder
Date: 2009-07-26 07:01:47 -0400 (Sun, 26 Jul 2009)
New Revision: 11178
Modified:
branches/symbology-ng-branch/src/core/pal/feature.cpp
Log:
Produce several candidates when using curved line labels
Modified: branches/symbology-ng-branch/src/core/pal/feature.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/pal/feature.cpp 2009-07-25 21:24:13 UTC (rev 11177)
+++ branches/symbology-ng-branch/src/core/pal/feature.cpp 2009-07-26 11:01:47 UTC (rev 11178)
@@ -635,7 +635,7 @@
index++;
if (index >= path_positions->nbPoints) // Bail out if we run off the end of the shape
{
- std::cerr << "err5" << std::endl;
+ //std::cerr << "err5" << std::endl;
return NULL;
}
new_x = path_positions->x[index];
@@ -644,7 +644,7 @@
dy = new_y - old_y;
segment_length = path_distances[index];
- std::cerr << "-> " << sqrt(pow(start_x - new_x,2) + pow(start_y - new_y,2)) << " vs " << ci.width << std::endl;
+ //std::cerr << "-> " << sqrt(pow(start_x - new_x,2) + pow(start_y - new_y,2)) << " vs " << ci.width << std::endl;
} while (sqrt(pow(start_x - new_x,2) + pow(start_y - new_y,2)) < ci.width); // Distance from start_ to new_
@@ -689,7 +689,7 @@
render_angle += M_PI;
}
- std::cerr << "adding part: " << render_x << " " << render_y << std::endl;
+ //std::cerr << "adding part: " << render_x << " " << render_y << std::endl;
LabelPosition* tmp = new LabelPosition(0, render_x /*- xBase*/, render_y /*- yBase*/, ci.width, string_height, -render_angle, 0.0001, this);
tmp->setPartId( orientation > 0 ? i : labelInfo->char_num-i-1 );
if (slp == NULL)
@@ -722,7 +722,7 @@
else
{
// Otherwise we have failed to find a placement
- std::cerr << "err7" << std::endl;
+ //std::cerr << "err7" << std::endl;
return NULL;
}
}
@@ -738,6 +738,7 @@
// distance calculation
double* path_distances = new double[mapShape->nbPoints];
+ double total_distance = 0;
double old_x, old_y, new_x, new_y;
for (int i = 0; i < mapShape->nbPoints; i++)
{
@@ -747,21 +748,57 @@
path_distances[i] = sqrt( pow(old_x - mapShape->x[i], 2) + pow(old_y - mapShape->y[i],2) );
old_x = mapShape->x[i];
old_y = mapShape->y[i];
+
+ total_distance += path_distances[i];
}
- // TODO: generate more labels
+ if (total_distance == 0)
+ return 0;
- // generate curved label
- LabelPosition* slp = curvedPlacementAtOffset(mapShape, path_distances, 0, 1, 0.0);
+ int nbp = 0;
+ LinkedList<LabelPosition*> *positions = new LinkedList<LabelPosition*> ( ptrLPosCompare );
+ double delta = max( labelInfo->label_height, total_distance/10.0 );
- if (!slp)
- return 0;
+ // generate curved labels
+ std::cerr << "------" << std::endl;
+ for (int i = 0; i*delta < total_distance; i++)
+ {
+ LabelPosition* slp = curvedPlacementAtOffset(mapShape, path_distances, 0, 1, i*delta);
- // TODO: evaluate cost
+ if (slp)
+ {
+ // evaluate cost
+ double angle_diff = 0, angle_last, diff;
+ LabelPosition* tmp = slp;
+ while (tmp)
+ {
+ if (tmp != slp) // not first?
+ {
+ diff = fabs(tmp->getAlpha() - angle_last);
+ if (diff > 2*M_PI) diff -= 2*M_PI;
+ angle_diff += diff;
+ }
- int nbp = 1;
+ angle_last = tmp->getAlpha();
+ tmp = tmp->getNextPart();
+ }
+ double cost = angle_diff/100.0;
+ if (cost < 0.0001) cost = 0.0001;
+ std::cerr << "cost " << angle_diff << std::endl;
+ slp->setCost(cost);
+
+ positions->push_back(slp);
+ nbp++;
+ }
+ }
+
+
( *lPos ) = new LabelPosition*[nbp];
- (*lPos)[0] = slp;
+ for (int i = 0; i < nbp; i++)
+ {
+ (*lPos)[i] = positions->pop_front();
+ }
+ delete positions;
return nbp;
}
More information about the QGIS-commit
mailing list