| [637] | 1 | #include "diabolo.h" | 
|---|
|  | 2 | #include "synchro.h" | 
|---|
|  | 3 | #include "carte.h" | 
|---|
|  | 4 |  | 
|---|
|  | 5 |  | 
|---|
|  | 6 |  | 
|---|
|  | 7 | #define indicemax       1000 | 
|---|
|  | 8 |  | 
|---|
|  | 9 | double taille_carte,pas,vitesse; | 
|---|
|  | 10 | int bolo_carte,indice,ind_moy,debut_ligne,moy,sens_ligne; | 
|---|
|  | 11 | double dynamique; | 
|---|
|  | 12 | double seuil; | 
|---|
|  | 13 |  | 
|---|
|  | 14 | double carte[nb_max_bolo][indicemax]; | 
|---|
|  | 15 | double  xx[indicemax]; | 
|---|
|  | 16 | double  yy[indicemax]; | 
|---|
|  | 17 | int     flag_fin[indicemax],flag_sens[indicemax]; | 
|---|
|  | 18 |  | 
|---|
|  | 19 | double xx0,yy0; | 
|---|
|  | 20 |  | 
|---|
|  | 21 |  | 
|---|
|  | 22 | //--------------------  fonction  exec  de  la  fenetre : trace_carte  ------------------------------- | 
|---|
|  | 23 | void    echelles(void); | 
|---|
|  | 24 | void    retrace_carte(void); | 
|---|
|  | 25 |  | 
|---|
|  | 26 | void exec_carte(int fen,int item,double valeur,...) | 
|---|
|  | 27 | { | 
|---|
|  | 28 | if(item>1000) item-=1000;               // pour appeler le case pour tous les cara d'un edit texte | 
|---|
|  | 29 |  | 
|---|
|  | 30 | switch(item) | 
|---|
|  | 31 | { | 
|---|
|  | 32 | case ouverture     :    gg->trace_ouvert=gg->trace_ouvert | 16 ; | 
|---|
|  | 33 | selectgra(fen); | 
|---|
|  | 34 | graph->taille_graduations=7; | 
|---|
|  | 35 |  | 
|---|
|  | 36 | case cart_debut :       echelles(); | 
|---|
|  | 37 | indice=0;ind_moy=0;sens_ligne=1;debut_ligne=1;  // premier point a venir | 
|---|
|  | 38 | xx0=-0.5*(taille_carte-0.5*pas);yy0=-0.5*taille_carte; | 
|---|
|  | 39 | break; | 
|---|
|  | 40 |  | 
|---|
|  | 41 |  | 
|---|
|  | 42 |  | 
|---|
|  | 43 | case fermeture     :    gg->trace_ouvert=gg->trace_ouvert & (255-16);           // enleve le 16 | 
|---|
|  | 44 | break; | 
|---|
|  | 45 |  | 
|---|
|  | 46 | case cart_taille_carte : | 
|---|
|  | 47 | case cart_pas : | 
|---|
|  | 48 | case cart_dynamique : | 
|---|
|  | 49 | case cart_bolo : | 
|---|
|  | 50 | case cart_vitesse :     echelles(); | 
|---|
|  | 51 |  | 
|---|
|  | 52 | break; | 
|---|
|  | 53 |  | 
|---|
|  | 54 | case cart_retrace :     retrace_carte(); | 
|---|
|  | 55 | break; | 
|---|
|  | 56 |  | 
|---|
|  | 57 | default  :              break; | 
|---|
|  | 58 | } | 
|---|
|  | 59 | } | 
|---|
|  | 60 |  | 
|---|
|  | 61 |  | 
|---|
|  | 62 | void echelles(void) | 
|---|
|  | 63 | { | 
|---|
|  | 64 | double moyenne_double; | 
|---|
|  | 65 | taille_carte=litD(fenetre_annexe,cart_taille_carte,0); | 
|---|
|  | 66 | pas=litD(fenetre_annexe,cart_pas,0); | 
|---|
|  | 67 | vitesse=litD(fenetre_annexe,cart_vitesse,0); | 
|---|
|  | 68 | dynamique=litD(fenetre_annexe,cart_dynamique,0); | 
|---|
|  | 69 | bolo_carte=litD(fenetre_annexe,cart_bolo,0); | 
|---|
|  | 70 | selectgra(fenetre_annexe); | 
|---|
|  | 71 | graph->ymin=-0.5*(taille_carte+2*pas); | 
|---|
|  | 72 | graph->ymax=0.5*(taille_carte+2*pas); | 
|---|
|  | 73 | graph->ypas=pas; | 
|---|
|  | 74 | graph->xmin=-0.5*(taille_carte+2*pas); | 
|---|
|  | 75 | graph->xmax=0.5*(taille_carte+2*pas); | 
|---|
|  | 76 | graph->xpas=pas; | 
|---|
|  | 77 | graph->graduations=0; | 
|---|
|  | 78 | graph->grille=1; | 
|---|
|  | 79 | graph->aspect=-1; | 
|---|
|  | 80 | efface(fenetre_annexe); | 
|---|
|  | 81 | // moyennes par demi pas en x | 
|---|
|  | 82 | moyenne_double= pas * 0.5 /( gg->periode_echantillonage * vitesse ); | 
|---|
|  | 83 |  | 
|---|
|  | 84 | if(gg->trace_ouvert&32)         moyenne_double/=(double)synchro_periode;        // pour mesure avec Detection synchrone | 
|---|
|  | 85 | moy=(int)(moyenne_double+0.5); | 
|---|
|  | 86 | if(moy<1) moy=1; | 
|---|
|  | 87 | printf("moyennes calculee sur %6.2f points  soit m=%d \n",moyenne_double,moy); | 
|---|
|  | 88 | } | 
|---|
|  | 89 |  | 
|---|
|  | 90 | void trace_carte(double * y) | 
|---|
|  | 91 | { | 
|---|
|  | 92 | int j; | 
|---|
|  | 93 | // calculer le nombre de points de mesure dans un pas a la vitesse | 
|---|
|  | 94 | //      gg->periode_echantillonage      contient la duree entre deux points de mesure (pour diabolo) | 
|---|
|  | 95 |  | 
|---|
|  | 96 | if( (!(gg->don.sync[sync_scan]&&gg->don.sync[sync_subscan])) && (indice==0) ) return; | 
|---|
|  | 97 |  | 
|---|
|  | 98 | if( (!gg->don.sync[sync_subscan]) && (indice>2) && (debut_ligne<3) ) debut_ligne=2;     // entre deux subscan | 
|---|
|  | 99 |  | 
|---|
|  | 100 | if(ind_moy==0)  for(j=0;j<nb_max_bolo;j++)      carte[j][indice]=0; | 
|---|
|  | 101 | if(ind_moy<moy) for(j=0;j<nb_max_bolo;j++)      carte[j][indice]+=y[j]; | 
|---|
|  | 102 | if(ind_moy<moy+10) ind_moy++;   // pour ne pas continuer a l'infini | 
|---|
|  | 103 |  | 
|---|
|  | 104 | if( (ind_moy>=moy) && (indice<indicemax) ) | 
|---|
|  | 105 | { | 
|---|
|  | 106 | if(ind_moy==moy) | 
|---|
|  | 107 | { | 
|---|
|  | 108 | int couleur_degrade; | 
|---|
|  | 109 | xx[indice]=xx0; | 
|---|
|  | 110 | yy[indice]=yy0; | 
|---|
|  | 111 | flag_fin[indice]=debut_ligne; | 
|---|
|  | 112 | flag_sens[indice]=sens_ligne; | 
|---|
|  | 113 | for(j=0;j<nb_max_bolo;j++)      carte[j][indice]/=(double)moy; | 
|---|
|  | 114 |  | 
|---|
|  | 115 | //              if(debut_ligne==1)      seuil=carte[bolo-1][indice];    // premier point d'une ligne : seuil pour la suite | 
|---|
|  | 116 | seuil=0;        // pas de seuil: utiliser le filtrage en mode puissance totale | 
|---|
|  | 117 | //  et raz parasite  en mode detection synchrone | 
|---|
|  | 118 | couleur_degrade=1050+(50.*(carte[bolo_carte-1][indice]-seuil)/dynamique); | 
|---|
|  | 119 | if(sens_ligne>0)rectangle(fenetre_annexe,xx0-0.25*pas,yy0-0.5*pas,xx0+0.25*pas,yy0,couleur_degrade); | 
|---|
|  | 120 | else    rectangle(fenetre_annexe,xx0-0.25*pas,yy0,xx0+0.25*pas,yy0+0.5*pas,couleur_degrade); | 
|---|
|  | 121 | if(debut_ligne==1) | 
|---|
|  | 122 | { | 
|---|
|  | 123 | debut_ligne=0;  // premier point | 
|---|
|  | 124 | printf(" debut_ligne indice=%d :  x=%g  y=%g   valeur=%g  couleur=%d \n",indice,xx0,yy0,carte[8][indice],couleur_degrade); | 
|---|
|  | 125 | } | 
|---|
|  | 126 | indice++; | 
|---|
|  | 127 | } | 
|---|
|  | 128 |  | 
|---|
|  | 129 |  | 
|---|
|  | 130 | if( (debut_ligne==2) && (!gg->don.sync[sync_scan]) ) | 
|---|
|  | 131 | { | 
|---|
|  | 132 | debut_ligne=3;  // fin de carte | 
|---|
|  | 133 | son(133); | 
|---|
|  | 134 | printf("fin de carte \n\n"); | 
|---|
|  | 135 | } | 
|---|
|  | 136 |  | 
|---|
|  | 137 | if(gg->don.sync[sync_subscan]) | 
|---|
|  | 138 | { | 
|---|
|  | 139 | if(debut_ligne==2)      // prepare pour mesure premier point | 
|---|
|  | 140 | { | 
|---|
|  | 141 | sens_ligne=-sens_ligne; | 
|---|
|  | 142 | if(sens_ligne>0) yy0+=pas; | 
|---|
|  | 143 | xx0=-0.5*sens_ligne*(taille_carte-0.5*pas); | 
|---|
|  | 144 | debut_ligne=1;   ind_moy=0;     // premier point | 
|---|
|  | 145 | } | 
|---|
|  | 146 | if(!debut_ligne)        // prepare pour mesure point suivant | 
|---|
|  | 147 | { | 
|---|
|  | 148 | xx0+=sens_ligne*0.5*pas; | 
|---|
|  | 149 | if( (xx0<0.5*taille_carte) && (xx0>-0.5*taille_carte) ) ind_moy=0; | 
|---|
|  | 150 | } | 
|---|
|  | 151 | } | 
|---|
|  | 152 | } | 
|---|
|  | 153 |  | 
|---|
|  | 154 | } | 
|---|
|  | 155 |  | 
|---|
|  | 156 |  | 
|---|
|  | 157 | void    retrace_carte(void) | 
|---|
|  | 158 | { | 
|---|
|  | 159 | int i,k,kk,couleur_degrade; | 
|---|
|  | 160 | double sx,sy,sx2,sxy,n,a,b;             // pour le fit lineaire | 
|---|
|  | 161 | efface(fenetre_annexe); | 
|---|
|  | 162 | //  calcul dynamique automatique | 
|---|
|  | 163 | dynamique=0.000000001; | 
|---|
|  | 164 |  | 
|---|
|  | 165 | for(i=0;i<indice;i+=kk) | 
|---|
|  | 166 | {                       //  une ligne commence en indice==i | 
|---|
|  | 167 | // fit lineaire avec un poid null au milieu  :  y= ax+b | 
|---|
|  | 168 | // | 
|---|
|  | 169 | //  calcule la droite a soustraire | 
|---|
|  | 170 | sx=0;sy=0;sx2=0;sxy=0;n=0; | 
|---|
|  | 171 | k=0; | 
|---|
|  | 172 | do      { | 
|---|
|  | 173 | //              printf(" i=%d  k=%d  carte=%g  \n",i,k,carte[bolo-1][i+k]); | 
|---|
|  | 174 | if( (xx[i+k]>0.25*taille_carte) ou (xx[i+k]<-0.25*taille_carte) ) | 
|---|
|  | 175 | { | 
|---|
|  | 176 | n++; | 
|---|
|  | 177 | sx+=xx[i+k]; | 
|---|
|  | 178 | sy+=carte[bolo_carte-1][i+k]; | 
|---|
|  | 179 | sx2+=xx[i+k]*xx[i+k]; | 
|---|
|  | 180 | sxy+=xx[i+k]*carte[bolo_carte-1][i+k]; | 
|---|
|  | 181 | } | 
|---|
|  | 182 | k++; | 
|---|
|  | 183 | } | 
|---|
|  | 184 | while ( (k<indice-i) &&  (flag_fin[i+k]!=1) ); | 
|---|
|  | 185 |  | 
|---|
|  | 186 | kk=k; // kk = longueur de ligne | 
|---|
|  | 187 | a=(sxy*n-sx*sy)/(sx2*n-sx*sx); b=(sy-a*sx)/n; | 
|---|
|  | 188 | //      printf(" une ligne indice i=%d  ligne de %d points a=%g  b=%g \n\n",i,kk,a,b); | 
|---|
|  | 189 |  | 
|---|
|  | 190 | //  soustrait la droite fittée sur la ligne et calcule la dynamique | 
|---|
|  | 191 | for(k=0;k<kk;k++) | 
|---|
|  | 192 | { | 
|---|
|  | 193 | carte[bolo_carte-1][i+k]-=a*xx[i+k]+b; | 
|---|
|  | 194 |  | 
|---|
|  | 195 | //              printf(" k=%d  carte/fittee=%g  \n",k,carte[bolo_carte-1][i+k]); | 
|---|
|  | 196 |  | 
|---|
|  | 197 | if(dynamique<carte[bolo_carte-1][i+k])  dynamique=carte[bolo_carte-1][i+k]; | 
|---|
|  | 198 | if(dynamique<-carte[bolo_carte-1][i+k])  dynamique=-carte[bolo_carte-1][i+k]; | 
|---|
|  | 199 | } | 
|---|
|  | 200 | } | 
|---|
|  | 201 |  | 
|---|
|  | 202 | ecritD( fenetre_annexe,cart_dynamique,"%g",dynamique); | 
|---|
|  | 203 |  | 
|---|
|  | 204 | for(i=0;i<indice;i++) | 
|---|
|  | 205 | { | 
|---|
|  | 206 | couleur_degrade=1050+(50.*carte[bolo_carte-1][i]/dynamique); | 
|---|
|  | 207 | //      printf(" retrace : debut_ligne=%d i=%d :  x=%g  y=%g   valeur=%g  couleur=%d \n",debut_ligne,i,xx0,yy0,carte[8][i],couleur_degrade); | 
|---|
|  | 208 | if(flag_sens[i]>0)      rectangle(fenetre_annexe,xx[i]-0.25*pas,yy[i]-0.5*pas,xx[i]+0.25*pas,yy[i],couleur_degrade); | 
|---|
|  | 209 | else            rectangle(fenetre_annexe,xx[i]-0.25*pas,yy[i],xx[i]+0.25*pas,yy[i]+0.5*pas,couleur_degrade); | 
|---|
|  | 210 | } | 
|---|
|  | 211 | } | 
|---|
|  | 212 |  | 
|---|
|  | 213 |  | 
|---|
|  | 214 |  | 
|---|
|  | 215 |  | 
|---|
|  | 216 |  | 
|---|
|  | 217 |  | 
|---|
|  | 218 |  | 
|---|