diff options
-rw-r--r-- | generic/Track.c | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/generic/Track.c b/generic/Track.c index 9af4cee..0d18c27 100644 --- a/generic/Track.c +++ b/generic/Track.c @@ -795,7 +795,6 @@ ComputeCoordinates(ZnItem item, */ c_item = item->connected_item; if ((c_item != ZN_NO_ITEM) && (track->connection_width > 0)) { - ZnResetBBox(&bbox); w2 = (int) track->connection_width/2; ZnAddPointToBBox(&item->item_bounding_box, track->dev.x-w2, track->dev.y-w2); ZnAddPointToBBox(&item->item_bounding_box, ((TrackItem)c_item)->dev.x+w2, @@ -823,35 +822,17 @@ ComputeCoordinates(ZnItem item, /* Compute the new label bounding box. */ if (field_set->label_format && field_set->num_fields) { - ZnDim bb_width, bb_height, dist; + ZnDim bb_width, bb_height; + ZnReal rho, dist; ZnPoint leader_end; + int it; ZnFIELD.GetLabelBBox(field_set, &bb_width, &bb_height); /* * Compute the label position. */ if (ISSET(track->flags, POLAR_BIT)) { -#ifdef DP - /* Alternative on ne calcule pas une distance minimum mais - * on fait confiance à la distance effective track->label_distance - * attention aux problemes d'arrondi de ZnPointPolarToCartesian !!! - */ - dist = track->label_distance ; -#else - /* - * Adjust the min dist spec given in label_distance by - * the size of the label. - */ - if ((track->label_anchor == TK_ANCHOR_N) || - (track->label_anchor == TK_ANCHOR_CENTER) || - (track->label_anchor == TK_ANCHOR_S)) { - dist = sqrt(bb_width*bb_width/4+bb_height*bb_height/4); - } - else { - dist = sqrt(bb_width*bb_width+bb_height*bb_height); - } - dist += track->label_distance; -#endif + rho = track->label_distance; /* * Compute heading after applying the transform. */ @@ -860,22 +841,49 @@ ComputeCoordinates(ZnItem item, ZnProjectionToAngle(track->speed_vector.x, track->speed_vector.y), track->label_angle);*/ rotation = ZnProjectionToAngle(track->speed_vector.x, track->speed_vector.y)-rotation; - ZnPointPolarToCartesian(rotation, dist, (ZnReal) track->label_angle, - &track->label_dx, &track->label_dy); + it = 0; + while (1) { + ZnPointPolarToCartesian(rotation, rho, (ZnReal) track->label_angle, + &track->label_dx, &track->label_dy); + field_set->label_pos.x = track->dev.x + track->label_dx; + field_set->label_pos.y = track->dev.y - track->label_dy; + ZnAnchor2Origin(&field_set->label_pos, bb_width, bb_height, + track->label_anchor, &field_set->label_pos); + ZnResetBBox(&bbox); + ZnAddPointToBBox(&bbox, field_set->label_pos.x, field_set->label_pos.y); + ZnAddPointToBBox(&bbox, field_set->label_pos.x + bb_width, field_set->label_pos.y + bb_height); + dist = ZnRectangleToPointDist(&bbox, &track->dev); + dist = track->label_distance - dist; + if (ABS(dist) < 1.0 || it > 5) { + break; + } + it++; + rho += dist; + } + } + else { + field_set->label_pos.x = track->dev.x + track->label_dx; + field_set->label_pos.y = track->dev.y - track->label_dy; + ZnAnchor2Origin(&field_set->label_pos, bb_width, bb_height, + track->label_anchor, &field_set->label_pos); } - field_set->label_pos.x = track->dev.x + track->label_dx; - field_set->label_pos.y = track->dev.y - track->label_dy; - ZnAnchor2Origin(&field_set->label_pos, bb_width, bb_height, - track->label_anchor, &field_set->label_pos); field_set->label_pos.x = ZnNearestInt(field_set->label_pos.x); field_set->label_pos.y = ZnNearestInt(field_set->label_pos.y); - ZnAddPointToBBox(&item->item_bounding_box, field_set->label_pos.x, - field_set->label_pos.y); + /* + * Need to compensate for GL thicke lines + */ +#ifdef GL +#define CORR 1 +#else +#define CORR 0 +#endif + ZnAddPointToBBox(&item->item_bounding_box, field_set->label_pos.x - CORR, field_set->label_pos.y - CORR); ZnAddPointToBBox(&item->item_bounding_box, - field_set->label_pos.x + (ZnPos) bb_width, - field_set->label_pos.y + (ZnPos) bb_height); - + field_set->label_pos.x + (ZnPos) bb_width + CORR, + field_set->label_pos.y + (ZnPos) bb_height + CORR); +#undef CORR + /* * Process the leader. */ |