00001
00002
00003
00004
00005
00006
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
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
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
00094 glEnable(GL_DEPTH_TEST);
00095 glDepthFunc(GL_LESS);
00096 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL | GL_POLYGON_SMOOTH);
00097
00098 glMatrixMode(GL_PROJECTION);
00099 glLoadIdentity();
00100 glFrustum(-5,5,-5,5,5,5);
00101
00102 glMatrixMode(GL_MODELVIEW);
00103
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 ();
00115 glOrtho(-5/2,5/2,-5/2,5/2,5/2,-5/2);
00116
00117
00118 glTranslatef (0,0, 5+zoom);
00119
00120 glRotated( assey,
00121 0,
00122 1,
00123 0);
00124
00125 glRotated( assex,
00126 1,
00127 0,
00128 0);
00129
00130 glRotated( assez,
00131 0,
00132 0,
00133 1);
00134
00135
00136 glScalef (1.0, 1.0, 1.0);
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);
00180 glVertex3f((float)5,zeroz,zeroy);
00181 }
00182 if (zeroy<=5 && zeroy>=-5){
00183 glVertex3f(zerox,zeroz,-5);
00184 glVertex3f(zerox,zeroz,5);
00185 }
00186
00187 if (zeroz<=5 && zeroz>=-5){
00188 glVertex3f(zerox,-5,zeroy);
00189 glVertex3f(zerox,5,zeroy);
00190 }
00191 glColor3f(0,0,0);
00192
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
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
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
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);
00511
00512
00513
00514 glLoadIdentity ();
00515 glFrustum (-1.0, 1.0, -1.0, 1.0,
00516 1.5, 20.0);
00517 glMatrixMode (GL_MODELVIEW);
00518 glViewport (0, 0, width, height);
00519 SwapBuffers();
00520 drawGL();
00521
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);
00530
00531
00532
00533 glLoadIdentity ();
00534 glFrustum (-1.0, 1.0, -1.0, 1.0,
00535 1.5, 20.0);
00536 glMatrixMode (GL_MODELVIEW);
00537 glViewport (0, 0, width, height);
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
00555
00556
00557
00558
00559
00560
00561
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
00581
00582
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
00593
00594
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
00636
00637
00638
00639
00640