aboutsummaryrefslogtreecommitdiff
path: root/generic/OverlapMan.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/OverlapMan.c')
-rw-r--r--generic/OverlapMan.c1125
1 files changed, 0 insertions, 1125 deletions
diff --git a/generic/OverlapMan.c b/generic/OverlapMan.c
deleted file mode 100644
index d09977f..0000000
--- a/generic/OverlapMan.c
+++ /dev/null
@@ -1,1125 +0,0 @@
-/*
- * OverlapMan.c -- Track label overlap avoidance manager implementation.
- *
- * Authors :
- * Creation date :
- *
- * $Id$
- */
-
-/*
- * Copyright (c) 1993 - 2005 CENA --
- *
- * See the file "Copyright" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- *
- */
-
-/*
- * TODO:
- *
- * The tracks should be identified by their ids not their
- * structure pointer. This would enable an easy interface
- * between the overlap manager and the applications when
- * dealing with tracks.
- */
-
-static const char rcsid[] = "$Id$";
-static const char compile_id[]="$Compile: " __FILE__ " " __DATE__ " " __TIME__ " $";
-
-
-#include "OverlapMan.h"
-#if defined(__APPLE__)
-#include <stdlib.h>
-#else
-#include "malloc.h"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-
-#ifdef _WIN32
-# ifndef __GNUC__
-# pragma warning(disable : 4996)
-# endif
-#endif
-
-#define signe(a) ((a) < (0) ? (-1) : (1))
-#define abs(a) ((a) < (0) ? -(a) : (a))
-#ifndef M_PI
-#define M_PI 3.14159265358979323846264338327
-#endif
-#ifndef M_PI_2
-#define M_PI_2 1.57079632679489661923
-#endif
-#ifndef M_PI_4
-#define M_PI_4 0.78539816339744830962
-#endif
-#define DegreesToRadian(angle) \
- (M_PI * (double) (angle) / 180.0)
-#define RadianToDegrees(angle) \
- (fmod((angle) * 180.0 / M_PI, 360.0))
-#define RadianToDegrees360(angle) \
- (fmod(RadianToDegrees(angle)+360.0,360.0))
-
-
-#define NB_ALLOC 20
-#define COEF1 0.5 /* coef of second repulsion point */
-#define COEF2 0.1 /* coef of second repulsion point */
-
-#define DELTA_T 0.1 /* integration step for Euler method */
-#define FALSE 0
-#define TRUE 1
-
-
-typedef int BOOLEAN;
-
-typedef struct _INFOS {
- void* id;
- int x;
- int y;
- int vv_dx;
- int vv_dy;
- /* Fri Oct 13 15:15:31 2000 int label_x;
- int label_y;
- int label_width;
- int label_height;*/
- int rho;
- int theta;
- int visibility;
- BOOLEAN New_Track;
- int dx;
- int dy;
- double alpha;
- double alpha_point;
- BOOLEAN Refresh;
-} INFOS;
-
-typedef struct _ZINCS {
- void *rw;
- void *(*_next_track)();
- void (*_set_label_angle)();
- INFOS *infos;
- int NBinfos;
- int NBalloc_infos;
-} ZINCS;
-
-/*
- * Definition of tunable parameters
- */
-
-
-/*
- * real parameters adresse
- */
-static double K0 = 2100.0; /* Repulsion factor */
-static double K0min = 500.0;
-static double K0max = 3000.0;
-
-static double n0 = 2.10; /* Repulsion exponent */
-static double n0min = 2.0;
-static double n0max = 3.0;
-
-static double K1 = 6.0; /* Friction factor */
-static double K1min = 1.0;
-static double K1max = 10.0;
-
-static double K2 = 6.0; /* Drawback forces factor */
-static double K2min = 1.0;
-static double K2max = 10.0;
-
-static double K3 = 4.0; /* Keep in view forces factor */
-static double K3min = 1.0;
-static double K3max = 10.0;
-
-/*
- * accessor structure need for generic set/get method
- */
-typedef struct _OMPARAM {
- int type;
- int size;
- char *name;
- void *data;
- BOOLEAN rw; /* 1 means readwrite, 0 means read only */
-} OMPARAM, *pOMPARAM;
-
-/*
- * Global vars.
- *
- */
-static OMPARAM OmParamAccess[] = {
- { OM_PARAM_DOUBLE, sizeof(double), "repulsion", &K0, 1 },
- { OM_PARAM_DOUBLE, sizeof(double), "repulsion_bearing", &n0, 1 },
- { OM_PARAM_DOUBLE, sizeof(double), "friction", &K1, 1 },
- { OM_PARAM_DOUBLE, sizeof(double), "best_position_attraction", &K2, 1 },
- { OM_PARAM_DOUBLE, sizeof(double), "screen_edge_repulsion", &K3, 1 },
- { OM_PARAM_DOUBLE, sizeof(double), "min_repulsion", &K0min, 0 },
- { OM_PARAM_DOUBLE, sizeof(double), "min_repulsion_bearing", &n0min, 0 },
- { OM_PARAM_DOUBLE, sizeof(double), "min_friction", &K1min, 0 },
- { OM_PARAM_DOUBLE, sizeof(double), "min_best_position_attraction", &K2min, 0 },
- { OM_PARAM_DOUBLE, sizeof(double), "min_screen_edge_repulsion", &K3min, 0 },
- { OM_PARAM_DOUBLE, sizeof(double), "max_repulsion", &K0max, 0 },
- { OM_PARAM_DOUBLE, sizeof(double), "max_repulsion_bearing", &n0max, 0 },
- { OM_PARAM_DOUBLE, sizeof(double), "max_friction", &K1max, 0 },
- { OM_PARAM_DOUBLE, sizeof(double), "max_best_position_attraction", &K2max, 0 },
- { OM_PARAM_DOUBLE, sizeof(double), "max_screen_edge_repulsion", &K3max, 0 },
- { OM_PARAM_END, 0, "", NULL, 0 }
-};
-
-static int NbParam = sizeof(OmParamAccess) / sizeof(OMPARAM) - 1;
-static ZINCS *wr = NULL;
-static int NBzincs=0;
-static int NBalloc_zincs=0;
-static INFOS info1;
-
-
-/*
- * Square of the distance (between two label centers) below which
- * the repulsion is not computed.
- */
-static double limit_distance = 6.0;
-
-/*
- * Square of the minimum distance (between two label centers)
- * considered during initialisation of the leaders.
- */
-static double placing_min_dist = 11000.0;
-
-/*
- * Angle step between two placement trials.
- */
-static double placing_step = M_PI/6.0;
-
-
-/*
- ****************************************************************************
- *
- * FindPosW --
- * Find the zinc position in the database,
- * if not found, gets the positon to insert in.
- *
- ****************************************************************************
- */
-static BOOLEAN
-FindPosW(void *w,
- int *mid)
-{
- int left=0;
- int right=NBzincs-1;
-
- if (w < wr[0].rw) {
- *mid = 0;
- return FALSE;
- }
- if (w > wr[right].rw) {
- *mid = right+1;
- return FALSE;
- }
- if (w == wr[right].rw) {
- *mid = right;
- return TRUE;
- }
-
- *mid = (right + left) / 2;
- while ((right > left+1) && (wr[*mid].rw != w)) {
- if (w > wr[*mid].rw) {
- left = *mid;
- }
- else {
- right = *mid;
- }
- *mid = (right + left) / 2;
- }
- if (wr[*mid].rw == w) {
- return TRUE;
- }
- else {
- (*mid)++;
- return FALSE;
- }
-}
-
-
-/*
- ****************************************************************************
- *
- * AllocW --
- * Allocate cells in database for the specified zinc.
- *
- ****************************************************************************
- */
-static void
-AllocW(void *w,
- int pos)
-{
- int i;
-
- if (NBzincs == NBalloc_zincs) {
- NBalloc_zincs += NB_ALLOC;
- wr = realloc(wr, sizeof(ZINCS) * NBalloc_zincs);
- }
-
- for (i = NBzincs-1; i >= pos; i--) {
- memcpy((char *) &wr[i+1], (char *) &wr[i], sizeof(ZINCS));
- }
- /*memcpy((char *)&wr[pos+1], (char *)&wr[pos], (NBzincs-pos) * sizeof(ZINCS) );*/
-
- NBzincs++;
- wr[pos].rw = w;
- wr[pos].infos = NULL;
- wr[pos].NBinfos = 0;
- wr[pos].NBalloc_infos = 0;
-}
-
-
-/*
- ***************************************************************************
- *
- * ProjToAngle --
- * Compute an angle from dx and dy projections.
- *
- ***************************************************************************
- */
-static double
-ProjToAngle(int dx,
- int dy)
-{
- if (dx == 0) {
- if (dy < 0) {
- return -M_PI_2;
- }
- else {
- if (dy > 0) {
- return M_PI_2;
- }
- else {
- return 0;
- }
- }
- }
- if (dx > 0) {
- return atan((double) (dy) / (double) (dx));
- }
- if (dx < 0) {
- return atan((double) (dy) / (double) (dx)) + M_PI;
- }
-
- return 0.0;
-}
-
-
-/*
- ****************************************************************************
- *
- * OmInit --
- * Called only once to initialize some internal data.
- *
- ****************************************************************************
- */
-void
-OmInit()
-{
- /* printf("OmInit\n");*/
-}
-
-
-/*
- ****************************************************************************
- *
- * OmRegister --
- * Create a database entry for the specified zinc.
- *
- ****************************************************************************
- */
-void
-OmRegister(void *w,
- void *(*_fnext_track)(void *, void *,
- int *, int *,
- int *, int *,
- int *, int *,
- int *, int *,
- int *, int *),
- void (*_fset_label_angle)(void *, void *, int, int),
- void (*_fquery_label_pos)(void *, void *, int,
- int *, int *, int *, int *))
-{
- int iw=0;
- BOOLEAN found=FALSE;
-
- if (NBzincs > 0) {
- found = FindPosW(w, &iw);
- }
- if (found == FALSE) {
- AllocW(w, iw);
- }
- wr[iw]._next_track= _fnext_track;
- wr[iw]._set_label_angle= _fset_label_angle;
-}
-
-
-/*
- ****************************************************************************
- *
- * OmUnregister --
- * Cancel database information about the specified zinc.
- *
- ****************************************************************************
- */
-void
-OmUnregister(void *w)
-{
- int i;
-
- if (FindPosW(w, &i) == TRUE) {
- free(wr[i].infos);
- memcpy((char *) &wr[i], (char *) &wr[i+1], (NBzincs-i-1)*sizeof(ZINCS));
- NBzincs--;
- }
-}
-
-
-/*
- ***************************************************************************
- *
- * FindPosId --
- * Find track position in the database,
- * if not found gets the positon to insert in.
- *
- ***************************************************************************
- */
-static BOOLEAN
-FindPosId(int iw,
- void *id,
- int *mid)
-{
- int left=0;
- int right= wr[iw].NBinfos-1;
-
- if (id < wr[iw].infos[0].id) {
- *mid = 0;
- return FALSE;
- }
- if (id > wr[iw].infos[right].id) {
- *mid = right+1;
- return FALSE;
- }
- if (id == wr[iw].infos[right].id) {
- *mid = right;
- return TRUE;
- }
-
- *mid = (right + left) / 2;
- while ((right > left+1) && (wr[iw].infos[*mid].id != id)) {
- if (id > wr[iw].infos[*mid].id) {
- left = *mid;
- }
- else {
- right = *mid;
- }
- *mid = (right + left) / 2;
- }
- if (wr[iw].infos[*mid].id == id) {
- return TRUE;
- }
- else {
- (*mid)++;
- return FALSE;
- }
-}
-
-
-/*
- ***************************************************************************
- *
- * SetTrackInitValues --
- * Set initial label values for a track.
- *
- ***************************************************************************
- */
-static void
-SetTrackInitValues()
-{
- info1.alpha = ProjToAngle(info1.vv_dx, info1.vv_dy) - 3.0 * M_PI_4;
- info1.dx = (int) (info1.rho * cos(info1.alpha));
- info1.dy = (int) (info1.rho * sin(info1.alpha));
- info1.alpha_point = 0.0;
-}
-
-
-/*
- ***************************************************************************
- * SetTrackCurrentValues --
- * Update label values for a track.
- *
- ***************************************************************************
- */
-static void
-SetTrackCurrentValues(int iw,
- int pos)
-{
- info1.New_Track = FALSE;
- info1.alpha_point = wr[iw].infos[pos].alpha_point;
-}
-
-
-/*
- ***************************************************************************
- *
- * PutTrackLoaded --
- * Put track labels information into database.
- *
- ***************************************************************************
- */
-static void
-PutTrackLoaded(int iw)
-{
- int pos = 0, i;
- BOOLEAN found = FALSE;
-
- if (wr[iw].NBinfos > 0) {
- found = FindPosId(iw, info1.id, &pos);
- }
- if (found == FALSE) {
- /*
- * New track.
- */
- if (wr[iw].NBinfos == wr[iw].NBalloc_infos) {
- wr[iw].NBalloc_infos += NB_ALLOC;
- wr[iw].infos = realloc((void *) wr[iw].infos,
- sizeof(INFOS)*wr[iw].NBalloc_infos);
- }
-
- if (pos < wr[iw].NBinfos) {
- for(i = wr[iw].NBinfos-1; i >= pos; i--) {
- memcpy((char *) &(wr[iw].infos[i+1]), (char *) &(wr[iw].infos[i]),
- sizeof(INFOS));
- }
- /* memcpy((char *) &(wr[iw].infos[pos+1]), (char *) &(wr[iw].infos[pos]),
- (wr[iw].NBinfos-pos)*sizeof(INFOS) );*/
- }
-
- info1.New_Track = TRUE;
- SetTrackInitValues(iw, pos);
-
- wr[iw].NBinfos++;
- }
- else {
- if (info1.visibility == FALSE) {
- SetTrackInitValues( iw, pos);
- }
- else {
- SetTrackCurrentValues(iw, pos);
- }
- }
-
- memcpy((char *) &(wr[iw].infos[pos]), (char *) &info1, sizeof(INFOS));
-}
-
-
-/*
- ***************************************************************************
- *
- * ReadTracks --
- * Get track labels information from zinc.
- *
- ***************************************************************************
- */
-static void
-ReadTracks(int iw)
-{
- int i=0;
- int trash1; /* dummy variable : received unused data */
-
- for (i = 0; i < wr[iw].NBinfos; i++) {
- wr[iw].infos[i].Refresh = FALSE;
- }
-
- info1.id = NULL;
- while ((info1.id = (*wr[iw]._next_track)(wr[iw].rw, info1.id,
- &info1.x, &info1.y,
- &info1.vv_dx, &info1.vv_dy,
- /* Fri Oct 13 15:15:48 2000
- * &info1.label_x, &info1.label_y,
- * &info1.label_width, &info1.label_height,
- */
- &info1.rho, &info1.theta,
- &info1.visibility,
- &trash1,&trash1,&trash1))) {
- info1.alpha = (ProjToAngle(info1.vv_dx, info1.vv_dy ) - M_PI_2 -
- DegreesToRadian(info1.theta));
- info1.dx = (int) (info1.rho * cos(info1.alpha));
- info1.dy = (int) (info1.rho * sin(info1.alpha));
- info1.Refresh = TRUE;
- /* printf("OverlapMan(Om): ReadTracks id[%-10d], x[%4.4i], y[%4.4i], \
- vv_dx[%4.4i], vv_dy[%4.4i], rho[%-3.3d], theta[%-3.3d], visi[%d]\n",
- (int)info1.id,info1.x, info1.y, info1.vv_dx,info1.vv_dy,
- info1.rho,info1.theta,info1.visibility); */
- PutTrackLoaded(iw);
- }
-
- i = 0;
- while (i < wr[iw].NBinfos) {
- /*
- * Delete non refreshed tracks from database.
- */
- if (wr[iw].infos[i].Refresh == FALSE) {
- memcpy((char *) &(wr[iw].infos[i]), (char *) &(wr[iw].infos[i+1]),
- (wr[iw].NBinfos-i-1)*sizeof(INFOS));
- wr[iw].NBinfos--;
- }
- else {
- i++;
- }
- }
-}
-
-/*
- ***************************************************************************
- *
- * OmSetNParam --
- * Return 1 if ok, anything else if nok (non existing parameters,
- * wrong type).
- *
- ***************************************************************************
- */
-int
-OmSetNParam(char *name, /* parameter's name */
- void *value)
-{
- int accessid = 0;
- int status = 0;
-
- while (OmParamAccess[accessid].type != OM_PARAM_END) {
- if (!strcmp(name, OmParamAccess[accessid].name)) {
- /* a parameter named name has been found */
- if (OmParamAccess[accessid].rw) {
- memcpy(OmParamAccess[accessid].data, value,
- (unsigned int) OmParamAccess[accessid].size);
- status = 1;
- break;
- }
- else {
- status = -1 ; /* data is readonly */
- };
- };
- ++accessid;
- };
- return(status);
-}
-
-/*
- ***************************************************************************
- *
- * OmGetNParam --
- * Return 1 if ok, anything else if nok (non existing parameters,
- * wrong type).
- *
- ***************************************************************************
- */
-int
-OmGetNParam(char *name, /* parameter's name */
- void *ptvalue)
-{
- int accessid = 0;
- int status = 0;
-
- while (OmParamAccess[accessid].type != OM_PARAM_END) {
- if (!strcmp(name, OmParamAccess[accessid].name)) {
- /* a parameter named "name" has been found */
- memcpy(ptvalue, OmParamAccess[accessid].data,
- (unsigned int) OmParamAccess[accessid].size);
- status = 1;
- break;
- };
- ++accessid;
- };
- return(status);
-}
-
-/*
- ***************************************************************************
- *
- * OmGetNParamList --
- * Return 1 and next index if remains to read, the current param
- * being written in current_param. Return 0 if end of list.
- *
- ***************************************************************************
- */
-int
-OmGetNParamList(OmParam *current_param, int *idx_next)
-{
- int status = 0 ;
- pOMPARAM cparam ;
- if (*idx_next < NbParam) {
- cparam = &OmParamAccess[*idx_next];
- current_param->type = cparam->type ;
- strcpy(current_param->name, cparam->name);
- /* printf("value of parameter is %f \n", *((double *)(cparam->data)));
- printf("adresse de K0 %x \n", (int)&K0); */
- ++(*idx_next) ;
- status = 1;
- };
- return(status);
-}
-
-void
-OmSetParam(double OmKrepulsion,
- double OmKrepulsionBearing,
- double OmKfriction,
- double OmKbestPositionAttraction,
- double OmKscreenEdgeRepulsion)
-{
- K0 = OmKrepulsion;
- n0 = OmKrepulsionBearing;
- K1 = OmKfriction;
- K2 = OmKbestPositionAttraction;
- K3 = OmKscreenEdgeRepulsion;
-}
-
-void
-OmGetParam(double *OmKrepulsion,
- double *OmKrepulsionBearing,
- double *OmKfriction,
- double *OmKbestPositionAttraction,
- double *OmKscreenEdgeRepulsion)
-{
- *OmKrepulsion = K0;
- *OmKrepulsionBearing = n0;
- *OmKfriction = K1;
- *OmKbestPositionAttraction = K2;
- *OmKscreenEdgeRepulsion = K3;
-}
-
-void
-OmGetMinParam(double *OmKminRepulsion,
- double *OmKminRepulsionBearing,
- double *OmKminFriction,
- double *OmKminBestPositionAttraction,
- double *OmKminScreenEdgeRepulsion)
-{
- *OmKminRepulsion = K0min;
- *OmKminRepulsionBearing = n0min;
- *OmKminFriction = K1min;
- *OmKminBestPositionAttraction = K2min;
- *OmKminScreenEdgeRepulsion = K3min;
-}
-
-void
-OmGetMaxParam(double *OmKmaxRepulsion,
- double *OmKmaxRepulsionBearing,
- double *OmKmaxFriction,
- double *OmKmaxBestPositionAttraction,
- double *OmKmaxScreenEdgeRepulsion)
-{
- *OmKmaxRepulsion = K0max;
- *OmKmaxRepulsionBearing = n0max;
- *OmKmaxFriction = K1max;
- *OmKmaxBestPositionAttraction = K2max;
- *OmKmaxScreenEdgeRepulsion = K3max;
-}
-
-
-/*
- ***************************************************************************
- *
- * SetupLeaderPosition --
- * Setup leader position for new tracks.
- *
- ***************************************************************************
- */
-static void
-SetupLeaderPosition(int iw,
- int ip)
-{
- double X10, Y10, X20, Y20;
- double D, k, Fx0, Fy0;
- int jp;
- double alpha;
- BOOLEAN ok = FALSE;
- double dx = 0, dy = 0;
-
- Fx0 = 0.0;
- Fy0 = 0.0;
-
- for (jp = 0; jp < wr[iw].NBinfos; jp++) {
- if (wr[iw].infos[jp].New_Track == FALSE) {
- X10 = (double) (wr[iw].infos[ip].x - wr[iw].infos[jp].x - wr[iw].infos[jp].dx);
- Y10 = (double) (wr[iw].infos[ip].y - wr[iw].infos[jp].y - wr[iw].infos[jp].dy);
- X20 = ((double) (wr[iw].infos[ip].x - wr[iw].infos[jp].x) -
- (double) (wr[iw].infos[jp].dx) * COEF1 +
- (double) (wr[iw].infos[jp].dy) * COEF2);
- Y20 = ((double) (wr[iw].infos[ip].y - wr[iw].infos[jp].y) -
- (double) (wr[iw].infos[jp].dy) * COEF1 -
- (double) (wr[iw].infos[jp].dx) * COEF2);
-
- D = X10 * X10 + Y10 * Y10;
- if (D > limit_distance) {
- k = K0 / (sqrt(D) * pow(D, n0 - 1.0));
- Fx0 += X10 * k;
- Fy0 += Y10 * k;
- }
- D = X20 * X20 + Y20 * Y20;
- if (D > limit_distance) {
- k = K0 / (sqrt(D) * pow(D, n0 - 1.0));
- Fx0 += X20 * k;
- Fy0 += Y20 * k;
- }
- }
- }
- if ((Fx0 == 0) && (Fy0 == 0)) {
- Fx0 = 1;
- }
-
- k = (double) (wr[iw].infos[ip].rho) / sqrt(Fx0*Fx0 + Fy0*Fy0);
-
- wr[iw].infos[ip].dx = (int) (Fx0 * k);
- wr[iw].infos[ip].dy = (int) (Fy0 * k);
- wr[iw].infos[ip].alpha = ProjToAngle((int) (Fx0*k), (int) (Fy0*k));
-
- alpha = wr[iw].infos[ip].alpha;
- while ((alpha < wr[iw].infos[ip].alpha + 2.0*M_PI) && (ok == FALSE)) {
- dx = (double) (wr[iw].infos[ip].rho) * cos(alpha);
- dy = (double) (wr[iw].infos[ip].rho) * sin(alpha);
- ok = TRUE;
-
- for (jp = 0; jp < wr[iw].NBinfos; jp++) {
- if (wr[iw].infos[jp].New_Track == FALSE) {
- X10 = (double) (wr[iw].infos[ip].x + (int) dx -
- wr[iw].infos[jp].x - wr[iw].infos[jp].dx);
- Y10 = (double) (wr[iw].infos[ip].y + (int) dy -
- wr[iw].infos[jp].y - wr[iw].infos[jp].dy);
- D = X10 * X10 + Y10 * Y10;
- if (D < placing_min_dist) {
- ok = FALSE;
- }
- }
- }
- alpha += placing_step;
- }
- if (ok) {
- wr[iw].infos[ip].dx = (int) dx;
- wr[iw].infos[ip].dy = (int) dy;
- wr[iw].infos[ip].alpha = ProjToAngle((int) dx, (int) dy);
- }
-}
-
-
-/*
- ***************************************************************************
- *
- * ComputeRepulsion --
- * Compute the moment of the repulsion forces of all the other
- * tracks.
- *
- ***************************************************************************
- */
-static double
-ComputeRepulsion(int iw,
- int ip)
-{
- double X10, Y10, X00, Y00, X11, Y11, X01, Y01;
- double D0, D1, k, Fx0, Fy0, Fx1, Fy1;
- int jp;
-
- X00 = (double) (wr[iw].infos[ip].x + wr[iw].infos[ip].dx);
- Y00 = (double) (wr[iw].infos[ip].y + wr[iw].infos[ip].dy);
- X01 = ((double) (wr[iw].infos[ip].x) +
- (double) (wr[iw].infos[ip].dx) * COEF1 -
- (double) (wr[iw].infos[ip].dy) * COEF2);
- Y01 = ((double) (wr[iw].infos[ip].y) +
- (double) (wr[iw].infos[ip].dy) * COEF1 +
- (double) (wr[iw].infos[ip].dx) * COEF2);
- Fx0 = 0.0;
- Fy0 = 0.0;
- Fx1 = 0.0;
- Fy1 = 0.0;
-
- for (jp = 0; jp < wr[iw].NBinfos; jp++) {
- if ( ip != jp ) {
- X10 = (double) (wr[iw].infos[jp].x + wr[iw].infos[jp].dx);
- Y10 = (double) (wr[iw].infos[jp].y + wr[iw].infos[jp].dy);
- X11 = ((double) (wr[iw].infos[jp].x) +
- (double) (wr[iw].infos[jp].dx) * COEF1 -
- (double) (wr[iw].infos[jp].dy) * COEF2);
- Y11 = ((double) (wr[iw].infos[jp].y) +
- (double) (wr[iw].infos[jp].dy) * COEF1 +
- (double) (wr[iw].infos[jp].dx) * COEF2);
-
- D0 = (X10 - X00) * (X10 - X00) + (Y10 - Y00) * (Y10 - Y00);
- if (D0 > limit_distance) {
- k = K0 / (sqrt(D0) * pow(D0, n0 - 1.0));
- Fx0 += (X10 - X00) * k;
- Fy0 += (Y10 - Y00) * k;
- }
- D1 = (X11 - X01) * (X11 - X01) + (Y11 - Y01) * (Y11 - Y01);
- if (D1 > limit_distance) {
- k = K0 / (sqrt(D1) * pow(D1, n0 - 1.0));
- Fx1 += (X11 - X01) * k;
- Fy1 += (Y11 - Y01) * k;
- }
- }
- }
-
- return -((double) (wr[iw].infos[ip].dx) * Fy0 -
- (double) (wr[iw].infos[ip].dy) * Fx0 +
- (double) (wr[iw].infos[ip].dx) * COEF1 * Fy1 -
- (double) (wr[iw].infos[ip].dy) * COEF2 * Fy1 -
- (double) (wr[iw].infos[ip].dy) * COEF1 * Fx1 -
- (double) (wr[iw].infos[ip].dx) * COEF2 * Fx1);
-}
-
-
-/*
- ***************************************************************************
- *
- * ComputeFriction --
- * Compute the moment of the friction force.
- *
- ***************************************************************************
- */
-static double
-ComputeFriction(int iw,
- int ip)
-{
- return (double) (-K1 * wr[iw].infos[ip].alpha_point);
-}
-
-
-/*
- ***************************************************************************
- *
- * ComputeDrawback --
- * Compute the moment of the best positions drawback forces.
- *
- ***************************************************************************
- */
-static double
-ComputeDrawback(int iw,
- int ip)
-{
- int vx, vy, dx, dy;
- double m = 0;
- double nd = 1.0, nv = 1.0;
- double vi;
-
- vx = wr[iw].infos[ip].vv_dx;
- vy = wr[iw].infos[ip].vv_dy;
- dx = wr[iw].infos[ip].dx;
- dy = wr[iw].infos[ip].dy;
-
- if ((vx != 0) || (vy != 0)) {
- nv = sqrt((double)(vx * vx + vy * vy));
- }
- if ((dx != 0) || (dy != 0)) {
- nd = sqrt((double)(dx * dx + dy * dy));
- }
-
- vi = (double) (vx * dx + vy * dy)/(nd * nv);
- vi = vi <= -1.0 ? -1.0 : vi;
- vi = vi >= 1.0 ? 1.0 : vi;
- vi = 3 * M_PI_4 - acos(vi);
-
- if (vy * dx - vx * dy < 0) {
- m = -vi;
- }
- else {
- m = vi;
- }
-
- return (double) (-K2 * m);
-}
-
-
-/*
- ***************************************************************************
- *
- * ComputeDrawbackInView --
- * Compute the moment of the keep in view forces.
- *
- ***************************************************************************
- */
-static double
-DrawbackDirection(int vx,
- int vy,
- int dx,
- int dy)
-{
- double m=0;
- double nd=1.0, nv=1.0;
- double vi;
-
- if ((vx != 0) || (vy != 0)) {
- nv = sqrt((double)(vx * vx + vy * vy));
- }
- if ((dx != 0) || (dy != 0)) {
- nd = sqrt((double)(dx * dx + dy * dy));
- }
-
- vi = (double) (vx * dx + vy * dy)/(nd * nv);
- vi = vi <= -1.0 ? -1.0 : vi;
- vi = vi >= 1.0 ? 1.0 : vi;
- vi = acos(vi);
-
- if (vy * dx - vx * dy < 0) {
- m = vi;
- }
- else {
- m = - vi;
- }
-
- return (double) (-K3 * m);
-}
-
-
-static double
-ComputeDrawbackInView(int iw,
- int ip,
- int width,
- int height)
-{
- int r=50;
- int dx, dy;
- double Gamma=0;
-
- r = wr[iw].infos[ip].rho;
- dx = wr[iw].infos[ip].dx;
- dy = wr[iw].infos[ip].dy;
-
- if (abs(wr[iw].infos[ip].x) < r) {
- Gamma += DrawbackDirection(53, 0, dx, dy);
- }
- if (abs(wr[iw].infos[ip].x - width) < r) {
- Gamma += DrawbackDirection(-53, 0, dx, dy);
- }
- if (abs(wr[iw].infos[ip].y ) < r) {
- Gamma += DrawbackDirection(0, 53, dx, dy);
- }
- if (abs(wr[iw].infos[ip].y - height) < r) {
- Gamma += DrawbackDirection(0,- 53, dx, dy);
- }
-
- return (double) Gamma;
-}
-
-/*
- ***************************************************************************
- *
- * RefineSetup --
- * Refine setup for far spaced tracks.
- *
- ***************************************************************************
- */
-static void
-RefineSetup(int iw,
- int ip)
-{
- double acceleration;
- int i;
-
- for (i = 0; i <= 10; i++) {
- acceleration = ComputeRepulsion(iw, ip) + ComputeDrawback(iw, ip);
-
- if (acceleration > 100) {
- acceleration = 100;
- }
- if (acceleration < -100) {
- acceleration = -100;
- }
-
- wr[iw].infos[ip].alpha_point = acceleration * DELTA_T + wr[iw].infos[ip].alpha_point;
- wr[iw].infos[ip].alpha_point += ComputeFriction(iw, ip) * DELTA_T;
-
- if (wr[iw].infos[ip].alpha_point > 30) {
- wr[iw].infos[ip].alpha_point = 30;
- }
- if (wr[iw].infos[ip].alpha_point < -30) {
- wr[iw].infos[ip].alpha_point = -30;
- }
-
- wr[iw].infos[ip].alpha = wr[iw].infos[ip].alpha_point * DELTA_T + wr[iw].infos[ip].alpha;
- }
-}
-
-
-/*
- ***************************************************************************
- *
- * OmProcessOverlap --
- * Overlap Manager main function.
- *
- ***************************************************************************
- */
-void
-OmProcessOverlap(void *zinc,
- int width,
- int height,
- double scale)
-{
- double acceleration = 0.0;
- int ip, iw;
-
- if (NBzincs != 0 && FindPosW(zinc, &iw) == TRUE) {
- ReadTracks(iw);
-
- for (ip = 0; ip < wr[iw].NBinfos; ip++) {
- if (wr[iw].infos[ip].New_Track == TRUE) {
- SetupLeaderPosition(iw, ip);
- RefineSetup(iw, ip);
- wr[iw].infos[ip].New_Track = FALSE;
- }
- }
-
- for (ip = 0; ip < wr[iw].NBinfos; ip++) {
- acceleration = (ComputeRepulsion(iw, ip) + ComputeDrawback(iw, ip) +
- ComputeDrawbackInView(iw, ip, width, height));
-
- if (acceleration > 100) {
- acceleration = 100;
- }
- if (acceleration < -100) {
- acceleration = -100;
- }
-
- wr[iw].infos[ip].alpha_point += acceleration * DELTA_T ;
- wr[iw].infos[ip].alpha_point += ComputeFriction(iw, ip) * DELTA_T ;
-
- if (wr[iw].infos[ip].alpha_point > 30) {
- wr[iw].infos[ip].alpha_point = 30;
- }
- if (wr[iw].infos[ip].alpha_point < -30) {
- wr[iw].infos[ip].alpha_point = -30;
- }
-
- wr[iw].infos[ip].alpha += wr[iw].infos[ip].alpha_point * DELTA_T ;
- wr[iw].infos[ip].theta = (int) RadianToDegrees360(-wr[iw].infos[ip].alpha +
- ProjToAngle(wr[iw].infos[ip].vv_dx,
- wr[iw].infos[ip].vv_dy)
- - M_PI_2);
-
- /*
- if (wr[iw].infos[ip].theta > 75 && wr[iw].infos[ip].theta < 105) {
- if (wr[iw].infos[ip].alpha_point > 0) {
- wr[iw].infos[ip].theta = 105;
- }
- else {
- wr[iw].infos[ip].theta = 75;
- }
- }
-
- if (wr[iw].infos[ip].theta > 255 && wr[iw].infos[ip].theta < 285) {
- if (wr[iw].infos[ip].alpha_point > 0) {
- wr[iw].infos[ip].theta = 285;
- }
- else {
- wr[iw].infos[ip].theta = 255;
- }
- }
- */
-
- (*wr[iw]._set_label_angle) (wr[iw].rw, wr[iw].infos[ip].id,
- 120, wr[iw].infos[ip].theta);
- /* wr[iw].infos[ip].rho*/
- }
- }
-}