00001 #include "../../../include/Grafico3d/ListaFx3D/TLista3D.h"
00002
00003
00004 TLista3D::TLista3D()
00005 {
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
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
00034
00035 if(first==0)
00036 {
00037 first=(pr*)malloc(sizeof(pr));
00038 last=first;
00039 } else
00040 {
00041 last->next=(pr*)malloc(sizeof(pr));
00042 last=last->next;
00043 }
00044
00045 last->next=0;
00046
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
00077 if(first==0){
00078 first=(pr*)malloc(sizeof(pr));
00079 last=first;
00080 }
00081 else{
00082 last->next=(pr*)malloc(sizeof(pr));
00083 last=last->next;
00084 }
00085
00086 last->next=0;
00087
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 {
00113 first=first->next;
00114 numeroelementi--;
00115
00116
00117 EliminaStruttura.Libera_Memoria(ptrposizione->puntastruttura);
00118
00119
00120 free(ptrposizione);
00121 }else
00122 {
00123 while((i<=posizione-2)&&(ptrposizione->next!=0))
00124 {
00125 ptrposizione=ptrposizione->next;
00126 i++;
00127 }
00128
00129 if(ptrposizione->next!=0)
00130 {
00131 ptrtemp=ptrposizione->next;
00132
00133 ptrposizione->next=ptrtemp->next;
00134
00135 EliminaStruttura.Libera_Memoria(ptrtemp->puntastruttura);
00136 free (ptrtemp);
00137
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
00210
00211 for (i=0;i<posizione-1;i++)
00212 ptrposizione=ptrposizione->next;
00213
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);
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
00357 punti[righe*risoluzione_r+colonne][1]=valore_z;
00358
00359
00360
00361
00362
00363 if (errore)
00364
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 }