diff options
author | lecoanet | 2004-10-13 09:07:25 +0000 |
---|---|---|
committer | lecoanet | 2004-10-13 09:07:25 +0000 |
commit | 5446ec45635920bbbca77ad68010bfefa5c58299 (patch) | |
tree | 00e326e95f709e6f50e4b2fba1c1614397044162 | |
parent | f75efe1b8d2537ca913cea3a5b779d4a74617cbc (diff) | |
download | tkzinc-5446ec45635920bbbca77ad68010bfefa5c58299.zip tkzinc-5446ec45635920bbbca77ad68010bfefa5c58299.tar.gz tkzinc-5446ec45635920bbbca77ad68010bfefa5c58299.tar.bz2 tkzinc-5446ec45635920bbbca77ad68010bfefa5c58299.tar.xz |
Fixed a label bounding box error under GL:
the borders being drawn with a thick line
the bbox need to be increased in all directions
by 1.
The label is now maintained at the requested
distance regardless of its angular position.
Doing so, the leader length is less prone to
huge variations especially with longish labels.
-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. */ |