aboutsummaryrefslogtreecommitdiff
path: root/generic/Track.c
diff options
context:
space:
mode:
authorlecoanet2002-02-20 13:00:57 +0000
committerlecoanet2002-02-20 13:00:57 +0000
commit86eeded9ecb3d3de9e5cbb7c6aa4f8738c1bfb72 (patch)
tree442f33640744afe018b458d012c41cea13dda9f9 /generic/Track.c
parent6b36f92065f054abd810d956169a87180677d4f7 (diff)
downloadtkzinc-86eeded9ecb3d3de9e5cbb7c6aa4f8738c1bfb72.zip
tkzinc-86eeded9ecb3d3de9e5cbb7c6aa4f8738c1bfb72.tar.gz
tkzinc-86eeded9ecb3d3de9e5cbb7c6aa4f8738c1bfb72.tar.bz2
tkzinc-86eeded9ecb3d3de9e5cbb7c6aa4f8738c1bfb72.tar.xz
Int�gration des modifs de D.Pavet concernant l'interface d'antirec et les nouveaux controles sur l'antirec.
Diffstat (limited to 'generic/Track.c')
-rw-r--r--generic/Track.c63
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;