Add here a paragraph of the function description.
/* scopxyz Scicos 3d visualization block * Type 2 simulation function ver 1.0 - scilab-2.6&2.7 * 24 octobre 2003 - IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #define PI0 (integer *) 0 #define PD0 (double *) 0 #include "machine.h" #include <stdio.h> #include <stdlib.h> /* Cette fonction de simulation est un oscilloscope à 3 dimensions. * Elle permet l'observation de l'évolution d'une trajectoire dont * les valeurs des coordonnées x,y,z, en chaque instant de déclenchement * de la fonction, sont présentes sur les entrées u1,u2 et u3. * Cette fonction utilise la routines graphique param3d1. * A chaque coup d'horloge, les valeurs des coordonnées sont stockée dans * le buffer z[]. La taille totale de z est 3*buffer_size + 1. Un compteur * est incrémenté jusqu'a sa valeur finale buffer_size et lorsque cette valeur * est atteinte, le contenu du buffer z est envoyé à la routine param3d1. * * Entrées régulières : u1[0], u2[0] et u3[0] sont les coordonnées du point. * Soties régulières : néant. * Entrée évènementielle : Instant de déclenchement. * Sortie évènementielle : néant. * Registre interne (taille (3*buffer_size)+1) * z[0..buffer_size-1] : x * z[buffer_size..2*buffer_size-1] : y * z[2*buffer_size..3*buffer_size-1] : z * z[3*buffer_size] : compteur échantillons * * Integer Parameter * ipar[0] : window number * ipar[1] : color flag * ipar[2] : buffer_size * ipar[3] : dash,color or mark choice * ipar[4] : line or mark size * ipar[5..6] : position of window * ipar[7..8] : size of window * ipar[9] : type * ipar[10] : box * ipar[11] : GRAPH_label_size (length of axes captions) * ipar[12..12+ipar[11]] : Char code of axes captions * * Real Parameter * rpar[0] : xmin * rpar[1] : xmax * rpar[2] : ymin * rpar[3] : ymax * rpar[4] : zmin * rpar[5] : zmax * rpar[6] : alpha * rpar[7] : theta */ /*prototype*/ void scopxyz(flag,nevprt,t,xd,x,nx,z,nz,tvec,ntvec,rpar,nrpar, ipar,nipar,inptr,insz,nin,outptr,outsz,nout) integer *flag,*nevprt,*nx,*nz,*ntvec,*nrpar,ipar[],*nipar,insz[],*nin,outsz[],*nout; double x[],xd[],z[],tvec[],rpar[]; double *inptr[],*outptr[],*t; { /* Déclaration des variables * Variables compteur */ int i,j,k; /*Pour paramètres réels*/ double xmin,xmax,ymin,ymax,zmin,zmax,alpha,theta; /*Pour paramatères entiers*/ int wid,graphcolor,wpos[2],wdim[2],buffer_size,option; int GRAPH_label_size,GRAPH_label_CODE[40]; /*Autres*/ char name[4]; /*Chaine de caractères pour le nom du driver graphique*/ char buf[41]; /*Chaine pour recevoir la légende*/ int eflag[3]; /*Flag pour param3d1*/ double rect[6]; /*Tableau double pour les coordonnées de la fenetre*/ int ww,verbose=0,narg; /*Parametres entiers pour passage paramètre*/ double *u1,*u2,*u3; int *style; style = (int *) malloc(sizeof(int)*ipar[2]); /*Récupération de l'adresse du port d'entrée régulier*/ u1=(double *)inptr[0]; u2=(double *)inptr[1]; u3=(double *)inptr[2]; /*Récupération des paramètres entiers*/ wid=ipar[0]; graphcolor=ipar[1]; buffer_size=ipar[2]; wpos[0]=ipar[5]; wpos[1]=ipar[6]; wdim[0]=ipar[7]; wdim[1]=ipar[8]; GRAPH_label_size=ipar[11]; /*Récupération des paramètres réels*/ xmin=rpar[0];xmax=rpar[1]; ymin=rpar[2];ymax=rpar[3]; zmin=rpar[4];zmax=rpar[5]; alpha=rpar[6]; theta=rpar[7]; /*Place xmin,xmax,ymin,ymax,zmin,zmax dans rect[]*/ rect[0]=xmin;rect[1]=xmax;rect[2]=ymin;rect[3]=ymax; rect[4]=zmin;rect[5]=zmax; /*Initialise eflag (à quoi sert eflag[0]?,eflag[2]->type,eflag[3]->box)*/ eflag[0]=1;eflag[1]=ipar[9];eflag[2]=ipar[10]; /*Le flag2 place u[] dans z[] et affiche z[] si nécéssaire*/ if(*flag==2) { /*récupère valeur compteur échantillons dans k*/ k=(int)z[3*buffer_size]; /*Place u[] dans z[]*/ z[k]=u1[0]; z[buffer_size+k]=u2[0]; z[2*buffer_size+k]=u3[0]; /*Incrémente compteur échantillons*/ z[3*buffer_size]++; /* Test la valeur compteur échantillons * pour savoir si celle ci a atteint la valeur buffer_size */ if(z[3*buffer_size]==buffer_size) { /*Retourne le numéro de fenetre active dans ww*/ C2F(dr1)("xget","window",&verbose,&ww,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Assigne le numéro de fenetre wid si nécéssaire*/ if(ww!=wid) C2F(dr1)("xset","window",&wid,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Récupère la légende des axes*/ for(i=0;i<ipar[11];i++) GRAPH_label_CODE[i]=ipar[12+i]; buf[ipar[11]]='\0'; /*Converti les codes de la légende en caractère*/ C2F(cvstr)(&GRAPH_label_size,&GRAPH_label_CODE[0],&buf[0],(j=1,&j)); /*buf[0]='@';buf[1]='@';buf[2]='Y';buf[3]='@';buf[4]='Z';buf[5]='a';buf[6]='\0';*/ /*Affectation de style[]*/ for (j=0;j<ipar[2];j++) style[j]=graphcolor; /*Execute param3d1*/ C2F(param3d1)(&z[0],&z[buffer_size],&z[2*buffer_size],&buffer_size,(j=1,&j),(k=1,&k),&style[0],&theta,&alpha,&buf,&eflag,&rect,0L); /* Teste la valeur de graphcolor pour eviter un tracé * discontinu si la valeur est >0 */ if(graphcolor<=0) /*RAZ compteur échantillons*/ z[3*buffer_size]=0; else { /*Place valeur compteur échantillons à 1*/ z[3*buffer_size]=1; /*Recopie derniers echantillons dans z[0],z[buffer_size] et z[2*buffer_size]*/ z[0]=u1[0]; z[buffer_size]=u2[0]; z[2*buffer_size]=u3[0]; } } } /*le flag4 initialise la fenetre graphique*/ else if(*flag==4) { /* Vérification du driver graphique * Le nom du driver est retourné dans la variable name */ C2F(dr1)("xgetdr",name,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*fprintf(stderr,"name=%s\n", name);*/ /*Change le driver en position Rec si nécéssaire*/ if(name!="Rec") C2F(dr1)("xsetdr","Rec",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Je sais pas ce que cela fait sciwin()?!? (j'ai pas trouvé le code)*/ C2F(sciwin)(); /*Retourne le numéro de fenetre active dans ww*/ C2F(dr1)("xget","window",&verbose,&ww,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Assigne le numéro de fenetre wid si nécéssaire*/ if(ww!=wid) C2F(dr1)("xset","window",&wid,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Teste la position de la fenetre et replace la si necessaire*/ if((wpos[0]>=0)&&(wpos[1]>0)) C2F(dr1)("xset","wpos",&wpos[0],&wpos[1],PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Teste la dimension de la fenetre et redimensionne la si nécessaire*/ if((wdim[0]>=0)&&(wdim[1]>0)) C2F(dr1)("xset","wdim",&wdim[0],&wdim[1],PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Reassigne la fenetre pour forcer les changements*/ C2F(dr1)("xset","window",&wid,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Assigne la couleur*/ C2F(dr1)("xset","use color",&graphcolor,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Place le flag wresize pour redimensionner automatiquement la fenetre*/ C2F(dr1)("xset","wresize",(j=1,&j),PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Initialise la fonction logique pour dessiner (?)*/ C2F(dr1)("xset","alufunction",(j=3,&j),PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Efface la fenetre courante*/ C2F(dr1)("xclear","v",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Que fait xstart?*/ C2F(dr)("xstart","v",&wid,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Récupère la légende*/ for(i=0;i<ipar[11];i++) GRAPH_label_CODE[i]=ipar[12+i]; buf[ipar[11]]='\0'; /*Converti les codes de la légende en caractère*/ C2F(cvstr)(&GRAPH_label_size,&GRAPH_label_CODE[0],&buf[0],(j=1,&j)); /*Initialise le type de tracé*/ C2F(dr1)("xset","dashes",(j=0,&j),PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Affectation de style[]*/ for (j=0;j<ipar[2];j++) style[j]=graphcolor; /*Execute param3d1*/ C2F(param3d1)(&z[0],&z[buffer_size],&z[2*buffer_size],&buffer_size,(j=1,&j),(k=0,&k),&style,&theta,&alpha,&buf,&eflag,&rect,0L); /*Applique la légende au titre de la fenetre*/ /*C2F(dr)("xname",&buf,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);*/ } free(style); }