MatOCAD Logo

Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages

TLista3D.cpp

Go to the documentation of this file.
00001 #include "../../../include/Grafico3d/ListaFx3D/TLista3D.h"
00002 
00003 
00004 TLista3D::TLista3D()
00005  { //Inizializzo il puntatore di testa e di coda della lista
00006 
00007    first=0;
00008    last=0;
00009    xmin=-5;
00010    xmax=5;
00011    ymin=-5;
00012    ymax=5;
00013    zmin=-5;
00014    zmax=5;
00015    risoluzione_r=50;
00016    risoluzione_c=50;
00017   //Inizializzo il numero di elementi della lista
00018    numeroelementi=0;
00019    bisogna_ricalcolare=0;
00020    altezza=300;
00021    larghezza=300;
00022 
00023  }
00024 //______________________________________________________________________________
00025  void TLista3D::NuovoNodo(wxColour color,
00026                           char *fx,
00027                           float** valori,
00028                           int flagdisegno,
00029                           float minRel,
00030                           float maxRel,
00031                           char grid,
00032                           char sfum){
00033      //Se la lista è vuota
00034 
00035    if(first==0)
00036    { //Alloco il primo elemento impostando ptrfine=ptrinizio
00037       first=(pr*)malloc(sizeof(pr));
00038       last=first;
00039    } else
00040    { //Aggiungo un nuovo elemento
00041       last->next=(pr*)malloc(sizeof(pr));
00042       last=last->next;
00043    }
00044      //Il puntatore al successivo elemento dell'ultimo elemento all'interno della lista =NULL
00045       last->next=0;
00046      //Carico i dati nel nodo
00047        (last->colore).blue=color.Blue();
00048  (last->colore).green=color.Green();
00049  (last->colore).red=color.Red();
00050 
00051       strcpy(last->f,fx);
00052       last->valori=valori;
00053       last->flagdisegno=flagdisegno;
00054       last->minRel=minRel;
00055       last->maxRel=maxRel;
00056       last->sfumatura=sfum;
00057       last->griglia=grid;
00058       last->puntastruttura=0;
00059 
00060       numeroelementi++;
00061  }
00062 //______________________________________________________________________________
00063  void TLista3D::NuovoNodo( wxColour color,
00064                            char *fx,
00065                            rif* puntaStrutt,
00066                            int flagdisegno,
00067                            char griglia,
00068                            char sfumatura){
00069 
00070      float **valori;
00071      float maxRel;
00072      float minRel;
00073      crea(&valori);
00074      calcola(valori,puntaStrutt,&minRel,&maxRel);
00075 
00076      //Se la lista è vuota
00077      if(first==0){         //Alloco il primo elemento impostando ptrfine=ptrinizio
00078       first=(pr*)malloc(sizeof(pr));
00079       last=first;
00080      }
00081      else{ //Aggiungo un nuovo elemento
00082            last->next=(pr*)malloc(sizeof(pr));
00083            last=last->next;
00084      }
00085      //Il puntatore al successivo elemento dell'ultimo elemento all'interno della lista =NULL
00086      last->next=0;
00087      //Carico i dati nel nodo
00088      (last->colore).blue=color.Blue();
00089      (last->colore).green=color.Green();
00090      (last->colore).red=color.Red();
00091 
00092      strcpy(last->f,fx);
00093      last->valori=valori;
00094      last->flagdisegno=flagdisegno;
00095      last->minRel=minRel;
00096      last->maxRel=maxRel;
00097      last->sfumatura=sfumatura;
00098      last->griglia=griglia;
00099      last->puntastruttura=puntaStrutt;
00100 
00101      numeroelementi++;
00102 
00103 }
00104 //______________________________________________________________________________
00105  void TLista3D::RimuoviNodo(int posizione)
00106  { pr* ptrposizione;
00107     pr* ptrtemp;
00108     int i=1;
00109     ptrposizione=first;
00110     TParserScomponi EliminaStruttura;
00111  if(posizione==1)
00112   { //Se elimino il primo elemento ptrinizio punta all'elemento successivo della lista
00113     first=first->next;
00114     numeroelementi--;
00115 
00116   //Libero la memoria occupata dalla struttura dati
00117     EliminaStruttura.Libera_Memoria(ptrposizione->puntastruttura);
00118 
00119   //Elimino l'elemento dalla lista
00120     free(ptrposizione);
00121   }else
00122   { //.. altrimenti mi posiziono sull'elemento precedente a quello da cancellare
00123     while((i<=posizione-2)&&(ptrposizione->next!=0))
00124      {
00125        ptrposizione=ptrposizione->next;
00126        i++;
00127      }
00128 
00129      if(ptrposizione->next!=0)
00130      { //e  lo cancello collegando prima l'elemento precedente con l'elemento successivo dell'elemento da canc
00131        ptrtemp=ptrposizione->next;
00132 
00133        ptrposizione->next=ptrtemp->next;
00134        //Libero la memoria occupata dalla struttura dati
00135        EliminaStruttura.Libera_Memoria(ptrtemp->puntastruttura);
00136        free (ptrtemp);
00137       //Se ho eliminato l'ultimo elemento riposiziono
00138       if(ptrposizione->next==0)
00139         last=ptrposizione;
00140 
00141        numeroelementi--;
00142      }
00143    }
00144  }
00145 //______________________________________________________________________________
00146 
00147  wxColour TLista3D::EstraiColore(int posizione)
00148  {    int i;
00149       pr* ptrposizione;
00150       ptrposizione=first;
00151   for (i=0;i<posizione-1;i++)
00152     {
00153        ptrposizione=ptrposizione->next;
00154     }
00155     return((wxColour)((ptrposizione->colore).red,(ptrposizione->colore).green,(ptrposizione->colore).blue));
00156 
00157 
00158  }
00159 //______________________________________________________________________________
00160  char* TLista3D::EstraiFunzione(int posizione)
00161  {    int i;
00162       pr* ptrposizione;
00163       ptrposizione=first;
00164   for (i=0;i<posizione-1;i++)
00165     {
00166        ptrposizione=ptrposizione->next;
00167     }
00168     return(ptrposizione->f);
00169  }
00170 //______________________________________________________________________________
00171 float** TLista3D::EstraiStruttura(int posizione)
00172  {    int i;
00173       pr* ptrposizione;
00174       ptrposizione=first;
00175   for (i=0;i<posizione-1;i++)
00176     {
00177        ptrposizione=ptrposizione->next;
00178     }
00179 
00180     return(ptrposizione->valori);
00181  }
00182 //______________________________________________________________________________
00183  int TLista3D::EstraiFlagDisegno(int posizione)
00184  {
00185      int i;
00186       pr* ptrposizione;
00187       ptrposizione=first;
00188   for (i=0;i<posizione-1;i++)
00189     {
00190        ptrposizione=ptrposizione->next;
00191     }
00192     return(ptrposizione->flagdisegno);
00193 
00194  }
00195 //______________________________________________________________________________
00196 void TLista3D::ModificaElemento(int posizione,
00197                                 wxColour color,
00198                                 char *fx,
00199                                 rif* puntaStrutt,
00200                                 int flagdisegno,
00201                                 char grid,
00202                                 char sfum){
00203       int i;
00204       int j;
00205       float **valori;
00206       float maxRel,minRel;
00207       pr* ptrposizione;
00208       ptrposizione=first;
00209       //TParserScomponi EliminaStruttura;
00210       //Mi posiziono sulla funzione da modificare
00211       for (i=0;i<posizione-1;i++)
00212           ptrposizione=ptrposizione->next;
00213       //Modifico i parametri della funzione
00214      (ptrposizione->colore).blue=color.Blue();
00215     (ptrposizione->colore).green=color.Green();
00216     (ptrposizione->colore).red=color.Red();
00217 
00218       if (strcmp(ptrposizione->f,fx)){
00219          strcpy(ptrposizione->f,fx);
00220          for (j=0;j<=risoluzione_r;j++)
00221              free(ptrposizione->valori[j]);
00222          free(ptrposizione->valori);
00223          crea(&valori);
00224          calcola(valori,puntaStrutt,&minRel,&maxRel);
00225          ptrposizione->maxRel=maxRel;
00226          ptrposizione->minRel=minRel;
00227          ptrposizione->valori=valori;
00228          ptrposizione->puntastruttura=puntaStrutt;
00229 
00230       }
00231        ptrposizione->flagdisegno=flagdisegno;
00232       ptrposizione->griglia=grid;
00233       ptrposizione->sfumatura=sfum;
00234 
00235 }
00236 //______________________________________________________________________________
00237 float TLista3D::EstraiMaxRel(int posizione){
00238 
00239       int i;
00240       pr* ptrposizione;
00241       ptrposizione=first;
00242       for (i=0;i<posizione-1;i++)
00243         ptrposizione=ptrposizione->next;
00244 
00245     return(ptrposizione->maxRel);
00246 
00247 }
00248 //______________________________________________________________________________
00249 float TLista3D::EstraiMinRel(int posizione){
00250       int i;
00251       pr* ptrposizione;
00252       ptrposizione=first;
00253       for (i=0;i<posizione-1;i++)
00254        ptrposizione=ptrposizione->next;
00255     return(ptrposizione->minRel);
00256 
00257 }
00258 //______________________________________________________________________________
00259 char TLista3D::EstraiGriglia(int posizione){
00260      int i;
00261      pr* ptrposizione;
00262      ptrposizione=first;
00263      for (i=0;i<posizione-1;i++)
00264        ptrposizione=ptrposizione->next;
00265      return(ptrposizione->griglia);
00266 
00267 }
00268 //______________________________________________________________________________
00269 pr* TLista3D::EstraiPtr(int posizione){
00270     int i;
00271     pr* ptrposizione;
00272     ptrposizione=first;
00273     for (i=0;i<posizione-1;i++)
00274         ptrposizione=ptrposizione->next;
00275     return(ptrposizione);
00276 }
00277 //______________________________________________________________________________
00278 
00279 void TLista3D::crea(float ***punti){
00280          int ind;
00281          long int numero_vertici=(risoluzione_c+1)*(risoluzione_r+1);
00282          *punti=(float**)malloc((numero_vertici)*sizeof(float*));
00283 
00284          for(ind=0;ind<numero_vertici;ind++){
00285                   punti[0][ind]=(float*)malloc(3*sizeof(float));
00286                  }
00287 
00288 
00289        }
00290 //______________________________________________________________________________
00291 
00292 void TLista3D::calcola2(float **punti,rif* puntastruttura,float *minRel,float *maxRel){
00293         int righe,colonne;
00294         double step_x=(xmax-xmin)/risoluzione_c;
00295         double step_y=(ymax-ymin)/risoluzione_r;
00296         double this_x;
00297         double this_y;
00298         *minRel=zmax;
00299         *maxRel=zmin;
00300         TParserValore calcolavalore;
00301         double valori[2];
00302         int errore=0;
00303 
00304         for(righe=0;righe<risoluzione_r+1;righe++)
00305                 for(colonne=0;colonne<risoluzione_c+2;colonne++){
00306                          this_x= colonne*step_x+xmin;
00307                          this_y= righe*step_y+ymin;
00308                          punti[righe*risoluzione_r+colonne][0]=this_x ;
00309 
00310                          valori[0]=this_x;
00311                          valori[1]=this_y;
00312 
00313                          punti[righe*risoluzione_r+colonne][1]=calcolavalore.CalcolaValore(puntastruttura,valori,&errore);//cos(pow(this_x,2)+pow(this_y,2))/pow( pow(this_x,2)+pow(this_y,2)+1 ,1/2);
00314                          punti[righe*risoluzione_r+colonne][2]=this_y;
00315                            if (errore)
00316                              punti[righe*risoluzione_r+colonne][1]=zmax+1;
00317 
00318                          if( punti[righe*risoluzione_r+colonne][1]>*maxRel &&
00319                              punti[righe*risoluzione_r+colonne][1]<xmax)
00320 
00321                                    *maxRel=punti[righe*risoluzione_r+colonne][1];
00322 
00323                          if( punti[righe*risoluzione_r+colonne][1]<*minRel &&
00324                               punti[righe*risoluzione_r+colonne][1]>xmin)
00325 
00326                                     *minRel=punti[righe*risoluzione_r+colonne][1];
00327 
00328                     }
00329 
00330 
00331     }
00332 //______________________________________________________________________________
00333 void TLista3D::calcola(float **punti,rif* puntastruttura,float *minRel,float *maxRel){
00334         int righe,colonne;
00335         double step_x=(xmax-xmin)/risoluzione_c;
00336         double step_y=(ymax-ymin)/risoluzione_r;
00337         double this_x;
00338         double this_y;
00339         *minRel=zmax;
00340         *maxRel=zmin;
00341         TParserValore calcolavalore;
00342         double valori[2];
00343         double valore_z;
00344         int errore=0;
00345 
00346         for(righe=0;righe<risoluzione_r+1;righe++)
00347                 for(colonne=0;colonne<risoluzione_c+2;colonne++){
00348                          this_x= colonne*step_x+xmin;
00349                          this_y= righe*step_y+ymin;
00350                          punti[righe*risoluzione_r+colonne][0]=5-((xmax-this_x)*10)/(xmax-xmin);
00351                          punti[righe*risoluzione_r+colonne][2]=5-((ymax-this_y)*10)/(ymax-ymin);
00352                          valori[0]=this_x;
00353                          valori[1]=this_y;
00354                          valore_z=calcolavalore.CalcolaValore(puntastruttura,valori,&errore);
00355                          valore_z=5-((zmax-valore_z)*10)/(zmax-zmin);
00356                         //punti[righe*risoluzione_r+colonne][1]=zmax;
00357                          punti[righe*risoluzione_r+colonne][1]=valore_z;
00358                        /*  punti[righe*risoluzione_r+colonne][1]+=zmin;
00359                          punti[righe*risoluzione_r+colonne][1]/=(zmax-zmin);
00360                          punti[righe*risoluzione_r+colonne][1]*=10;*/
00361 
00362 
00363                            if (errore)
00364                              //punti[righe*risoluzione_r+colonne][1]=zmax+1;
00365                              punti[righe*risoluzione_r+colonne][1]=6;
00366 
00367                          if( punti[righe*risoluzione_r+colonne][1]>*maxRel &&
00368                              punti[righe*risoluzione_r+colonne][1]<5)
00369 
00370                                    *maxRel=punti[righe*risoluzione_r+colonne][1];
00371 
00372                          if( punti[righe*risoluzione_r+colonne][1]<*minRel &&
00373                               punti[righe*risoluzione_r+colonne][1]>-5)
00374 
00375                                     *minRel=punti[righe*risoluzione_r+colonne][1];
00376 
00377                     }
00378 
00379 
00380     }
00381 //______________________________________________________________________________
00382 void TLista3D::Ricalcola(void){
00383     float **valori;
00384     int i,j;
00385     float maxRel,minRel;
00386     pr* ptrposizione;
00387     ptrposizione=first;
00388     for (i=0;i< numeroelementi;i++){
00389         crea(&valori);
00390         calcola(valori,ptrposizione->puntastruttura,&minRel,&maxRel);
00391         for (j=0;j<=risoluzione_r;j++)
00392             free(ptrposizione->valori[j]);
00393         free(ptrposizione->valori);
00394         ptrposizione->valori=valori;
00395         ptrposizione->minRel=minRel;
00396         ptrposizione->maxRel=maxRel;
00397         ptrposizione=ptrposizione->next;
00398 
00399 
00400     }
00401 
00402 }

 

SourceForge Logo