MatOCAD Logo

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

Tgrafico3d.cpp

Go to the documentation of this file.
00001 //------------------------------------------------------------------------------
00002 //
00003 // Name:        Tgrafico3d.cpp
00004 // Author:      Alex Carpentieri
00005 // Created:     7/17/2004 12:11:38 AM
00006 // Copyright:
00007 //
00008 //------------------------------------------------------------------------------
00009 
00010 #include "../../include/Grafico3d/Tgrafico3d.hpp"
00011 
00012 
00013 #define MINORE 2
00014 #define UGUALE 1
00015 #define MAGGIORE 0
00016 
00017 //------------------------------------------------------------------------------
00018 //
00019 //                            CARICO TABELLe EVENTI
00020 //
00021 //------------------------------------------------------------------------------
00022 
00023 BEGIN_EVENT_TABLE(WxGrafico,wxGLCanvas)
00024 
00025      EVT_SIZE(WxGrafico::OnSize)
00026 
00027      EVT_CHAR(WxGrafico::OnChar)
00028      EVT_MOUSE_EVENTS(WxGrafico::OnMouseEvent)
00029      EVT_PAINT(WxGrafico::OnPaint)
00030      EVT_MENU(6000,WxGrafico::click_menu_popup_opz)
00031      EVT_LEFT_DOWN(WxGrafico::GraficoLeftDown)
00032      EVT_RIGHT_DOWN(WxGrafico::GraficoRightDown)
00033  EVT_ERASE_BACKGROUND(WxGrafico::OnEraseBackGround)
00034 END_EVENT_TABLE()
00035 
00036 //------------------------------------------------------------------------------
00037 //
00038 //          IMPLEMENTAZIONE METODI DI WxGrafico
00039 //
00040 //------------------------------------------------------------------------------
00041 
00042 
00043 WxGrafico::WxGrafico(wxWindow *parent,
00044                      const wxSize& size,
00045                      int* gl_attrib,
00046                      wxWindowID id,
00047                      const wxPoint& pos,
00048                      long style,
00049                      const wxString& name
00050                     ):  wxGLCanvas(parent,
00051                                                   id,
00052                                                   pos,
00053                                                   size,
00054                                                   style,
00055                                                   name,
00056                                                   gl_attrib){
00057 
00058 
00059          zoom=-20;
00060          assex=assey=assez=0.0;
00061          opzAperta=0;
00062          this->initGL();
00063          Lista3d =  new wxMenu(_T("") );
00064          Lista3d->Append( 6000,
00065                           (_T("Opzioni...")),
00066                           (_T("Modifica e aggiuni funzioni 3d")),
00067                           wxITEM_NORMAL);
00068          Refresh();
00069 
00070 }
00071 //______________________________________________________________________________
00072 WxGrafico::~WxGrafico(void){
00073 
00074 
00075      while (opzioni.numeroelementi)
00076      opzioni.RimuoviNodo(1);
00077 
00078 
00079 
00080 }
00081 
00082  void WxGrafico::OnEraseBackGround(wxEraseEvent& event)
00083   {
00084 
00085   }
00086 //______________________________________________________________________________
00087 void WxGrafico::initGL(void){
00088      this->SetCurrent();
00089      wxPaintDC dc(this);
00090      glShadeModel(GL_SMOOTH);
00091      glClearColor(0,0,0,0);
00092 
00093     //per disegnare poligoni in ordine corretto
00094     glEnable(GL_DEPTH_TEST);
00095     glDepthFunc(GL_LESS);
00096     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL | GL_POLYGON_SMOOTH);//indico di che tipo sono
00097                                                    //le facce dei poligoni
00098     glMatrixMode(GL_PROJECTION);
00099     glLoadIdentity();
00100     glFrustum(-5,5,-5,5,5,5);
00101     // glFrustum(xmin,xmax,zmin,zmax,ymax,ymin);
00102     glMatrixMode(GL_MODELVIEW);
00103     //InitMaterials();
00104     glTranslatef( 0.0,0.0, -6.0 );
00105 
00106 }
00107 //______________________________________________________________________________
00108 void WxGrafico::drawGL(void){
00109 
00110     this->SetCurrent();
00111     glClearColor(1.0, 1.0, 1.0, 1.0);
00112     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
00113     glPushMatrix();
00114     glLoadIdentity (); /* pulisci la matrice */
00115     glOrtho(-5/2,5/2,-5/2,5/2,5/2,-5/2);
00116     //glOrtho(xmin/2,xmax/2,zmin/2,zmax/2,ymax/2,ymin/2);
00117 
00118     glTranslatef (0,0, 5+zoom); /* posizione della telecamera*/
00119 
00120     glRotated( assey,  //ruoto l'immagine di g gradi rispetto
00121                0,
00122                1,
00123                0);
00124 
00125      glRotated( assex,  //ruoto l'immagine di g gradi rispetto
00126                 1,
00127                 0,
00128                 0);
00129 
00130      glRotated( assez,  //ruoto l'immagine di g gradi rispetto
00131                 0,
00132                 0,
00133                 1);
00134 
00135 
00136       glScalef (1.0, 1.0, 1.0);      /* trasformazione nulla */
00137 
00138       disegna_assi();
00139 
00140 
00141       int i;
00142       pr *ptrAppo;
00143       if(!opzAperta)
00144       for (i=1;i<=opzioni.numeroelementi;i++){
00145           ptrAppo=opzioni.EstraiPtr(i);
00146           if (ptrAppo->flagdisegno){
00147              if (ptrAppo->griglia)
00148              disegna_griglia(ptrAppo->valori);
00149              disegna_grafico( ptrAppo);
00150           }
00151 
00152       }
00153 
00154 
00155      glPopMatrix();
00156      glFlush();
00157      SwapBuffers();
00158      Refresh();
00159 }
00160 //______________________________________________________________________________
00161 
00162 void WxGrafico::disegna_assi(){
00163 
00164      double xmax=opzioni.xmax;
00165      double xmin=opzioni.xmin;
00166      double ymax=opzioni.ymax;
00167      double ymin=opzioni.ymin;
00168      double zmax=opzioni.zmax;
00169      double zmin=opzioni.zmin;
00170      float zerox=5-((xmax-0)*10)/(xmax-xmin);
00171      float zeroy=5-((ymax-0)*10)/(ymax-ymin);
00172      float zeroz=5-((zmax-0)*10)/(zmax-zmin);
00173 
00174      this->SetCurrent();
00175      wxPaintDC dc(this);
00176      glColor3f(1,0,0);
00177      glBegin(GL_LINES);
00178      if (zerox<=5 && zerox>=-5){
00179         glVertex3f((float)-5,zeroz,zeroy);//assex
00180         glVertex3f((float)5,zeroz,zeroy);
00181      }
00182      if (zeroy<=5 && zeroy>=-5){
00183         glVertex3f(zerox,zeroz,-5);//assey
00184         glVertex3f(zerox,zeroz,5);
00185      }
00186 
00187      if (zeroz<=5 && zeroz>=-5){
00188         glVertex3f(zerox,-5,zeroy);//assez
00189         glVertex3f(zerox,5,zeroy);
00190      }
00191      glColor3f(0,0,0);
00192         //cubo di visualizazione
00193 
00194     glVertex3f((float)-5,(float)5,(float)-5);
00195     glVertex3f((float)5,(float)5,(float)-5);
00196 
00197     glVertex3f((float)-5,(float)-5,(float)-5);
00198     glVertex3f((float)5,(float)-5,(float)-5);
00199 
00200     glVertex3f((float)-5,(float)5,(float)5);
00201     glVertex3f((float)5,(float)5,(float)5);
00202 
00203     glVertex3f((float)-5,(float)-5,(float)5);
00204     glVertex3f((float)5,(float)-5,(float)5);
00205 
00206     glVertex3f((float)-5,(float)5,(float)-5);
00207     glVertex3f((float)-5,(float)5,(float)5);
00208 
00209     glVertex3f((float)5,(float)5,(float)-5);
00210     glVertex3f((float)5,(float)5,(float)5);
00211 
00212     glVertex3f((float)-5,(float)-5,(float)-5);
00213     glVertex3f((float)-5,(float)-5,(float)5);
00214 
00215     glVertex3f((float)5,(float)-5,(float)-5);
00216     glVertex3f((float)5,(float)-5,(float)5);
00217 
00218     glVertex3f((float)-5,(float)5,(float)-5);
00219     glVertex3f((float)-5,(float)-5,(float)-5);
00220 
00221     glVertex3f((float)5,(float)5,(float)-5);
00222     glVertex3f((float)5,(float)-5,(float)-5);
00223 
00224     glVertex3f((float)-5,(float)5,(float)5);
00225     glVertex3f((float)-5,(float)-5,(float)5);
00226 
00227     glVertex3f((float)5,(float)5,(float)5);
00228     glVertex3f((float)5,(float)-5,(float)5);
00229 
00230     glEnd();
00231     glFlush();
00232 
00233 }
00234 //______________________________________________________________________________
00235 
00236 void WxGrafico::disegna_grafico(pr* funz){
00237 
00238      int risoluzione_r=opzioni.risoluzione_r;
00239      int risoluzione_c=opzioni.risoluzione_c;
00240      int r,c;
00241      float colore=1,colore2=1,colore3=1,colore4=1;
00242      char noMonoCromo=funz->sfumatura;
00243      float clr_r,clr_g,clr_b;
00244      float appo;
00245 
00246      appo=funz->maxRel-funz->minRel;
00247      clr_r=funz->colore.red;
00248      clr_r/=255;
00249      clr_g=funz->colore.green;
00250      clr_g/=255;
00251      clr_b=funz->colore.blue;
00252      clr_b/=255;
00253 
00254      glBegin(GL_QUADS);
00255      for (r=0;r<risoluzione_r;r++){
00256          for (c=0;c+1<risoluzione_c;c++){
00257              if ( funz->valori[r*risoluzione_r+c][1]>=-5 &&
00258                   funz->valori[r*risoluzione_r+c][1]<=5 &&
00259                   funz->valori[(r+1)*risoluzione_r+c][1]>=-5 &&
00260                   funz->valori[(r+1)*risoluzione_r+c][1]<=5  &&
00261                   funz->valori[(r+1)*risoluzione_r+(c+1)][1]>=-5 &&
00262                   funz->valori[(r+1)*risoluzione_r+(c+1)][1]<=5  &&
00263                   funz->valori[r*risoluzione_r+c+1][1]>=-5 &&
00264                   funz->valori[r*risoluzione_r+c+1][1]<=5 ){
00265 
00266                                     if (noMonoCromo){
00267                                        colore= (funz->valori[r*risoluzione_r+c][1]-funz->minRel)/(appo);
00268                                        colore2=(funz->valori[(r+1)*risoluzione_r+c][1]-funz->minRel)/(appo);
00269                                        colore3=(funz->valori[(r+1)*risoluzione_r+c+1][1]-funz->minRel)/(appo);
00270                                        colore4=(funz->valori[r*risoluzione_r+c+1][1]-funz->minRel)/(appo);
00271 
00272                                        glColor3f( clr_r*colore,
00273                                                   clr_g*colore,
00274                                                   clr_b*colore);
00275                                        glVertex3fv(funz->valori[r*risoluzione_r+c]);
00276 
00277                                        glColor3f( clr_r*colore2,
00278                                                   clr_g*colore2,
00279                                                   clr_b*colore2);
00280                                        glVertex3fv(funz->valori[(r+1)*risoluzione_r+c]);
00281 
00282                                        glColor3f( clr_r*colore3,
00283                                                   clr_g*colore3,
00284                                                   clr_b*colore3);
00285                                       glVertex3fv(funz->valori[(r+1)*risoluzione_r+(c+1)]);
00286 
00287                                       glColor3f( clr_r*colore4,
00288                                                  clr_g*colore4,
00289                                                  clr_b*colore4);
00290                                       glVertex3fv(funz->valori[r*risoluzione_r+c+1]);
00291                                      }
00292                                  else{
00293                                       glColor3f( clr_r,clr_g,clr_b);
00294                                       glVertex3fv(funz->valori[r*risoluzione_r+c]);
00295                                       glVertex3fv(funz->valori[(r+1)*risoluzione_r+c]);
00296                                       glVertex3fv(funz->valori[(r+1)*risoluzione_r+(c+1)]);
00297                                       glVertex3fv(funz->valori[r*risoluzione_r+c+1]);
00298                                  }
00299                  }
00300            }
00301 
00302       }
00303       glEnd();
00304       glFlush();
00305 }
00306 //______________________________________________________________________________
00307 
00308 void WxGrafico::disegna_griglia(float **punti){
00309 
00310     int risoluzione_r=opzioni.risoluzione_r;
00311     int risoluzione_c=opzioni.risoluzione_c;
00312 
00313     int r,c;
00314 
00315      glColor3f( 0.0,
00316                 0.0,
00317                 0.0);
00318      for (r=0;r<=risoluzione_r;r+=5){
00319                     glBegin(GL_LINE_STRIP);
00320             for(c=0;c<risoluzione_c;c++){
00321 
00322                 if(   punti[r*risoluzione_r+c][1]>=-5 &&
00323                       punti[r*risoluzione_r+c][1]<=5  &&
00324                       punti[(r+1)*risoluzione_r+c][1]>=-5 &&
00325                       punti[(r+1)*risoluzione_r+c][1]<=5   &&
00326                       punti[(r+1)*risoluzione_r+(c+1)][1]>=-5 &&
00327                       punti[(r+1)*risoluzione_r+(c+1)][1]<=5   &&
00328                       punti[r*risoluzione_r+c+1][1]>=-5 &&
00329                       punti[r*risoluzione_r+c+1][1]<=5 ){
00330 
00331                                      glVertex3fv(punti[r*risoluzione_r+c]);
00332 
00333 
00334                            }
00335                   else{
00336                                  glEnd();
00337                          glBegin(GL_LINE_STRIP);
00338                   }
00339 
00340             }
00341             glEnd();
00342       }
00343 
00344       for (c=0;c<=risoluzione_c;c+=5){
00345                    glBegin(GL_LINE_STRIP);
00346            for(r=0;r<risoluzione_r;r++){
00347 
00348 
00349                 if(   punti[r*risoluzione_r+c][1]>=-5 &&
00350                       punti[r*risoluzione_r+c][1]<=5  &&
00351                       punti[(r+1)*risoluzione_r+c][1]>=-5 &&
00352                       punti[(r+1)*risoluzione_r+c][1]<=5   &&
00353                       punti[(r+1)*risoluzione_r+(c+1)][1]>=-5 &&
00354                       punti[(r+1)*risoluzione_r+(c+1)][1]<=5   &&
00355                       punti[r*risoluzione_r+c+1][1]>=-5 &&
00356                       punti[r*risoluzione_r+c+1][1]<=5 ){
00357 
00358 
00359                                      glVertex3fv(punti[r*risoluzione_r+c]);
00360 
00361 
00362                           }
00363                  else{
00364                         glEnd();
00365                         glBegin(GL_LINE_STRIP);
00366                   }
00367             }
00368             glEnd();
00369        }
00370      glFlush();
00371 }
00372 //------------------------------------------------------------------------------
00373 //
00374 //          EVENTI A CUI WxGrafico RISPONDE
00375 //
00376 //------------------------------------------------------------------------------
00377 void WxGrafico::GraficoLeftDown(wxMouseEvent& event)
00378 {
00379  SetFocus();
00380 ((TBasePanel*)GetParent())->ImpostaBordi();
00381 
00382  event.Skip();
00383 
00384 }
00385 
00386 
00387 void WxGrafico::GraficoRightDown(wxMouseEvent& event)
00388 {
00389  SetFocus();
00390 ((TBasePanel*)GetParent())->ImpostaBordi();
00391 
00392  PopupMenu(Lista3d);
00393  event.Skip();
00394 }
00395 
00396 
00397 
00398 
00399 void WxGrafico::OnChar(wxKeyEvent& event){
00400 
00401      switch(event.m_keyCode) {
00402           case WXK_LEFT:
00403             assey += 1.0;
00404           break;
00405           case WXK_RIGHT:
00406              assey -= 1.0;
00407           break;
00408           case WXK_UP:
00409             assex -= 1.0;
00410           break;
00411 
00412           case WXK_DOWN:
00413              assex += 1.0;
00414           break;
00415           case 'z':
00416                zoom++;
00417           break;
00418           case 'x':
00419                zoom--;
00420      }
00421 
00422           drawGL();
00423          event.Skip();
00424 
00425     }
00426 //______________________________________________________________________________
00427 
00428 void WxGrafico::OnMouseEvent(wxMouseEvent& event){
00429 
00430          char dis=0;
00431          wxPoint posizione_mouse;
00432          posizione_mouse=event.GetPosition();
00433      if (event.ButtonIsDown(wxMOUSE_BTN_LEFT)&& !event.m_controlDown){
00434 
00435           if (posizione_mouse.x+1<cur_x){
00436               dis=1;
00437               assey-=3.0;
00438               }
00439           else
00440               if (posizione_mouse.x-1>cur_x){
00441                  assey+=3.0;
00442                  dis=1;
00443               }
00444           if (posizione_mouse.y+1<cur_y){
00445               assex-=3.0;
00446               dis=1;
00447           }
00448           else
00449                if (posizione_mouse.y-1>cur_y){
00450                   assex+=3.0;
00451                   dis=1;
00452                }
00453        }
00454 
00455 
00456 if(dis==1) drawGL();
00457         cur_x=posizione_mouse.x;
00458         cur_y=posizione_mouse.y;
00459             event.Skip();
00460 
00461       /*   long x,y,dx,dy;
00462          char dis=0;
00463          wxCursor cursore();
00464          event.GetPosition(&x,&y);
00465        if (event.ButtonIsDown(wxMOUSE_BTN_LEFT)&& event.m_controlDown){
00466           dx=delta(x,cur_x);
00467           dy=delta(y,cur_y);
00468           switch (dx) {
00469                  case MAGGIORE:
00470                       ruota_sinistra(&assex,&assey,&assez);
00471                       dis=1;
00472                  break;
00473                  case  MINORE:
00474                        ruota_destra(&assex,&assey,&assez);
00475                        dis=1;
00476                  break;
00477                  case  UGUALE:
00478                  break;
00479           }
00480           switch (dy) {
00481               case  MAGGIORE:
00482                     ruota_su(&assex,&assey,&assez);
00483                     dis=1;
00484               break;
00485               case   MINORE:
00486                      ruota_giu(&assex,&assey,&assez);
00487                      dis=1;
00488               break;
00489               case    UGUALE:
00490               break;
00491           }
00492        }
00493 
00494        if (event.RightDown()) this->PopupMenu(Lista3d);
00495 
00496        if(dis==1) drawGL();
00497 
00498        cur_x=x;
00499        cur_y=y;
00500        event.Skip();*/
00501     }
00502 //______________________________________________________________________________
00503 void WxGrafico::OnPaint(wxPaintEvent& event){
00504         int width, height;
00505 
00506         GetClientSize(& width, & height);
00507         SetCurrent();
00508 
00509 
00510         glMatrixMode (GL_PROJECTION); /* preparazione matrice in modalità
00511                                       projection,determino come l'immagine deve
00512                                       essere caricata nello  schermo*/
00513 
00514         glLoadIdentity ();               /*pulisce a carica la nuova matrice */
00515         glFrustum (-1.0, 1.0, -1.0, 1.0, /* trasformazione */
00516                    1.5, 20.0);
00517         glMatrixMode (GL_MODELVIEW);  /* ritorno alla vista della matrice */
00518         glViewport (0, 0, width, height);/* definisco la grandezza della fotografia */
00519         SwapBuffers();
00520          drawGL();
00521         // Refresh();
00522         event.Skip();
00523     }
00524 //______________________________________________________________________________
00525 void WxGrafico::OnSize(wxSizeEvent& event){
00526        this->SetCurrent();
00527        int width, height;
00528         GetClientSize(& width, & height);
00529         glMatrixMode (GL_PROJECTION); /* preparazione matrice in modalità
00530                                          projection,determino come l'immagine
00531                                          deve essere caricata nello  schermo*/
00532 
00533         glLoadIdentity ();               /*pulisce a carica la nuova matrice */
00534         glFrustum (-1.0, 1.0, -1.0, 1.0, /* trasformazione */
00535                   1.5, 20.0);
00536         glMatrixMode (GL_MODELVIEW);  /* ritorno alla vista della matrice */
00537         glViewport (0, 0, width, height);/* definisco la grandezza della fotografia*/
00538         this->SwapBuffers();
00539         drawGL();
00540         Refresh();
00541         event.Skip();
00542     }
00543 
00544 
00545  //______________________________________________________________________________
00546 
00547  void WxGrafico::click_menu_popup_opz(wxCommandEvent& Event){
00548       Opz3dDlg* finOpzioni;
00549       opzAperta=1;
00550       finOpzioni= new Opz3dDlg(this->GetParent(),&opzioni);
00551       finOpzioni->ShowModal();
00552       finOpzioni->Destroy();
00553       opzAperta=0;
00554      /* xmin=opzioni.xmin;
00555       xmax=opzioni.xmax;
00556       ymin=opzioni.ymin;
00557       ymax=opzioni.ymax;
00558       zmin=opzioni.zmin;
00559       zmax=opzioni.zmax;
00560       risoluzione_r=opzioni.risoluzione_r;
00561       risoluzione_c=opzioni.risoluzione_c;*/
00562 
00563       Refresh();
00564       Event.Skip();
00565       }
00566  //______________________________________________________________________________
00567 
00568 char WxGrafico::delta(long x1,long x2){
00569      if (x1-x2<0)
00570         return 0;
00571      else
00572          if (x1-x2==0)
00573             return 1;
00574      return 2;
00575 }
00576 //______________________________________________________________________________
00577 
00578 void WxGrafico::ruota_destra(double *assex,double *assey,double *assez){
00579      float deltay;
00580     /* if (*assez>=90 && *assez<=270)
00581         deltay=-3.0;
00582      else*/
00583          deltay=3.0;
00584      *assey+=deltay;
00585      if (*assey>=360)
00586         *assey=*assey-360;
00587 }
00588 //______________________________________________________________________________
00589 
00590 void WxGrafico::ruota_sinistra(double *assex,double *assey,double *assez){
00591      float deltay;
00592     /* if (*assez>=90 && *assez<=270)
00593         deltay=+3.0;
00594      else*/
00595          deltay=-3.0;
00596      *assey+=deltay;
00597      if (*assey>=360)
00598         *assey=*assey-360;
00599 }
00600 //______________________________________________________________________________
00601 
00602 void WxGrafico::ruota_su(double *assex,double *assey,double *assez){
00603      float deltax;
00604 
00605       if (*assey>=90 && *assey<=270)
00606          deltax=+3;
00607       else
00608           deltax=-3;
00609       *assex+=deltax;
00610       if (*assex>=360)
00611          *assex=*assex-360;
00612 }
00613 //______________________________________________________________________________
00614 
00615 void WxGrafico::ruota_giu(double *assex,double *assey,double *assez){
00616      float deltax;
00617 
00618       if (*assey>=90 && *assey<=270)
00619          deltax=-3;
00620       else
00621          deltax=+3;
00622       *assex+=deltax;
00623       if (*assex<=0)
00624         *assex=360-*assex;
00625 }
00626 
00627 //______________________________________________________________________________
00628 
00629 wxMenu* WxGrafico::GetPopUp()
00630 { return Lista3d;
00631 }
00632 
00633 //------------------------------------------------------------------------------
00634 //
00635 //                              FINE FILE
00636 //
00637 //------------------------------------------------------------------------------
00638 
00639 
00640 

 

SourceForge Logo