diff options
Diffstat (limited to 'generic/Track.c')
-rw-r--r-- | generic/Track.c | 63 |
1 files changed, 56 insertions, 7 deletions
diff --git a/generic/Track.c b/generic/Track.c index 74339d0..a60e4d5 100644 --- a/generic/Track.c +++ b/generic/Track.c @@ -46,6 +46,13 @@ static const char compile_id[]="$Compile: " __FILE__ " " __DATE__ " " __TIME__ " #define SPEED_VECTOR_PICKING_THRESHOLD 5 /* In pixels */ +/* + * Sets a threshold for calculating distance from label_dx, label_dy. + * Above this threshold value, the module is discarded, label_distance + * is preferred. + */ +#define LABEL_DISTANCE_THRESHOLD 5 + #define MARKER_FILLED_BIT 1 << 0 #define FILLED_HISTORY_BIT 1 << 1 #define DOT_MIXED_HISTORY_BIT 1 << 2 @@ -69,7 +76,6 @@ static const char compile_id[]="$Compile: " __FILE__ " " __DATE__ " " __TIME__ " * ********************************************************************************** */ - typedef struct { ZnPoint world; /* world coord of pos */ ZnPoint dev; /* dev coord of pos */ @@ -87,6 +93,8 @@ typedef struct _TrackItemStruct { ZnDim label_distance; /* Label distance from track. */ ZnDim label_dx; /* Label dx/dy from track. */ ZnDim label_dy; + int label_preferred_angle; + int label_convergence_style; ZnAnchor label_anchor; LeaderAnchors leader_anchors; /* Spec of the leader attachment */ ZnGradient *leader_color; /* leader color */ @@ -153,6 +161,8 @@ static ZnAttrConfig track_attrs[] = { { ZN_CONFIG_ANGLE, "-labelangle", NULL, Tk_Offset(TrackItemStruct, label_angle), 0, ZN_COORDS_FLAG|ZN_POLAR_FLAG, False }, + { ZN_CONFIG_DIM, "-labelconvergencestyle", NULL, + Tk_Offset(TrackItemStruct, label_convergence_style), 0, 0, False }, { ZN_CONFIG_DIM, "-labeldistance", NULL, Tk_Offset(TrackItemStruct, label_distance), 0, ZN_COORDS_FLAG|ZN_POLAR_FLAG, False }, @@ -165,6 +175,8 @@ static ZnAttrConfig track_attrs[] = { { ZN_CONFIG_LABEL_FORMAT, "-labelformat", NULL, Tk_Offset(TrackItemStruct, field_set.label_format), 0, ZN_COORDS_FLAG|ZN_CLFC_FLAG, False }, + { ZN_CONFIG_ANGLE, "-labelpreferredangle", NULL, + Tk_Offset(TrackItemStruct, label_preferred_angle), 0, 0, False }, { ZN_CONFIG_BOOL, "-lastasfirst", NULL, Tk_Offset(TrackItemStruct, flags), LAST_AS_FIRST_BIT, ZN_DRAW_FLAG, False }, { ZN_CONFIG_LEADER_ANCHORS, "-leaderanchors", NULL, @@ -357,6 +369,10 @@ Init(Item item, track->label_distance = DEFAULT_LABEL_DISTANCE; SET(track->flags, POLAR_BIT); CLEAR(track->flags, FROZEN_LABEL_BIT); + + track->label_preferred_angle = DEFAULT_LABEL_PREFERRED_ANGLE; + track->label_convergence_style = DEFAULT_CONVERGENCE_STYLE ; + track->leader_anchors = NULL; track->leader_color = ZnGetGradientByValue(wi->fore_gradient); track->leader_style = LINE_SIMPLE; @@ -371,11 +387,12 @@ Init(Item item, track->speed_vector_color = ZnGetGradientByValue(wi->fore_gradient); track->history_color = ZnGetGradientByValue(wi->fore_gradient); CLEAR(track->flags, MARKER_FILLED_BIT); - CLEAR(track->flags, SV_MARK_BIT); SET(track->flags, FILLED_HISTORY_BIT); CLEAR(track->flags, DOT_MIXED_HISTORY_BIT); CLEAR(track->flags, CIRCLE_HISTORY_BIT); CLEAR(track->flags, LAST_AS_FIRST_BIT); + CLEAR(track->flags, SV_MARK_BIT); + CLEAR(track->flags, SV_TICKS_BIT); if (item->class == ZnTrack) { item->priority = DEFAULT_TRACK_PRIORITY; @@ -804,6 +821,13 @@ ComputeCoordinates(Item item, * Compute the label position. */ if (ISSET(track->flags, POLAR_BIT)) { +#if 0 + /* Alternative on ne calcule pas une distance minimum mais + * on fait confiance à la distance effective track->label_distance + * attention aux problemes d'arrondi de PointPolarToCartesian !!! + */ + dist = track->label_distance ; +#else /* * Adjust the min dist spec given in label_distance by * the size of the label. @@ -817,6 +841,7 @@ ComputeCoordinates(Item item, dist = sqrt(bb_width*bb_width+bb_height*bb_height); } dist += track->label_distance; +#endif /* * Compute heading after applying the transform. */ @@ -1722,13 +1747,16 @@ SendTrackToOm(void *ptr, int *y, int *sv_dx, int *sv_dy, - /* int *label_x, + /*int *label_x, int *label_y, int *label_width, int *label_height,*/ int *rho, int *theta, - int *visibility) + int *visibility, + int *locked, + int *preferred_angle, + int *convergence_style) { WidgetInfo *wi = (WidgetInfo *) ptr; Item current_item = (Item) item; @@ -1736,6 +1764,8 @@ SendTrackToOm(void *ptr, ZnBBox zn_bbox, bbox; ZnBool to_be_sent; + int rho_derived ; + zn_bbox.orig.x = zn_bbox.orig.y = 0; zn_bbox.corner.x = wi->width; zn_bbox.corner.y = wi->height; @@ -1786,10 +1816,27 @@ SendTrackToOm(void *ptr, *label_height = 0; } */ - *rho = sqrt(track->label_dx*track->label_dx + track->label_dy*track->label_dy); + + /* + * Trial to fix rho drift due to PointPolarToCartesian + * roundoff error. + */ + rho_derived = sqrt(track->label_dx*track->label_dx + track->label_dy*track->label_dy); + if (ABS(rho_derived - track->label_distance) < LABEL_DISTANCE_THRESHOLD) { + /* The error is narrow so value discarded */ + *rho = track->label_distance ; + } + else { + /* Means a user change has been performed on label_dx label_dy */ + *rho = rho_derived ; + } + *theta = track->label_angle; - *visibility = ISSET(current_item->flags, VISIBLE_BIT); - break; + *visibility = (ISSET(current_item->flags, VISIBLE_BIT) ? 1 : 0 ); + *locked = (ISSET(track->flags, FROZEN_LABEL_BIT) ? 1 : 0); + *preferred_angle = track->label_preferred_angle; + *convergence_style = track->label_convergence_style; + break; } current_item = current_item->next; @@ -1809,6 +1856,7 @@ SendTrackToOm(void *ptr, void SetLabelAngleFromOm(void *ptr, /* No longer in use. */ void *item, + int rho, int theta) { TrackItem track = (TrackItem) item; @@ -1818,6 +1866,7 @@ SetLabelAngleFromOm(void *ptr, /* No longer in use. */ if (ISCLEAR(track->flags, FROZEN_LABEL_BIT) && (theta >= 0) && (track->label_angle != theta)) { track->label_angle = theta; + track->label_distance = rho; SET(track->flags, POLAR_BIT); ITEM.Invalidate((Item) item, ZN_COORDS_FLAG); ((GroupItem) ((Item) item)->parent)->call_om = True; |