source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/carte.c@ 637

Last change on this file since 637 was 637, checked in by ansari, 26 years ago

archediab version 24 initial import

File size: 6.0 KB
RevLine 
[637]1#include "diabolo.h"
2#include "synchro.h"
3#include "carte.h"
4
5
6
7#define indicemax 1000
8
9double taille_carte,pas,vitesse;
10int bolo_carte,indice,ind_moy,debut_ligne,moy,sens_ligne;
11double dynamique;
12double seuil;
13
14double carte[nb_max_bolo][indicemax];
15double xx[indicemax];
16double yy[indicemax];
17int flag_fin[indicemax],flag_sens[indicemax];
18
19double xx0,yy0;
20
21
22//-------------------- fonction exec de la fenetre : trace_carte -------------------------------
23void echelles(void);
24void retrace_carte(void);
25
26void exec_carte(int fen,int item,double valeur,...)
27{
28if(item>1000) item-=1000; // pour appeler le case pour tous les cara d'un edit texte
29
30switch(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
62void echelles(void)
63{
64double moyenne_double;
65taille_carte=litD(fenetre_annexe,cart_taille_carte,0);
66pas=litD(fenetre_annexe,cart_pas,0);
67vitesse=litD(fenetre_annexe,cart_vitesse,0);
68dynamique=litD(fenetre_annexe,cart_dynamique,0);
69bolo_carte=litD(fenetre_annexe,cart_bolo,0);
70selectgra(fenetre_annexe);
71graph->ymin=-0.5*(taille_carte+2*pas);
72graph->ymax=0.5*(taille_carte+2*pas);
73graph->ypas=pas;
74graph->xmin=-0.5*(taille_carte+2*pas);
75graph->xmax=0.5*(taille_carte+2*pas);
76graph->xpas=pas;
77graph->graduations=0;
78graph->grille=1;
79graph->aspect=-1;
80efface(fenetre_annexe);
81// moyennes par demi pas en x
82moyenne_double= pas * 0.5 /( gg->periode_echantillonage * vitesse );
83
84if(gg->trace_ouvert&32) moyenne_double/=(double)synchro_periode; // pour mesure avec Detection synchrone
85moy=(int)(moyenne_double+0.5);
86if(moy<1) moy=1;
87printf("moyennes calculee sur %6.2f points soit m=%d \n",moyenne_double,moy);
88}
89
90void trace_carte(double * y)
91{
92int 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
96if( (!(gg->don.sync[sync_scan]&&gg->don.sync[sync_subscan])) && (indice==0) ) return;
97
98if( (!gg->don.sync[sync_subscan]) && (indice>2) && (debut_ligne<3) ) debut_ligne=2; // entre deux subscan
99
100if(ind_moy==0) for(j=0;j<nb_max_bolo;j++) carte[j][indice]=0;
101if(ind_moy<moy) for(j=0;j<nb_max_bolo;j++) carte[j][indice]+=y[j];
102if(ind_moy<moy+10) ind_moy++; // pour ne pas continuer a l'infini
103
104if( (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
157void retrace_carte(void)
158{
159int i,k,kk,couleur_degrade;
160double sx,sy,sx2,sxy,n,a,b; // pour le fit lineaire
161efface(fenetre_annexe);
162// calcul dynamique automatique
163dynamique=0.000000001;
164
165for(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
202ecritD( fenetre_annexe,cart_dynamique,"%g",dynamique);
203
204for(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
Note: See TracBrowser for help on using the repository browser.