@@ -635,7 +635,7 @@ namespace pal
635
635
index++;
636
636
if (index >= path_positions->nbPoints ) // Bail out if we run off the end of the shape
637
637
{
638
- std::cerr << " err5" << std::endl;
638
+ // std::cerr << "err5" << std::endl;
639
639
return NULL ;
640
640
}
641
641
new_x = path_positions->x [index];
@@ -644,7 +644,7 @@ namespace pal
644
644
dy = new_y - old_y;
645
645
segment_length = path_distances[index];
646
646
647
- std::cerr << " -> " << sqrt (pow (start_x - new_x,2 ) + pow (start_y - new_y,2 )) << " vs " << ci.width << std::endl;
647
+ // std::cerr << "-> " << sqrt(pow(start_x - new_x,2) + pow(start_y - new_y,2)) << " vs " << ci.width << std::endl;
648
648
649
649
} while (sqrt (pow (start_x - new_x,2 ) + pow (start_y - new_y,2 )) < ci.width ); // Distance from start_ to new_
650
650
@@ -689,7 +689,7 @@ namespace pal
689
689
render_angle += M_PI;
690
690
}
691
691
692
- std::cerr << " adding part: " << render_x << " " << render_y << std::endl;
692
+ // std::cerr << "adding part: " << render_x << " " << render_y << std::endl;
693
693
LabelPosition* tmp = new LabelPosition (0 , render_x /* - xBase*/ , render_y /* - yBase*/ , ci.width , string_height, -render_angle, 0.0001 , this );
694
694
tmp->setPartId ( orientation > 0 ? i : labelInfo->char_num -i-1 );
695
695
if (slp == NULL )
@@ -722,7 +722,7 @@ namespace pal
722
722
else
723
723
{
724
724
// Otherwise we have failed to find a placement
725
- std::cerr << " err7" << std::endl;
725
+ // std::cerr << "err7" << std::endl;
726
726
return NULL ;
727
727
}
728
728
}
@@ -738,6 +738,7 @@ namespace pal
738
738
739
739
// distance calculation
740
740
double * path_distances = new double [mapShape->nbPoints ];
741
+ double total_distance = 0 ;
741
742
double old_x, old_y, new_x, new_y;
742
743
for (int i = 0 ; i < mapShape->nbPoints ; i++)
743
744
{
@@ -747,21 +748,57 @@ namespace pal
747
748
path_distances[i] = sqrt ( pow (old_x - mapShape->x [i], 2 ) + pow (old_y - mapShape->y [i],2 ) );
748
749
old_x = mapShape->x [i];
749
750
old_y = mapShape->y [i];
751
+
752
+ total_distance += path_distances[i];
750
753
}
751
754
752
- // TODO: generate more labels
755
+ if (total_distance == 0 )
756
+ return 0 ;
753
757
754
- // generate curved label
755
- LabelPosition* slp = curvedPlacementAtOffset (mapShape, path_distances, 0 , 1 , 0.0 );
758
+ int nbp = 0 ;
759
+ LinkedList<LabelPosition*> *positions = new LinkedList<LabelPosition*> ( ptrLPosCompare );
760
+ double delta = max ( labelInfo->label_height , total_distance/10.0 );
756
761
757
- if (!slp)
758
- return 0 ;
762
+ // generate curved labels
763
+ std::cerr << " ------" << std::endl;
764
+ for (int i = 0 ; i*delta < total_distance; i++)
765
+ {
766
+ LabelPosition* slp = curvedPlacementAtOffset (mapShape, path_distances, 0 , 1 , i*delta);
767
+
768
+ if (slp)
769
+ {
770
+ // evaluate cost
771
+ double angle_diff = 0 , angle_last, diff;
772
+ LabelPosition* tmp = slp;
773
+ while (tmp)
774
+ {
775
+ if (tmp != slp) // not first?
776
+ {
777
+ diff = fabs (tmp->getAlpha () - angle_last);
778
+ if (diff > 2 *M_PI) diff -= 2 *M_PI;
779
+ angle_diff += diff;
780
+ }
781
+
782
+ angle_last = tmp->getAlpha ();
783
+ tmp = tmp->getNextPart ();
784
+ }
785
+ double cost = angle_diff/100.0 ;
786
+ if (cost < 0.0001 ) cost = 0.0001 ;
787
+ std::cerr << " cost " << angle_diff << std::endl;
788
+ slp->setCost (cost);
789
+
790
+ positions->push_back (slp);
791
+ nbp++;
792
+ }
793
+ }
759
794
760
- // TODO: evaluate cost
761
795
762
- int nbp = 1 ;
763
796
( *lPos ) = new LabelPosition*[nbp];
764
- (*lPos)[0 ] = slp;
797
+ for (int i = 0 ; i < nbp; i++)
798
+ {
799
+ (*lPos)[i] = positions->pop_front ();
800
+ }
801
+ delete positions;
765
802
766
803
return nbp;
767
804
}
0 commit comments