51 else if ( dist < distlabel )
100 for (
int i = 0; i < nblp; ++i )
106 QList< LabelPosition * > toSort;
107 toSort.reserve( nblp );
108 for (
int i = 0; i < nblp; ++i )
110 toSort << lPos.at( i );
113 for (
int i = 0; i < nblp; ++i )
115 lPos[i] = toSort.at( i );
119 double cost_max = lPos.at( 0 )->cost();
120 double cost_min = lPos.at( nblp - 1 )->cost();
122 cost_max -= cost_min;
126 normalizer = 0.0020 / cost_max;
135 for (
int i = 0; i < nblp; ++i )
140 lPos.at( i )->setCost( 0.0021 - ( lPos.at( i )->cost() - cost_min ) * normalizer );
145 lPos.at( i )->setCost( 0.0001 );
180 if ( max_p > feat->
lPos.count() )
181 max_p = feat->
lPos.count();
187 double discrim = 0.0;
192 for ( stop = 0; stop < feat->
lPos.count() && feat->
lPos.at( stop )->cost() < discrim; stop++ )
195 while ( stop == 0 && discrim < feat->lPos.last()->cost() + 2.0 );
200 for ( k = 0; k < stop; k++ )
201 feat->
lPos.at( k )->setCost( 0.0021 );
224 px = ( lp->
x[0] + lp->
x[2] ) / 2.0;
225 py = ( lp->
y[0] + lp->
y[2] ) / 2.0;
227 dist = std::numeric_limits<double>::max();
double obstacleFactor() const
Returns the feature's obstacle factor, which represents the penalty incurred for a label to overlap t...
static bool candidateSortGrow(const LabelPosition *c1, const LabelPosition *c2)
Sorts label candidates in ascending order of cost.
bool intersectsWithPolygon(PointSet *polygon) const
Returns true if any intersection between polygon and position exists.
void setCost(double newCost)
Sets the candidate label position's geographical cost.
double getLabelDistance() const
Returns the distance from the anchor point to the label.
LabelPosition * getLabel()
QgsPalLayerSettings::ObstacleType obstacleType() const
Returns the obstacle type, which controls how features within the layer act as obstacles for labels...
Arranges horizontal candidates scattered throughout a polygon feature. Applies to polygon layers only...
void update(pal::PointSet *pset)
static void addObstacleCostPenalty(LabelPosition *lp, pal::FeaturePart *obstacle)
Increase candidate's cost according to its collision with passed feature.
double cost() const
Returns the candidate label position's geographical cost.
void addSizePenalty(int nbp, QList< LabelPosition *> &lPos, double bbx[4], double bby[4])
PolygonCostCalculator(LabelPosition *lp)
void getBoundingBox(double min[2], double max[2]) const
Layer * layer()
Returns the layer that feature belongs to.
QgsPalLayerSettings::Placement arrangement() const
Returns the layer's arrangement policy.
static int finalizeCandidatesCosts(Feats *feat, int max_p, RTree< pal::FeaturePart *, double, 2, double > *obstacles, double bbx[4], double bby[4])
Sort candidates by costs, skip the worse ones, evaluate polygon candidates.
QList< LabelPosition * > lPos
For usage in problem solving algorithm.
Main class to handle feature.
int polygonIntersectionCost(PointSet *polygon) const
Returns cost of position intersection with polygon (testing area of intersection and center)...
static void setPolygonCandidatesCost(int nblp, QList< LabelPosition * > &lPos, RTree< pal::FeaturePart *, double, 2, double > *obstacles, double bbx[4], double bby[4])
void setConflictsWithObstacle(bool conflicts)
Sets whether the position is marked as conflicting with an obstacle feature.
static bool polygonObstacleCallback(pal::FeaturePart *obstacle, void *ctx)
static void setCandidateCostFromPolygon(LabelPosition *lp, RTree< pal::FeaturePart *, double, 2, double > *obstacles, double bbx[4], double bby[4])
Sets cost to the smallest distance between lPos's centroid and a polygon stored in geoetry field...
LabelPosition is a candidate feature label position.
bool crossesBoundary(PointSet *polygon) const
Returns true if this label crosses the boundary of the specified polygon.
static bool candidateSortShrink(const LabelPosition *c1, const LabelPosition *c2)
Sorts label candidates in descending order of cost.
Data structure to compute polygon's candidates costs.
double minDistanceToPoint(double px, double py, double *rx=nullptr, double *ry=nullptr) const
Returns the squared minimum distance between the point set geometry and the point (px...
bool crossesLine(PointSet *line) const
Returns true if this label crosses the specified line.
Arranges candidates scattered throughout a polygon feature. Candidates are rotated to respect the pol...
double getDistanceToPoint(double xp, double yp) const
Gets distance from this label to a point. If point lies inside, returns negative number.