ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/app/VMM/win32/visuctt.cpp
Revision: 62
Committed: Fri Nov 16 16:46:00 2007 UTC (17 years, 9 months ago) by francois
Original Path: magic/app/VMM/VMM/win32/visuctt.cpp
File size: 78958 byte(s)
Log Message:
Nouvelle version de VMM avec couleur configurable et affichage de l 'origine des mailles
Nouveau prog de transfert
Nouvelle version de mailleur avec toutes les options disponibles

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuillière et Vincent FRANCOIS
5     // Département de Génie Mécanique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du département
8     // de génie mécanique de l'Université du Québec à
9     // Trois Rivières
10     // Les librairies ne peuvent être utilisées sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // visuctt.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 à 11H26
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27     #include <vcl.h>
28     #include <io.h>
29     #pragma hdrstop
30    
31     #include <fstream.h>
32     //#include "fct_generateur_3d.h"
33     #include "tpl_grille.h"
34     #include "visuctt.h"
35     #include "config.h"
36     #include "applifonc.h"
37     #include "compocarte.h"
38     #include "main.h"
39     #include "visugraph.h"
40     //---------------------------------------------------------------------------
41     #pragma package(smart_init)
42     #pragma resource "*.dfm"
43     Tvisucttform *visucttform;
44     //---------------------------------------------------------------------------
45     __fastcall Tvisucttform::Tvisucttform(TComponent* Owner)
46     : TForm(Owner),zoom(0),dx(0.0),dy(0.0),debut_trans(false),shrink(0),facteur_shrink(0.8),render(0),axe(0),debut_rot(0),grille(NULL)
47     {
48     }
49     //---------------------------------------------------------------------------
50     void __fastcall Tvisucttform::Fermer1Click(TObject *Sender)
51     {
52     Close();
53     if (grille!=NULL) delete grille;
54     }
55     //---------------------------------------------------------------------------
56    
57     void __fastcall Tvisucttform::FileExitItemClick(TObject *Sender)
58     {
59     TerminateProcess(GetCurrentProcess(),0);
60     }
61     //---------------------------------------------------------------------------
62    
63     void __fastcall Tvisucttform::FormClose(TObject *Sender,
64     TCloseAction &Action)
65     {
66     MainForm->ToolBar4->Visible=false;
67     MainForm->activecttform=NULL;
68     int nb=lst_cellule.size();
69     for (int i=0;i<nb;i++)
70     delete lst_cellule[i];
71     MainForm->StatusBar->Panels->Items[3]->Text="";
72     MainForm->StatusBar->Panels->Items[4]->Text="";
73     Action=caFree;
74     }
75     //---------------------------------------------------------------------------
76    
77    
78     void __fastcall Tvisucttform::Timer1Timer(TObject *Sender)
79     {
80     Timer1->Enabled=false;
81     FILE *in;
82     in=fopen(Caption.c_str(),"rt");
83     char mess[400];
84     fgets(mess,400,in);
85 bournival 34
86 francois 56
87 5 sscanf(mess,"%d %lf %lf %lf %lf %lf %lf %d %d %d",&nb_renseignement,&xmin,&ymin,&zmin,&xmax,&ymax,&zmax,&pasx,&pasy,&pasz);
88     for (int i=0;i<nb_renseignement;i++)
89     {
90     fgets(mess,400,in);
91     mess[strlen(mess)-1]=0;
92     ListBox1->Items->Add(mess);
93     }
94    
95     ListBox1->ItemIndex=0;
96     if (in!=NULL)
97     {
98     while (feof(in)==0)
99     {
100     char mess[400];
101     celluleaff* cell=new celluleaff(nb_renseignement);
102     fgets(mess,400,in);
103     sscanf(mess,"%lf %lf %lf",&(cell->coordpt1[0]),&(cell->coordpt1[1]),&(cell->coordpt1[2]));
104     char *p=strchr(mess,' ')+1;
105     p=strchr(p,' ')+1;
106     for (int l=0;l<nb_renseignement;l++)
107     {
108     double val;
109     p=strchr(p,' ')+1;
110     sscanf(p,"%lf",&val);
111     cell->change_valeur(l,0,val);
112     }
113     fgets(mess,400,in);
114     sscanf(mess,"%lf %lf %lf",&(cell->coordpt2[0]),&(cell->coordpt2[1]),&(cell->coordpt2[2]));
115     p=strchr(mess,' ')+1;
116     p=strchr(p,' ')+1;
117     for (int l=0;l<nb_renseignement;l++)
118     {
119     double val;
120     p=strchr(p,' ')+1;
121     sscanf(p,"%lf",&val);
122     cell->change_valeur(l,1,val);
123     }
124     fgets(mess,400,in);
125     sscanf(mess,"%lf %lf %lf",&(cell->coordpt3[0]),&(cell->coordpt3[1]),&(cell->coordpt3[2]));
126     p=strchr(mess,' ')+1;
127     p=strchr(p,' ')+1;
128     for (int l=0;l<nb_renseignement;l++)
129     {
130     double val;
131     p=strchr(p,' ')+1;
132     sscanf(p,"%lf",&val);
133     cell->change_valeur(l,2,val);
134     }
135     fgets(mess,400,in);
136     sscanf(mess,"%lf %lf %lf",&(cell->coordpt4[0]),&(cell->coordpt4[1]),&(cell->coordpt4[2]));
137     p=strchr(mess,' ')+1;
138     p=strchr(p,' ')+1;
139     for (int l=0;l<nb_renseignement;l++)
140     {
141     double val;
142     p=strchr(p,' ')+1;
143     sscanf(p,"%lf",&val);
144     cell->change_valeur(l,3,val);
145     }
146     fgets(mess,400,in);
147     sscanf(mess,"%lf %lf %lf",&(cell->coordpt5[0]),&(cell->coordpt5[1]),&(cell->coordpt5[2]));
148     p=strchr(mess,' ')+1;
149     p=strchr(p,' ')+1;
150     for (int l=0;l<nb_renseignement;l++)
151     {
152     double val;
153     p=strchr(p,' ')+1;
154     sscanf(p,"%lf",&val);
155     cell->change_valeur(l,4,val);
156     }
157     fgets(mess,400,in);
158     sscanf(mess,"%lf %lf %lf",&(cell->coordpt6[0]),&(cell->coordpt6[1]),&(cell->coordpt6[2]));
159     p=strchr(mess,' ')+1;
160     p=strchr(p,' ')+1;
161     for (int l=0;l<nb_renseignement;l++)
162     {
163     double val;
164     p=strchr(p,' ')+1;
165     sscanf(p,"%lf",&val);
166     cell->change_valeur(l,5,val);
167     }
168     fgets(mess,400,in);
169     sscanf(mess,"%lf %lf %lf",&(cell->coordpt7[0]),&(cell->coordpt7[1]),&(cell->coordpt7[2]));
170     p=strchr(mess,' ')+1;
171     p=strchr(p,' ')+1;
172     for (int l=0;l<nb_renseignement;l++)
173     {
174     double val;
175     p=strchr(p,' ')+1;
176     sscanf(p,"%lf",&val);
177     cell->change_valeur(l,6,val);
178     }
179     fgets(mess,400,in);
180     sscanf(mess,"%lf %lf %lf",&(cell->coordpt8[0]),&(cell->coordpt8[1]),&(cell->coordpt8[2]));
181     p=strchr(mess,' ')+1;
182     p=strchr(p,' ')+1;
183     for (int l=0;l<nb_renseignement;l++)
184     {
185     double val;
186     p=strchr(p,' ')+1;
187     sscanf(p,"%lf",&val);
188     cell->change_valeur(l,7,val);
189     }
190     lst_cellule.insert(lst_cellule.end(),cell);
191     }
192     int nb=lst_cellule.size();
193     if (nb>0)
194     {
195     double xmin=lst_cellule[0]->coordpt1[0];
196     double xmax=lst_cellule[0]->coordpt1[0];
197     double ymin=lst_cellule[0]->coordpt1[1];
198     double ymax=lst_cellule[0]->coordpt1[1];
199     double zmin=lst_cellule[0]->coordpt1[2];
200     double zmax=lst_cellule[0]->coordpt1[2];
201     for (int k=0;k<nb_renseignement;k++)
202     {
203     valmax[k]=lst_cellule[0]->get_valeur(k,0);
204     valmin[k]=lst_cellule[0]->get_valeur(k,0);
205     }
206     for (int i=0;i<nb;i++)
207     {
208     celluleaff* cell=lst_cellule[i];
209     if (cell->coordpt1[0]>xmax) xmax=cell->coordpt1[0];
210     if (cell->coordpt1[0]<xmin) xmin=cell->coordpt1[0];
211     if (cell->coordpt1[1]>ymax) ymax=cell->coordpt1[1];
212     if (cell->coordpt1[1]<ymin) ymin=cell->coordpt1[1];
213     if (cell->coordpt1[2]>zmax) zmax=cell->coordpt1[2];
214     if (cell->coordpt1[2]<zmin) zmin=cell->coordpt1[2];
215     if (cell->coordpt2[0]>xmax) xmax=cell->coordpt2[0];
216     if (cell->coordpt2[0]<xmin) xmin=cell->coordpt2[0];
217     if (cell->coordpt2[1]>ymax) ymax=cell->coordpt2[1];
218     if (cell->coordpt2[1]<ymin) ymin=cell->coordpt2[1];
219     if (cell->coordpt2[2]>zmax) zmax=cell->coordpt2[2];
220     if (cell->coordpt2[2]<zmin) zmin=cell->coordpt2[2];
221     if (cell->coordpt3[0]>xmax) xmax=cell->coordpt3[0];
222     if (cell->coordpt3[0]<xmin) xmin=cell->coordpt3[0];
223     if (cell->coordpt3[1]>ymax) ymax=cell->coordpt3[1];
224     if (cell->coordpt3[1]<ymin) ymin=cell->coordpt3[1];
225     if (cell->coordpt3[2]>zmax) zmax=cell->coordpt3[2];
226     if (cell->coordpt3[2]<zmin) zmin=cell->coordpt3[2];
227     if (cell->coordpt4[0]>xmax) xmax=cell->coordpt4[0];
228     if (cell->coordpt4[0]<xmin) xmin=cell->coordpt4[0];
229     if (cell->coordpt4[1]>ymax) ymax=cell->coordpt4[1];
230     if (cell->coordpt4[1]<ymin) ymin=cell->coordpt4[1];
231     if (cell->coordpt4[2]>zmax) zmax=cell->coordpt4[2];
232     if (cell->coordpt4[2]<zmin) zmin=cell->coordpt4[2];
233     if (cell->coordpt5[0]>xmax) xmax=cell->coordpt5[0];
234     if (cell->coordpt5[0]<xmin) xmin=cell->coordpt5[0];
235     if (cell->coordpt5[1]>ymax) ymax=cell->coordpt5[1];
236     if (cell->coordpt5[1]<ymin) ymin=cell->coordpt5[1];
237     if (cell->coordpt5[2]>zmax) zmax=cell->coordpt5[2];
238     if (cell->coordpt5[2]<zmin) zmin=cell->coordpt5[2];
239     if (cell->coordpt6[0]>xmax) xmax=cell->coordpt6[0];
240     if (cell->coordpt6[0]<xmin) xmin=cell->coordpt6[0];
241     if (cell->coordpt6[1]>ymax) ymax=cell->coordpt6[1];
242     if (cell->coordpt6[1]<ymin) ymin=cell->coordpt6[1];
243     if (cell->coordpt6[2]>zmax) zmax=cell->coordpt6[2];
244     if (cell->coordpt6[2]<zmin) zmin=cell->coordpt6[2];
245     if (cell->coordpt7[0]>xmax) xmax=cell->coordpt7[0];
246     if (cell->coordpt7[0]<xmin) xmin=cell->coordpt7[0];
247     if (cell->coordpt7[1]>ymax) ymax=cell->coordpt7[1];
248     if (cell->coordpt7[1]<ymin) ymin=cell->coordpt7[1];
249     if (cell->coordpt7[2]>zmax) zmax=cell->coordpt7[2];
250     if (cell->coordpt7[2]<zmin) zmin=cell->coordpt7[2];
251     if (cell->coordpt8[0]>xmax) xmax=cell->coordpt8[0];
252     if (cell->coordpt8[0]<xmin) xmin=cell->coordpt8[0];
253     if (cell->coordpt8[1]>ymax) ymax=cell->coordpt8[1];
254     if (cell->coordpt8[1]<ymin) ymin=cell->coordpt8[1];
255     if (cell->coordpt8[2]>zmax) zmax=cell->coordpt8[2];
256     if (cell->coordpt8[2]<zmin) zmin=cell->coordpt8[2];
257     for (int k=0;k<nb_renseignement;k++)
258     {
259     if (cell->get_valeur(k,0)>valmax[k]) valmax[k]=cell->get_valeur(k,0);
260     if (cell->get_valeur(k,0)<valmin[k]) valmin[k]=cell->get_valeur(k,0);
261     if (cell->get_valeur(k,1)>valmax[k]) valmax[k]=cell->get_valeur(k,1);
262     if (cell->get_valeur(k,1)<valmin[k]) valmin[k]=cell->get_valeur(k,1);
263     if (cell->get_valeur(k,2)>valmax[k]) valmax[k]=cell->get_valeur(k,2);
264     if (cell->get_valeur(k,2)<valmin[k]) valmin[k]=cell->get_valeur(k,2);
265     if (cell->get_valeur(k,3)>valmax[k]) valmax[k]=cell->get_valeur(k,3);
266     if (cell->get_valeur(k,3)<valmin[k]) valmin[k]=cell->get_valeur(k,3);
267     if (cell->get_valeur(k,4)>valmax[k]) valmax[k]=cell->get_valeur(k,4);
268     if (cell->get_valeur(k,4)<valmin[k]) valmin[k]=cell->get_valeur(k,4);
269     if (cell->get_valeur(k,5)>valmax[k]) valmax[k]=cell->get_valeur(k,5);
270     if (cell->get_valeur(k,5)<valmin[k]) valmin[k]=cell->get_valeur(k,5);
271     if (cell->get_valeur(k,6)>valmax[k]) valmax[k]=cell->get_valeur(k,6);
272     if (cell->get_valeur(k,6)<valmin[k]) valmin[k]=cell->get_valeur(k,6);
273     if (cell->get_valeur(k,7)>valmax[k]) valmax[k]=cell->get_valeur(k,7);
274     if (cell->get_valeur(k,7)<valmin[k]) valmin[k]=cell->get_valeur(k,7);
275     }
276     }
277     boite.reinit(xmin,ymin,zmin,xmax,ymax,zmax);
278     grille=new TPL_GRILLE<celluleaff*>;
279     grille->initialiser(xmin,ymin,zmin,xmax,ymax,zmax,20,20,20);
280     for (int i=0;i<nb;i++)
281     {
282     celluleaff* cell=lst_cellule[i];
283     grille->inserer(cell);
284     }
285     recadre(dx,dy,0);
286     initvue();
287     redess();
288     TrackBar1->Min=0;
289     TrackBar1->Max=100;
290     TrackBar1->Position=0;
291     TrackBar2->Min=0;
292     TrackBar2->Max=100;
293     TrackBar2->Position=100;
294     TrackBar3->Min=0;
295     TrackBar3->Max=100;
296     TrackBar3->Position=0;
297     TrackBar4->Min=0;
298     TrackBar4->Max=100;
299     TrackBar4->Position=100;
300     TrackBar5->Min=0;
301     TrackBar5->Max=100;
302     TrackBar5->Position=0;
303     TrackBar6->Min=0;
304     TrackBar6->Max=100;
305     TrackBar6->Position=100;
306     return;
307     }
308     }
309     MessageBox(Handle,"Fichier non valide","Erreur",MB_OK);
310     Close();
311     }
312     //---------------------------------------------------------------------------
313    
314     void __fastcall Tvisucttform::FormActivate(TObject *Sender)
315     {
316     MainForm->ToolBar4->Visible=true;
317     MainForm->activecttform=this;
318     FILE* in=fopen(Caption.c_str(),"rt");
319     if (in!=NULL)
320     {
321     std::ftime ft;
322     getftime(fileno(in), &ft);
323     char mess[1000];
324     sprintf(mess,"Heure fichier: %02u:%02u:%02u\n",ft.ft_hour, ft.ft_min,ft.ft_tsec * 2);
325     MainForm->StatusBar->Panels->Items[3]->Text=mess;
326     sprintf(mess,"Jour fichier: %02u/%02u/%02u\n",ft.ft_day, ft.ft_month,ft.ft_year+1980);
327     MainForm->StatusBar->Panels->Items[4]->Text=mess;
328     fclose(in);
329     }
330    
331     }
332     //---------------------------------------------------------------------------
333    
334     void __fastcall Tvisucttform::FormDeactivate(TObject *Sender)
335     {
336     MainForm->ToolBar4->Visible=false;
337     MainForm->activecttform=NULL;
338     MainForm->StatusBar->Panels->Items[3]->Text="";
339     MainForm->StatusBar->Panels->Items[4]->Text="";
340     }
341     //---------------------------------------------------------------------------
342    
343     void __fastcall Tvisucttform::configExecute(TObject *Sender)
344     {
345     configwin->ShowModal();
346     }
347     //---------------------------------------------------------------------------
348    
349     void __fastcall Tvisucttform::FormCreate(TObject *Sender)
350     {
351     hdc = GetDC(Handle);
352     SetPixelFormatDescriptor();
353     hrc = wglCreateContext(hdc);
354     if (hrc == NULL)
355     ShowMessage(":-)~ hrc == NULL");
356     if(wglMakeCurrent(hdc, hrc) == false)
357     ShowMessage("Could not MakeCurrent");
358     glClearColor(MainForm->valeurconfig[57],MainForm->valeurconfig[58],MainForm->valeurconfig[59], 0.0f);
359     }
360     //---------------------------------------------------------------------------
361     void __fastcall Tvisucttform::SetPixelFormatDescriptor(void)
362     {
363     PIXELFORMATDESCRIPTOR pfd = {
364     sizeof(PIXELFORMATDESCRIPTOR),
365     1,
366     PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
367     PFD_TYPE_RGBA,
368     24,
369     0,0,0,0,0,0,
370     0,0,
371     0,0,0,0,0,
372     32,
373     0,
374     0,
375     PFD_MAIN_PLANE,
376     0,
377     0,0,
378     };
379     int PixelFormat = ChoosePixelFormat(hdc, &pfd);
380     SetPixelFormat(hdc, PixelFormat, &pfd);
381     }
382     //---------------------------------------------------------------------------
383     void __fastcall Tvisucttform::recadre(double dx,double dy,int etat)
384     {
385     wglMakeCurrent(hdc,hrc);
386     GLfloat w = ClientWidth-Panel1->Width;
387     GLfloat h = ClientHeight;
388     char mess[255];
389     if (etat==0) glViewport(0, 0, w, h);
390     glMatrixMode(GL_PROJECTION);
391     glLoadIdentity();
392     double d=max(boite.get_xmax()-boite.get_xmin(),boite.get_ymax()-boite.get_ymin());
393     d=max(d,boite.get_zmax()-boite.get_zmin());
394     d=d*1.75/2.;
395     double aspect=w/h;
396     double xmin,ymin,xmax,ymax;
397     if (w<h) xmin=boite.get_xcentre()-d+dx; else xmin=boite.get_xcentre()-d*aspect+dx;
398     if (w<h) ymin=boite.get_ycentre()-d/aspect+dy; else ymin=boite.get_ycentre()-d+dy;
399     double zmin=boite.get_zcentre()-100*d;
400     if (w<h) xmax=xmin+2.*d; else xmax=xmin+2.*d*aspect;
401     if (w<h) ymax=ymin+2.*d/aspect; else ymax=ymin+2.*d;
402     double zmax=zmin+200.*d;
403     glOrtho(xmin,xmax,ymin,ymax,zmin,zmax);
404     }
405     //---------------------------------------------------------------------------
406     void __fastcall Tvisucttform::dessineaxe(void)
407     {
408     double d=max(boite.get_xmax()-boite.get_xmin(),boite.get_ymax()-boite.get_ymin());
409     d=max(d,boite.get_zmax()-boite.get_zmin());
410     d=d*MainForm->valeurconfig[10];
411     glLineWidth(MainForm->valeurconfig[9]);
412     glBegin(GL_LINES);
413     glColor3f(MainForm->valeurconfig[0],MainForm->valeurconfig[1],MainForm->valeurconfig[2]);
414     glVertex3f(0.0,0.0,0.0);
415     glVertex3f(d,0.0,0.0);
416     glColor3f(MainForm->valeurconfig[3],MainForm->valeurconfig[4],MainForm->valeurconfig[5]);
417     glVertex3f(0.0,0.0,0.0);
418     glVertex3f(0.0,d,0.0);
419     glColor3f(MainForm->valeurconfig[6],MainForm->valeurconfig[7],MainForm->valeurconfig[8]);
420     glVertex3f(0.0,0.0,0.0);
421     glVertex3f(0.0,0.0,d);
422     glEnd();
423     }
424     //---------------------------------------------------------------------------
425    
426    
427     void __fastcall Tvisucttform::FormPaint(TObject *Sender)
428     {
429     wglMakeCurrent(hdc,hrc);
430     glClearColor(MainForm->valeurconfig[57],MainForm->valeurconfig[58],MainForm->valeurconfig[59], 0.0f);
431 francois 62 for (int i=0;i<14;i++)
432     {
433     RGB_r[i]=MainForm->valeurconfig[66+3*i]*255.;
434     RGB_g[i]=MainForm->valeurconfig[67+3*i]*255.;
435     RGB_b[i]=MainForm->valeurconfig[68+3*i]*255.;
436     }
437 5 redess();
438     }
439     //---------------------------------------------------------------------------
440     void __fastcall Tvisucttform::redess(void)
441     {
442     wglMakeCurrent(hdc,hrc);
443     glClearColor(MainForm->valeurconfig[57],MainForm->valeurconfig[58],MainForm->valeurconfig[59], 0.0f);
444     Label1->Color=getcolor(RGB_r[12]/255.,RGB_g[12]/255.,RGB_b[12]/255.);
445     Label2->Color=getcolor(RGB_r[0]/255.,RGB_g[0]/255.,RGB_b[0]/255.);
446     char mess[100];
447     int numvaleur=ListBox1->ItemIndex;
448     sprintf(mess,"%f",valmax[numvaleur]);
449     Label3->Caption=mess;
450     sprintf(mess,"%f",valmin[numvaleur]);
451     Label4->Caption=mess;
452     wglMakeCurrent(hdc,hrc);
453     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
454     int nb=lst_cellule.size();
455     double ecart=valmax[numvaleur]-valmin[numvaleur];
456     double pr=MainForm->valeurconfig[60]-MainForm->valeurconfig[63];
457     double pg=MainForm->valeurconfig[61]-MainForm->valeurconfig[64];
458     double pb=MainForm->valeurconfig[62]-MainForm->valeurconfig[65];
459     if (render==1)
460     {
461     glEnable(GL_DEPTH_TEST);
462     glEnable(GL_POLYGON_OFFSET_FILL);
463     glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
464     }
465     else
466     {
467     glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
468     }
469     glBegin(GL_QUADS);
470     for (int i=0;i<nb;i++)
471     {
472     celluleaff* cell=lst_cellule[i];
473     double *xyz1=cell->coordpt1;
474     double *xyz2=cell->coordpt2;
475     double *xyz3=cell->coordpt3;
476     double *xyz4=cell->coordpt4;
477     double *xyz5=cell->coordpt5;
478     double *xyz6=cell->coordpt6;
479     double *xyz7=cell->coordpt7;
480     double *xyz8=cell->coordpt8;
481     BOITE_3D boite1(xyz1[0],xyz1[1],xyz1[2],xyz7[0],xyz7[1],xyz7[2]);
482     double x1=boite.get_xmin()+TrackBar1->Position*(boite.get_xmax()-boite.get_xmin())/100.;
483     double y1=boite.get_ymin()+TrackBar3->Position*(boite.get_ymax()-boite.get_ymin())/100.;
484     double z1=boite.get_zmin()+TrackBar5->Position*(boite.get_zmax()-boite.get_zmin())/100.;
485     double x2=boite.get_xmin()+TrackBar2->Position*(boite.get_xmax()-boite.get_xmin())/100.;
486     double y2=boite.get_ymin()+TrackBar4->Position*(boite.get_ymax()-boite.get_ymin())/100.;
487     double z2=boite.get_zmin()+TrackBar6->Position*(boite.get_zmax()-boite.get_zmin())/100.;
488     BOITE_3D boite2(x1,y1,z1,x2,y2,z2);
489     if (boite1*boite2)
490     {
491     double xyzs1[3],xyzs2[3],xyzs3[3],xyzs4[3],xyzs5[3],xyzs6[3],xyzs7[3],xyzs8[3];
492     if (shrink)
493     {
494     double xg=0.125*(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0]+xyz5[0]+xyz6[0]+xyz7[0]+xyz8[0]);
495     double yg=0.125*(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1]+xyz5[1]+xyz6[1]+xyz7[1]+xyz8[1]);
496     double zg=0.125*(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2]+xyz5[2]+xyz6[2]+xyz7[2]+xyz8[2]);
497     xyzs1[0]=xg+facteur_shrink*(xyz1[0]-xg);
498     xyzs1[1]=yg+facteur_shrink*(xyz1[1]-yg);
499     xyzs1[2]=zg+facteur_shrink*(xyz1[2]-zg);
500     xyz1=xyzs1;
501     xyzs2[0]=xg+facteur_shrink*(xyz2[0]-xg);
502     xyzs2[1]=yg+facteur_shrink*(xyz2[1]-yg);
503     xyzs2[2]=zg+facteur_shrink*(xyz2[2]-zg);
504     xyz2=xyzs2;
505     xyzs3[0]=xg+facteur_shrink*(xyz3[0]-xg);
506     xyzs3[1]=yg+facteur_shrink*(xyz3[1]-yg);
507     xyzs3[2]=zg+facteur_shrink*(xyz3[2]-zg);
508     xyz3=xyzs3;
509     xyzs4[0]=xg+facteur_shrink*(xyz4[0]-xg);
510     xyzs4[1]=yg+facteur_shrink*(xyz4[1]-yg);
511     xyzs4[2]=zg+facteur_shrink*(xyz4[2]-zg);
512     xyz4=xyzs4;
513     xyzs5[0]=xg+facteur_shrink*(xyz5[0]-xg);
514     xyzs5[1]=yg+facteur_shrink*(xyz5[1]-yg);
515     xyzs5[2]=zg+facteur_shrink*(xyz5[2]-zg);
516     xyz5=xyzs5;
517     xyzs6[0]=xg+facteur_shrink*(xyz6[0]-xg);
518     xyzs6[1]=yg+facteur_shrink*(xyz6[1]-yg);
519     xyzs6[2]=zg+facteur_shrink*(xyz6[2]-zg);
520     xyz6=xyzs6;
521     xyzs7[0]=xg+facteur_shrink*(xyz7[0]-xg);
522     xyzs7[1]=yg+facteur_shrink*(xyz7[1]-yg);
523     xyzs7[2]=zg+facteur_shrink*(xyz7[2]-zg);
524     xyz7=xyzs7;
525     xyzs8[0]=xg+facteur_shrink*(xyz8[0]-xg);
526     xyzs8[1]=yg+facteur_shrink*(xyz8[1]-yg);
527     xyzs8[2]=zg+facteur_shrink*(xyz8[2]-zg);
528     xyz8=xyzs8;
529     }
530     if (ecart<0.0001) ecart=1;
531     //face1
532     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,0)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,0)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,0)-valmin[numvaleur])/ecart);
533     int pos=(int) ((cell->get_valeur(numvaleur,0)-valmin[numvaleur])*12./ecart);
534     if (pos<0) pos=0;
535     if (pos>12) pos=12;
536     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
537     glVertex3f(xyz1[0],xyz1[1],xyz1[2]);
538     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,1)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,1)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,1)-valmin[numvaleur])/ecart);
539     pos=(int) ((cell->get_valeur(numvaleur,1)-valmin[numvaleur])*12./ecart);
540     if (pos<0) pos=0;
541     if (pos>12) pos=12;
542     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
543     glVertex3f(xyz2[0],xyz2[1],xyz2[2]);
544     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,2)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,2)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,2)-valmin[numvaleur])/ecart);
545     pos=(int) ((cell->get_valeur(numvaleur,2)-valmin[numvaleur])*12./ecart);
546     if (pos<0) pos=0;
547     if (pos>12) pos=12;
548     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
549     glVertex3f(xyz3[0],xyz3[1],xyz3[2]);
550     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,3)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,3)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,3)-valmin[numvaleur])/ecart);
551     pos=(int) ((cell->get_valeur(numvaleur,3)-valmin[numvaleur])*12./ecart);
552     if (pos<0) pos=0;
553     if (pos>12) pos=12;
554     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
555     glVertex3f(xyz4[0],xyz4[1],xyz4[2]);
556     //face2
557     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,4)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,4)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,4)-valmin[numvaleur])/ecart);
558     pos=(int) ((cell->get_valeur(numvaleur,4)-valmin[numvaleur])*12./ecart);
559     if (pos<0) pos=0;
560     if (pos>12) pos=12;
561     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
562     glVertex3f(xyz5[0],xyz5[1],xyz5[2]);
563     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,5)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,5)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,5)-valmin[numvaleur])/ecart);
564     pos=(int) ((cell->get_valeur(numvaleur,5)-valmin[numvaleur])*12./ecart);
565     if (pos<0) pos=0;
566     if (pos>12) pos=12;
567     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
568     glVertex3f(xyz6[0],xyz6[1],xyz6[2]);
569     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,6)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,6)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,6)-valmin[numvaleur])/ecart);
570     pos=(int) ((cell->get_valeur(numvaleur,6)-valmin[numvaleur])*12./ecart);
571     if (pos<0) pos=0;
572     if (pos>12) pos=12;
573     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
574     glVertex3f(xyz7[0],xyz7[1],xyz7[2]);
575     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,7)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,7)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,7)-valmin[numvaleur])/ecart);
576     pos=(int) ((cell->get_valeur(numvaleur,7)-valmin[numvaleur])*12./ecart);
577     if (pos<0) pos=0;
578     if (pos>12) pos=12;
579     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
580     glVertex3f(xyz8[0],xyz8[1],xyz8[2]);
581     //face3
582     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,0)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,0)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,0)-valmin[numvaleur])/ecart);
583     pos=(int) ((cell->get_valeur(numvaleur,0)-valmin[numvaleur])*12./ecart);
584     if (pos<0) pos=0;
585     if (pos>12) pos=12;
586     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
587     glVertex3f(xyz1[0],xyz1[1],xyz1[2]);
588     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,1)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,1)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,1)-valmin[numvaleur])/ecart);
589     pos=(int) ((cell->get_valeur(numvaleur,1)-valmin[numvaleur])*12./ecart);
590     if (pos<0) pos=0;
591     if (pos>12) pos=12;
592     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
593     glVertex3f(xyz2[0],xyz2[1],xyz2[2]);
594     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,5)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,5)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,5)-valmin[numvaleur])/ecart);
595     pos=(int) ((cell->get_valeur(numvaleur,5)-valmin[numvaleur])*12./ecart);
596     if (pos<0) pos=0;
597     if (pos>12) pos=12;
598     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
599     glVertex3f(xyz6[0],xyz6[1],xyz6[2]);
600     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,4)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,4)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,4)-valmin[numvaleur])/ecart);
601     pos=(int) ((cell->get_valeur(numvaleur,4)-valmin[numvaleur])*12./ecart);
602     if (pos<0) pos=0;
603     if (pos>12) pos=12;
604     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
605     glVertex3f(xyz5[0],xyz5[1],xyz5[2]);
606     //face4
607     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,1)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,1)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,1)-valmin[numvaleur])/ecart);
608     pos=(int) ((cell->get_valeur(numvaleur,1)-valmin[numvaleur])*12./ecart);
609     if (pos<0) pos=0;
610     if (pos>12) pos=12;
611     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
612     glVertex3f(xyz2[0],xyz2[1],xyz2[2]);
613     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,2)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,2)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,2)-valmin[numvaleur])/ecart);
614     pos=(int) ((cell->get_valeur(numvaleur,2)-valmin[numvaleur])*12./ecart);
615     if (pos<0) pos=0;
616     if (pos>12) pos=12;
617     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
618     glVertex3f(xyz3[0],xyz3[1],xyz3[2]);
619     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,6)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,6)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,6)-valmin[numvaleur])/ecart);
620     pos=(int) ((cell->get_valeur(numvaleur,6)-valmin[numvaleur])*12./ecart);
621     if (pos<0) pos=0;
622     if (pos>12) pos=12;
623     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
624     glVertex3f(xyz7[0],xyz7[1],xyz7[2]);
625     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,5)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,5)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,5)-valmin[numvaleur])/ecart);
626     pos=(int) ((cell->get_valeur(numvaleur,5)-valmin[numvaleur])*12./ecart);
627     if (pos<0) pos=0;
628     if (pos>12) pos=12;
629     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
630     glVertex3f(xyz6[0],xyz6[1],xyz6[2]);
631     //face5
632     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,2)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,2)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,2)-valmin[numvaleur])/ecart);
633     pos=(int) ((cell->get_valeur(numvaleur,2)-valmin[numvaleur])*12./ecart);
634     if (pos<0) pos=0;
635     if (pos>12) pos=12;
636     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
637     glVertex3f(xyz3[0],xyz3[1],xyz3[2]);
638     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,3)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,3)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,3)-valmin[numvaleur])/ecart);
639     pos=(int) ((cell->get_valeur(numvaleur,3)-valmin[numvaleur])*12./ecart);
640     if (pos<0) pos=0;
641     if (pos>12) pos=12;
642     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
643     glVertex3f(xyz4[0],xyz4[1],xyz4[2]);
644     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,7)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,7)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,7)-valmin[numvaleur])/ecart);
645     pos=(int) ((cell->get_valeur(numvaleur,7)-valmin[numvaleur])*12./ecart);
646     if (pos<0) pos=0;
647     if (pos>12) pos=12;
648     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
649     glVertex3f(xyz8[0],xyz8[1],xyz8[2]);
650     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,6)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,6)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,6)-valmin[numvaleur])/ecart);
651     pos=(int) ((cell->get_valeur(numvaleur,6)-valmin[numvaleur])*12./ecart);
652     if (pos<0) pos=0;
653     if (pos>12) pos=12;
654     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
655     glVertex3f(xyz7[0],xyz7[1],xyz7[2]);
656     //face6
657     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,3)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,3)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,3)-valmin[numvaleur])/ecart);
658     pos=(int) ((cell->get_valeur(numvaleur,3)-valmin[numvaleur])*12./ecart);
659     if (pos<0) pos=0;
660     if (pos>12) pos=12;
661     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
662     glVertex3f(xyz4[0],xyz4[1],xyz4[2]);
663     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,0)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,0)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,0)-valmin[numvaleur])/ecart);
664     pos=(int) ((cell->get_valeur(numvaleur,0)-valmin[numvaleur])*12./ecart);
665     if (pos<0) pos=0;
666     if (pos>12) pos=12;
667     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
668     glVertex3f(xyz1[0],xyz1[1],xyz1[2]);
669     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,4)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,4)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,4)-valmin[numvaleur])/ecart);
670     pos=(int) ((cell->get_valeur(numvaleur,4)-valmin[numvaleur])*12./ecart);
671     if (pos<0) pos=0;
672     if (pos>12) pos=12;
673     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
674     glVertex3f(xyz5[0],xyz5[1],xyz5[2]);
675     glColor3f(MainForm->valeurconfig[63]+pr*(cell->get_valeur(numvaleur,7)-valmin[numvaleur])/ecart,MainForm->valeurconfig[64]+pg*(cell->get_valeur(numvaleur,7)-valmin[numvaleur])/ecart,MainForm->valeurconfig[65]+pb*(cell->get_valeur(numvaleur,7)-valmin[numvaleur])/ecart);
676     pos=(int) ((cell->get_valeur(numvaleur,7)-valmin[numvaleur])*12./ecart);
677     if (pos<0) pos=0;
678     if (pos>12) pos=12;
679     glColor3f(RGB_r[pos]/255.,RGB_g[pos]/255.,RGB_b[pos]/255.);
680     glVertex3f(xyz8[0],xyz8[1],xyz8[2]);
681     }
682     }
683     glEnd();
684     if (axe==1) dessineaxe();
685     glFlush();
686     SwapBuffers(hdc);
687     }
688    
689     void __fastcall Tvisucttform::transformation(TObject *Sender, WORD &Key,TShiftState Shift)
690     {
691     wglMakeCurrent(hdc,hrc);
692     GLfloat w = ClientWidth-Panel1->Width;
693     GLfloat h = ClientHeight;
694     glMatrixMode(GL_MODELVIEW);
695     double un=0.005*min(w,h);
696     if (Key==VK_LEFT)
697     {
698     dx=dx+un;
699     recadre(dx,dy,1);
700     }
701     if (Key==VK_RIGHT)
702     {
703     dx=dx-un;
704     recadre(dx,dy,1);
705     }
706     if (Key==VK_UP)
707     {
708     dy=dy-un;
709     recadre(dx,dy,1);
710     }
711     if (Key==VK_DOWN)
712     {
713     dy=dy+un;
714     recadre(dx,dy,1);
715     }
716     if(Key == VK_F1)
717     {
718     zoom++;
719     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
720     glScalef(1.1,1.1,1.1);
721     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
722     }
723     if(Key == VK_F2)
724     {
725     zoom--;
726     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
727     glScalef(1./1.1,1./1.1,1./1.1);
728     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
729     }
730     if(Key == VK_F3)
731     {
732     dx=0.;
733     dy=0.;
734     zoom=0;
735     recadre(dx,dy,1);
736     initvue();
737     }
738     if(Key == VK_F4)
739     {
740     if (zoom>0)
741     glScalef(1./pow(1.1,zoom),1./pow(1.1,zoom),1./pow(1.1,zoom));
742     if (zoom<0)
743     glScalef(pow(1.1,-zoom),pow(1.1,-zoom),pow(1.1,-zoom));
744     zoom=0;
745     dx=0;
746     dy=0;
747     recadre(dx,dy,1);
748     }
749     if(Key == VK_HOME)
750     {
751     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
752     glRotatef(-5, 0.0, 1.0, 0.0);
753     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
754     }
755     if(Key == VK_END)
756     {
757     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
758     glRotatef(5, 0.0, 1.0, 0.0);
759     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
760     }
761     if(Key == VK_INSERT)
762     {
763     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
764     glRotatef(-5, 1.0, 0.0, 0.0);
765     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
766     }
767     if(Key == VK_DELETE)
768     {
769     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
770     glRotatef(5, 1.0, 0.0, 0.0);
771     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
772     }
773     if(Key == VK_PRIOR)
774     {
775     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
776     glRotatef(-5, 0.0, 0.0, 1.0);
777     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
778     }
779     if(Key == VK_NEXT)
780     {
781     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
782     glRotatef(5, 0.0, 0.0, 1.0);
783     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
784     }
785     if (Key==VK_ADD)
786     {
787     facteur_shrink=facteur_shrink+0.05;
788     if (facteur_shrink>1.) facteur_shrink=1;
789     }
790     if (Key==VK_SUBTRACT)
791     {
792     facteur_shrink=facteur_shrink-0.05;
793     if (facteur_shrink<0.) facteur_shrink=0.;
794     }
795    
796     redess();
797     }
798     //---------------------------------------------------------------------------
799     void __fastcall Tvisucttform::FormResize(TObject *Sender)
800     {
801     int w=ClientWidth-Panel1->Width;
802     int h=ClientHeight;
803     while(w==0)
804     {
805     Width++;
806     w=ClientWidth-Panel1->Width;
807     }
808     while(h==0)
809     {
810     Height++;
811     h=ClientHeight;
812     }
813    
814     recadre(dx,dy,0);
815     redess();
816     }
817     //---------------------------------------------------------------------------
818    
819     void __fastcall Tvisucttform::initvue(void)
820     {
821     wglMakeCurrent(hdc,hrc);
822     glMatrixMode(GL_MODELVIEW);
823     glLoadIdentity();
824     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
825     glRotatef(-90., 0.0, 1.0, 0.0);
826     glRotatef(-90., 1.0, 0.0, 0.0);
827     glRotatef(45., 0.0, 1.0, 0.0);
828     glRotatef(-45., 0.0, 0.0, 1.0);
829     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
830     }
831     //---------------------------------------------------------------------------
832    
833     void __fastcall Tvisucttform::FormKeyDown(TObject *Sender, WORD &Key,
834     TShiftState Shift)
835     {
836     transformation(Sender,Key,Shift);
837     }
838     //---------------------------------------------------------------------------
839    
840     void __fastcall Tvisucttform::FormMouseDown(TObject *Sender,
841     TMouseButton Button, TShiftState Shift, int X, int Y)
842     {
843     if (Button==mbRight)
844     if (debut_trans==false)
845     {
846     debut_trans=true;
847     xdepart=X;
848     ydepart=Y;
849     }
850     if (Button==mbMiddle)
851     if (debut_rot==false)
852     {
853     debut_rot=true;
854     xrot=X;
855     yrot=Y;
856     }
857    
858     }
859     //---------------------------------------------------------------------------
860    
861     void __fastcall Tvisucttform::FormMouseMove(TObject *Sender,
862     TShiftState Shift, int X, int Y)
863     {
864     if (debut_trans==true)
865     {
866     GLfloat w = ClientWidth-Panel1->Width;
867     GLfloat h = ClientHeight;
868     double aspect=w/h;
869     double d=max(boite.get_xmax()-boite.get_xmin(),boite.get_ymax()-boite.get_ymin());
870     d=max(d,boite.get_zmax()-boite.get_zmin());
871     d=d*1.5;
872     double xmin,ymin,xmax,ymax;
873     if (w<h) xmin=boite.get_xcentre()-d+dx; else xmin=boite.get_xcentre()-d*aspect+dx;
874     if (w<h) ymin=boite.get_ycentre()-d/aspect+dy; else ymin=boite.get_ycentre()-d+dy;
875     if (w<h) xmax=xmin+2.*d; else xmax=xmin+2.*d*aspect;
876     if (w<h) ymax=ymin+2.*d/aspect; else ymax=ymin+2.*d;
877     dx=dx+(xdepart-X)/2./w*(xmax-xmin);
878     dy=dy-(ydepart-Y)/2./h*(ymax-ymin);
879     recadre(dx,dy,1);
880     redess();
881     xdepart=X;
882     ydepart=Y;
883     }
884     if (debut_rot==true)
885     {
886     GLfloat w = ClientWidth-Panel1->Width;
887     GLfloat h = ClientHeight;
888     double deltax=X-xrot;
889     double deltay=Y-yrot;
890     double norme=deltax*deltax+deltay*deltay;
891     norme=sqrt(norme);
892     if (norme>=1.)
893     {
894     glMatrixMode(GL_MODELVIEW);
895     deltax=deltax*1.0/norme;
896     deltay=deltay*1.0/norme;
897     GLdouble matriceproj[16],matricevue[16];
898     GLint matriceport[4];
899     glGetIntegerv(GL_VIEWPORT,matriceport);
900     glGetDoublev(GL_MODELVIEW_MATRIX,matricevue);
901     glGetDoublev(GL_PROJECTION_MATRIX,matriceproj);
902     double orx,ory,orz;
903     double rx,ry,rz;
904     gluUnProject((GLdouble)xrot,(GLdouble)yrot,0.,matricevue,matriceproj,matriceport,&orx,&ory,&orz);
905     gluUnProject(xrot+deltay,yrot+deltax,0.,matricevue,matriceproj,matriceport,&rx,&ry,&rz);
906     rx=rx-orx;
907     ry=ry-ory;
908     rz=rz-orz;
909     double norme2=sqrt(rx*rx+ry*ry+rz*rz);
910     rx=rx/norme2;
911     ry=ry/norme2;
912     rz=rz/norme2;
913     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
914     glRotatef(norme/sqrt(w*h)*360, rx, ry, rz);
915     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
916     redess();
917     }
918     xrot=X;
919     yrot=Y;
920     }
921    
922    
923    
924     }
925     //---------------------------------------------------------------------------
926    
927     void __fastcall Tvisucttform::FormMouseUp(TObject *Sender,
928     TMouseButton Button, TShiftState Shift, int X, int Y)
929     {
930     if (Button==mbRight)
931     if (debut_trans==true)
932     {
933     GLfloat w = ClientWidth-Panel1->Width;
934     GLfloat h = ClientHeight;
935     double aspect=w/h;
936     debut_trans=false;
937     double d=max(boite.get_xmax()-boite.get_xmin(),boite.get_ymax()-boite.get_ymin());
938     d=max(d,boite.get_zmax()-boite.get_zmin());
939     d=d*1.5;
940     double xmin,ymin,xmax,ymax;
941     if (w<h) xmin=boite.get_xcentre()-d+dx; else xmin=boite.get_xcentre()-d*aspect+dx;
942     if (w<h) ymin=boite.get_ycentre()-d/aspect+dy; else ymin=boite.get_ycentre()-d+dy;
943     if (w<h) xmax=xmin+2.*d; else xmax=xmin+2.*d*aspect;
944     if (w<h) ymax=ymin+2.*d/aspect; else ymax=ymin+2.*d;
945     dx=dx+(xdepart-X)/2./w*(xmax-xmin);
946     dy=dy-(ydepart-Y)/2./h*(ymax-ymin);
947     recadre(dx,dy,1);
948     redess();
949     xdepart=X;
950     ydepart=Y;
951     }
952     if (Button==mbMiddle) debut_rot=false;
953     }
954     //---------------------------------------------------------------------------
955    
956     void __fastcall Tvisucttform::FormMouseWheelDown(TObject *Sender,
957     TShiftState Shift, TPoint &MousePos, bool &Handled)
958     {
959     wglMakeCurrent(hdc,hrc);
960     glMatrixMode(GL_MODELVIEW);
961     zoom++;
962     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
963     glScalef(1.1,1.1,1.1);
964     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
965     redess();
966    
967     }
968     //---------------------------------------------------------------------------
969    
970     void __fastcall Tvisucttform::FormMouseWheelUp(TObject *Sender,
971     TShiftState Shift, TPoint &MousePos, bool &Handled)
972     {
973     wglMakeCurrent(hdc,hrc);
974     glMatrixMode(GL_MODELVIEW);
975     zoom--;
976     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
977     glScalef(1./1.1,1./1.1,1./1.1);
978     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
979     redess();
980    
981     }
982     //---------------------------------------------------------------------------
983    
984     void __fastcall Tvisucttform::axeonExecute(TObject *Sender)
985     {
986     axe=1;
987     redess();
988     }
989     //---------------------------------------------------------------------------
990    
991     void __fastcall Tvisucttform::axeoffExecute(TObject *Sender)
992     {
993     axe=0;
994     redess();
995     }
996     //---------------------------------------------------------------------------
997    
998     void __fastcall Tvisucttform::shrinkonExecute(TObject *Sender)
999     {
1000     shrink=1;
1001     redess();
1002     }
1003     //---------------------------------------------------------------------------
1004    
1005     void __fastcall Tvisucttform::shrinkoffExecute(TObject *Sender)
1006     {
1007     shrink=0;
1008     redess();
1009     }
1010     //---------------------------------------------------------------------------
1011    
1012     void __fastcall Tvisucttform::renderonExecute(TObject *Sender)
1013     {
1014     render=1;
1015     redess();
1016     }
1017     //---------------------------------------------------------------------------
1018    
1019     void __fastcall Tvisucttform::renderoffExecute(TObject *Sender)
1020     {
1021     render=0;
1022     redess();
1023     }
1024     //---------------------------------------------------------------------------
1025    
1026     void __fastcall Tvisucttform::xmExecute(TObject *Sender)
1027     {
1028     glMatrixMode(GL_MODELVIEW);
1029     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
1030     glRotatef(-5, 1.0, 0.0, 0.0);
1031     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
1032     redess();
1033     }
1034     //---------------------------------------------------------------------------
1035    
1036     void __fastcall Tvisucttform::xpExecute(TObject *Sender)
1037     {
1038     glMatrixMode(GL_MODELVIEW);
1039     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
1040     glRotatef(5, 1.0, 0.0, 0.0);
1041     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
1042     redess();
1043     }
1044     //---------------------------------------------------------------------------
1045    
1046     void __fastcall Tvisucttform::ymExecute(TObject *Sender)
1047     {
1048     glMatrixMode(GL_MODELVIEW);
1049     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
1050     glRotatef(-5, 0.0, 1.0, 0.0);
1051     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
1052     redess();
1053     }
1054     //---------------------------------------------------------------------------
1055    
1056     void __fastcall Tvisucttform::ypExecute(TObject *Sender)
1057     {
1058     glMatrixMode(GL_MODELVIEW);
1059     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
1060     glRotatef(5, 0.0, 1.0, 0.0);
1061     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
1062     redess();
1063     }
1064     //---------------------------------------------------------------------------
1065    
1066     void __fastcall Tvisucttform::zmExecute(TObject *Sender)
1067     {
1068     glMatrixMode(GL_MODELVIEW);
1069     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
1070     glRotatef(-5, 0.0, 0.0, 1.0);
1071     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
1072     redess();
1073     }
1074     //---------------------------------------------------------------------------
1075    
1076     void __fastcall Tvisucttform::zpExecute(TObject *Sender)
1077     {
1078     glMatrixMode(GL_MODELVIEW);
1079     glTranslated(boite.get_xcentre(),boite.get_ycentre(),boite.get_zcentre());
1080     glRotatef(5, 0.0, 0.0, 1.0);
1081     glTranslated(-boite.get_xcentre(),-boite.get_ycentre(),-boite.get_zcentre());
1082     redess();
1083     }
1084     //---------------------------------------------------------------------------
1085     TColor __fastcall Tvisucttform::getcolor(double r,double g,double b)
1086     {
1087     int rr=int(r*255.);
1088     int gg=int(g*255.);
1089     int bb=int(b*255.);
1090     int color=rr+(gg<<8)+(bb<<16);
1091     return (TColor)color;
1092     }
1093     //---------------------------------------------------------------------------
1094    
1095     void __fastcall Tvisucttform::f3Execute(TObject *Sender)
1096     {
1097     dx=0.;
1098     dy=0.;
1099     zoom=0;
1100     recadre(dx,dy,1);
1101     initvue();
1102     redess();
1103    
1104     }
1105     //---------------------------------------------------------------------------
1106    
1107     void __fastcall Tvisucttform::f4Execute(TObject *Sender)
1108     {
1109     glMatrixMode(GL_MODELVIEW);
1110     if (zoom>0)
1111     glScalef(1./pow(1.1,zoom),1./pow(1.1,zoom),1./pow(1.1,zoom));
1112     if (zoom<0)
1113     glScalef(pow(1.1,-zoom),pow(1.1,-zoom),pow(1.1,-zoom));
1114     zoom=0;
1115     dx=0;
1116     dy=0;
1117     recadre(dx,dy,1);
1118     redess();
1119    
1120     }
1121     //---------------------------------------------------------------------------
1122    
1123     void __fastcall Tvisucttform::TrackBar1Change(TObject *Sender)
1124     {
1125     if (TrackBar2->Position<TrackBar1->Position) TrackBar2->Position=TrackBar1->Position;
1126     ActiveControl=NULL;
1127     redess();
1128     }
1129     //---------------------------------------------------------------------------
1130    
1131     void __fastcall Tvisucttform::TrackBar2Change(TObject *Sender)
1132     {
1133     if (TrackBar2->Position<TrackBar1->Position) TrackBar1->Position=TrackBar2->Position;
1134     ActiveControl=NULL;
1135     redess();
1136     }
1137     //---------------------------------------------------------------------------
1138    
1139    
1140     void __fastcall Tvisucttform::TrackBar3Change(TObject *Sender)
1141     {
1142     if (TrackBar4->Position<TrackBar3->Position) TrackBar4->Position=TrackBar3->Position;
1143     ActiveControl=NULL;
1144     redess();
1145    
1146     }
1147     //---------------------------------------------------------------------------
1148    
1149     void __fastcall Tvisucttform::TrackBar4Change(TObject *Sender)
1150     {
1151     if (TrackBar4->Position<TrackBar3->Position) TrackBar3->Position=TrackBar4->Position;
1152     ActiveControl=NULL;
1153     redess();
1154     }
1155     //---------------------------------------------------------------------------
1156    
1157     void __fastcall Tvisucttform::TrackBar5Change(TObject *Sender)
1158     {
1159     if (TrackBar6->Position<TrackBar5->Position) TrackBar6->Position=TrackBar5->Position;
1160     ActiveControl=NULL;
1161     redess();
1162     }
1163     //---------------------------------------------------------------------------
1164    
1165     void __fastcall Tvisucttform::TrackBar6Change(TObject *Sender)
1166     {
1167     if (TrackBar6->Position<TrackBar5->Position) TrackBar5->Position=TrackBar6->Position;
1168     ActiveControl=NULL;
1169     redess();
1170     }
1171     //---------------------------------------------------------------------------
1172    
1173     void __fastcall Tvisucttform::ListBox1Click(TObject *Sender)
1174     {
1175     wglMakeCurrent(hdc,hrc);
1176     glClearColor(MainForm->valeurconfig[57],MainForm->valeurconfig[58],MainForm->valeurconfig[59], 0.0f);
1177     ActiveControl=NULL;
1178     redess();
1179     }
1180     //---------------------------------------------------------------------------
1181    
1182     void __fastcall Tvisucttform::Appliquerunefonctionunchamps1Click(
1183     TObject *Sender)
1184     {
1185     afm->ComboBox1->Clear();
1186     afm->ComboBox2->ItemIndex=-1;
1187     for (int i=0;i<nb_renseignement;i++)
1188     afm->ComboBox1->Items->Add(ListBox1->Items->Strings[i]);
1189     afm->ShowModal();
1190     if (afm->etat==1)
1191     {
1192     int k=afm->ComboBox1->ItemIndex;
1193     int operation=afm->ComboBox2->ItemIndex;
1194     int nb=lst_cellule.size();
1195     valmax[k]=-1e308;
1196     valmin[k]=1e308;
1197     for (int i=0;i<nb;i++)
1198     {
1199     celluleaff* cell=lst_cellule[i];
1200     for (int l=0;l<8;l++)
1201     {
1202     double val=cell->get_valeur(k,l);
1203     switch (operation)
1204     {
1205     case 0 : val=fabs(val);break;
1206     case 1 : val=cos(val);break;
1207     case 2 : val=sin(val);break;
1208     case 3 : val=tan(val);break;
1209     case 4 : if ( (val<=1.) && (val>=-1.)) val=acos(val); else val=0.; break;
1210     case 5 : if ( (val<=1.) && (val>=-1.)) val=asin(val); else val=0.; break;
1211     case 6 : val=atan(val);break;
1212     case 7 : if (val>0.) val=log(val); else val=0.; break;
1213     case 8 : val=exp(val);break;
1214     case 9 : if (val>0.) val=log10(val); else val=0; break;
1215     case 10 : val=pow(10,val);break;
1216     case 11 : val=-val;break;
1217    
1218     }
1219     cell->change_valeur(k,l,val);
1220     if (val>valmax[k]) valmax[k]=val;
1221     if (val<valmin[k]) valmin[k]=val;
1222     }
1223     }
1224     switch (operation)
1225     {
1226     case 0 : ListBox1->Items->Strings[k]="| " + ListBox1->Items->Strings[k] + " |";break;
1227     case 1 : ListBox1->Items->Strings[k]="cos(" + ListBox1->Items->Strings[k] + ")";break;
1228     case 2 : ListBox1->Items->Strings[k]="sin(" + ListBox1->Items->Strings[k] + ")";break;
1229     case 3 : ListBox1->Items->Strings[k]="tg(" + ListBox1->Items->Strings[k] + ")";break;
1230     case 4 : ListBox1->Items->Strings[k]="acos(" + ListBox1->Items->Strings[k] + ")";break;
1231     case 5 : ListBox1->Items->Strings[k]="asin(" + ListBox1->Items->Strings[k] + ")";break;
1232     case 6 : ListBox1->Items->Strings[k]="atg(" + ListBox1->Items->Strings[k] + ")";break;
1233     case 7 : ListBox1->Items->Strings[k]="ln(" + ListBox1->Items->Strings[k] + ")";break;
1234     case 8 : ListBox1->Items->Strings[k]="e(" + ListBox1->Items->Strings[k] + ")";break;
1235     case 9 : ListBox1->Items->Strings[k]="log(" + ListBox1->Items->Strings[k] + ")";break;
1236     case 10 : ListBox1->Items->Strings[k]="10(" + ListBox1->Items->Strings[k] + ")";break;
1237     case 11 : ListBox1->Items->Strings[k]="-"+ListBox1->Items->Strings[k];break;
1238     }
1239    
1240     }
1241    
1242     }
1243     //---------------------------------------------------------------------------
1244    
1245    
1246    
1247     void __fastcall Tvisucttform::Enregistrercettecarte1Click(TObject *Sender)
1248     {
1249     if (SaveDialog1->Execute())
1250     {
1251     ofstream o(SaveDialog1->FileName.c_str(),ios::out|ios::trunc);
1252     o.precision(16);
1253     o.setf(ios::showpoint);
1254     int nb=lst_cellule.size();
1255     o << nb_renseignement << " " << xmin << " " << ymin << " " << zmin << " " << xmax << " " << ymax << " " << zmax << " " << pasx << " " << pasy << " " << pasz << endl;
1256     for (int i=0;i<nb_renseignement;i++)
1257     o << ListBox1->Items->Strings[i].c_str() << endl;
1258     for (int i=0;i<nb;i++)
1259     {
1260     celluleaff* cell=lst_cellule[i];
1261     double x1=cell->coordpt1[0];
1262     double y1=cell->coordpt1[1];
1263     double z1=cell->coordpt1[2];
1264     double x2=cell->coordpt7[0];
1265     double y2=cell->coordpt7[1];
1266     double z2=cell->coordpt7[2];
1267     o << x1 << " " << y1 << " " << z1;
1268     for (int i=0;i<nb_renseignement;i++)
1269     o << " " << cell->get_valeur(i,0);
1270     o << endl;
1271     o << x2 << " " << y1 << " " << z1 ;
1272     for (int i=0;i<nb_renseignement;i++)
1273     o << " " << cell->get_valeur(i,1);
1274     o << endl;
1275     o << x2 << " " << y2 << " " << z1 ;
1276     for (int i=0;i<nb_renseignement;i++)
1277     o << " " << cell->get_valeur(i,2);
1278     o << endl;
1279     o << x1 << " " << y2 << " " << z1 ;
1280     for (int i=0;i<nb_renseignement;i++)
1281     o << " " << cell->get_valeur(i,3);
1282     o << endl;
1283     o << x1 << " " << y1 << " " << z2 ;
1284     for (int i=0;i<nb_renseignement;i++)
1285     o << " " << cell->get_valeur(i,4);
1286     o << endl;
1287     o << x2 << " " << y1 << " " << z2 ;
1288     for (int i=0;i<nb_renseignement;i++)
1289     o << " " << cell->get_valeur(i,5);
1290     o << endl;
1291     o << x2 << " " << y2 << " " << z2 ;
1292     for (int i=0;i<nb_renseignement;i++)
1293     o << " " << cell->get_valeur(i,6);
1294     o << endl;
1295     o << x1 << " " << y2 << " " << z2 ;
1296     for (int i=0;i<nb_renseignement;i++)
1297     o << " " << cell->get_valeur(i,7);
1298     o << endl;
1299     }
1300    
1301     }
1302    
1303     }
1304     //---------------------------------------------------------------------------
1305    
1306    
1307     void __fastcall Tvisucttform::Composer1Click(TObject *Sender)
1308     {
1309     comc->ShowModal();
1310     if (comc->etat==1)
1311     {
1312     FILE *in;
1313     in=fopen(comc->Label2->Caption.c_str(),"rt");
1314     char mess[400];
1315     fgets(mess,400,in);
1316     int nb_renseignement2;
1317     double xmin2,ymin2,zmin2;
1318     double xmax2,ymax2,zmax2;
1319     int pasx2,pasy2,pasz2;
1320     sscanf(mess,"%d %lf %lf %lf %lf %lf %lf %d %d %d",&nb_renseignement2,&xmin2,&ymin2,&zmin2,&xmax2,&ymax2,&zmax2,&pasx2,&pasy2,&pasz2);
1321     if (nb_renseignement!=nb_renseignement2)
1322     {
1323     MessageBox(Handle,"Carte de taille imcompatible","Erreur",0);
1324     fclose(in);
1325     return;
1326     }
1327     for (int i=0;i<nb_renseignement;i++)
1328     fgets(mess,400,in);
1329     vector<celluleaff*> lst_cellule2;
1330     while (feof(in)==0)
1331     {
1332     char mess[400];
1333     celluleaff* cell=new celluleaff(nb_renseignement2);
1334     fgets(mess,400,in);
1335     sscanf(mess,"%lf %lf %lf",&(cell->coordpt1[0]),&(cell->coordpt1[1]),&(cell->coordpt1[2]));
1336     char *p=strchr(mess,' ')+1;
1337     p=strchr(p,' ')+1;
1338     for (int l=0;l<nb_renseignement2;l++)
1339     {
1340     double val;
1341     p=strchr(p,' ')+1;
1342     sscanf(p,"%lf",&val);
1343     cell->change_valeur(l,0,val);
1344     }
1345     fgets(mess,400,in);
1346     sscanf(mess,"%lf %lf %lf",&(cell->coordpt2[0]),&(cell->coordpt2[1]),&(cell->coordpt2[2]));
1347     p=strchr(mess,' ')+1;
1348     p=strchr(p,' ')+1;
1349     for (int l=0;l<nb_renseignement2;l++)
1350     {
1351     double val;
1352     p=strchr(p,' ')+1;
1353     sscanf(p,"%lf",&val);
1354     cell->change_valeur(l,1,val);
1355     }
1356     fgets(mess,400,in);
1357     sscanf(mess,"%lf %lf %lf",&(cell->coordpt3[0]),&(cell->coordpt3[1]),&(cell->coordpt3[2]));
1358     p=strchr(mess,' ')+1;
1359     p=strchr(p,' ')+1;
1360     for (int l=0;l<nb_renseignement2;l++)
1361     {
1362     double val;
1363     p=strchr(p,' ')+1;
1364     sscanf(p,"%lf",&val);
1365     cell->change_valeur(l,2,val);
1366     }
1367     fgets(mess,400,in);
1368     sscanf(mess,"%lf %lf %lf",&(cell->coordpt4[0]),&(cell->coordpt4[1]),&(cell->coordpt4[2]));
1369     p=strchr(mess,' ')+1;
1370     p=strchr(p,' ')+1;
1371     for (int l=0;l<nb_renseignement2;l++)
1372     {
1373     double val;
1374     p=strchr(p,' ')+1;
1375     sscanf(p,"%lf",&val);
1376     cell->change_valeur(l,3,val);
1377     }
1378     fgets(mess,400,in);
1379     sscanf(mess,"%lf %lf %lf",&(cell->coordpt5[0]),&(cell->coordpt5[1]),&(cell->coordpt5[2]));
1380     p=strchr(mess,' ')+1;
1381     p=strchr(p,' ')+1;
1382     for (int l=0;l<nb_renseignement2;l++)
1383     {
1384     double val;
1385     p=strchr(p,' ')+1;
1386     sscanf(p,"%lf",&val);
1387     cell->change_valeur(l,4,val);
1388     }
1389     fgets(mess,400,in);
1390     sscanf(mess,"%lf %lf %lf",&(cell->coordpt6[0]),&(cell->coordpt6[1]),&(cell->coordpt6[2]));
1391     p=strchr(mess,' ')+1;
1392     p=strchr(p,' ')+1;
1393     for (int l=0;l<nb_renseignement2;l++)
1394     {
1395     double val;
1396     p=strchr(p,' ')+1;
1397     sscanf(p,"%lf",&val);
1398     cell->change_valeur(l,5,val);
1399     }
1400     fgets(mess,400,in);
1401     sscanf(mess,"%lf %lf %lf",&(cell->coordpt7[0]),&(cell->coordpt7[1]),&(cell->coordpt7[2]));
1402     p=strchr(mess,' ')+1;
1403     p=strchr(p,' ')+1;
1404     for (int l=0;l<nb_renseignement2;l++)
1405     {
1406     double val;
1407     p=strchr(p,' ')+1;
1408     sscanf(p,"%lf",&val);
1409     cell->change_valeur(l,6,val);
1410     }
1411     fgets(mess,400,in);
1412     sscanf(mess,"%lf %lf %lf",&(cell->coordpt8[0]),&(cell->coordpt8[1]),&(cell->coordpt8[2]));
1413     p=strchr(mess,' ')+1;
1414     p=strchr(p,' ')+1;
1415     for (int l=0;l<nb_renseignement2;l++)
1416     {
1417     double val;
1418     p=strchr(p,' ')+1;
1419     sscanf(p,"%lf",&val);
1420     cell->change_valeur(l,7,val);
1421     }
1422     lst_cellule2.insert(lst_cellule2.end(),cell);
1423     }
1424     fclose(in);
1425    
1426     TPL_GRILLE<celluleaff*> grille;
1427     grille.initialiser(xmin-1.,ymin-1.,zmin-1.,xmax+1.,ymax+1.,zmax+1.,pasx,pasy,pasz);
1428     int nb2=lst_cellule2.size();
1429     for (int i=0;i<nb2;i++)
1430     grille.inserer(lst_cellule2[i]);
1431     int nb=lst_cellule.size();
1432     for (int k=0;k<nb_renseignement;k++)
1433     {
1434     valmin[k]=1e308;
1435     valmax[k]=-1e308;
1436     }
1437     for (int i=0;i<nb;i++)
1438     {
1439     celluleaff *cell=lst_cellule[i];
1440     for (int k=0;k<nb_renseignement;k++)
1441     {
1442     for (int l=0;l<8;l++)
1443     {
1444     double val=cell->get_valeur(k,l);
1445     double *xyz;
1446     if (l==0) xyz=cell->coordpt1;
1447     if (l==1) xyz=cell->coordpt2;
1448     if (l==2) xyz=cell->coordpt3;
1449     if (l==3) xyz=cell->coordpt4;
1450     if (l==4) xyz=cell->coordpt5;
1451     if (l==5) xyz=cell->coordpt6;
1452     if (l==6) xyz=cell->coordpt7;
1453     if (l==7) xyz=cell->coordpt8;
1454     TPL_MAP_ENTITE<celluleaff*> list_trouve;
1455     grille.rechercher(xyz[0],xyz[1],xyz[2],0.,list_trouve);
1456     int nbtrouve=list_trouve.get_nb();
1457     for (int itrou=0;itrou<nbtrouve;itrou++)
1458     {
1459     celluleaff* cell2=list_trouve.get(itrou);
1460     BOITE_3D boite1=cell2->get_boite_3D();
1461     double xsi=-1+2*(xyz[0]-boite1.get_xmin())/(boite1.get_xmax()-boite1.get_xmin());
1462     double eta=-1+2*(xyz[1]-boite1.get_ymin())/(boite1.get_ymax()-boite1.get_ymin());
1463     double psi=-1+2*(xyz[2]-boite1.get_zmin())/(boite1.get_zmax()-boite1.get_zmin());
1464     if ((xsi<1.0000000001) && (xsi>-1.0000000001) )
1465     if ((eta<1.0000000001) && (eta>-1.0000000001) )
1466     if ((psi<1.0000000001) && (psi>-1.0000000001) )
1467     {
1468     double a1=1+xsi;
1469     double b1=1+eta;
1470     double c1=1+psi;
1471     double a2=1-xsi;
1472     double b2=1-eta;
1473     double c2=1-psi;
1474     double N1=a2*b2*c2;
1475     double N3=a1*b1*c2;
1476     double N2=a1*b2*c2;
1477     double N4=a2*b1*c2;
1478     double N5=a2*b2*c1;
1479     double N6=a1*b2*c1;
1480     double N7=a1*b1*c1;
1481     double N8=a2*b1*c1;
1482     double valeur1=cell2->get_valeur(k,0);
1483     double valeur2=cell2->get_valeur(k,1);
1484     double valeur3=cell2->get_valeur(k,2);
1485     double valeur4=cell2->get_valeur(k,3);
1486     double valeur5=cell2->get_valeur(k,4);
1487     double valeur6=cell2->get_valeur(k,5);
1488     double valeur7=cell2->get_valeur(k,6);
1489     double valeur8=cell2->get_valeur(k,7);
1490     double res=N1*valeur1+N2*valeur2+N3*valeur3+N4*valeur4+N5*valeur5+N6*valeur6+N7*valeur7+N8*valeur8;
1491     res=res/8.;
1492     if (comc->ComboBox1->Text=="+") val=val+res;
1493     if (comc->ComboBox1->Text=="-") val=val-res;
1494     if (comc->ComboBox1->Text=="*") val=val*res;
1495     if (comc->ComboBox1->Text=="-%")
1496     if (fabs(val)<1e-10) val=0.; else val=(val-res)/val;
1497     cell->change_valeur(k,l,val);
1498     if (val>valmax[k]) valmax[k]=val;
1499     if (val<valmin[k]) valmin[k]=val;
1500     itrou=nbtrouve+1;
1501     }
1502     }
1503     }
1504     }
1505     }
1506    
1507    
1508     for (int i=0;i<nb2;i++)
1509     delete lst_cellule2[i];
1510     }
1511     }
1512     //---------------------------------------------------------------------------
1513    
1514     void __fastcall Tvisucttform::UpDown1Click(TObject *Sender,
1515     TUDBtnType Button)
1516     {
1517     int numvaleur=ListBox1->ItemIndex;
1518     double ecart=valmax[numvaleur]-valmin[numvaleur];
1519     if (Button==0) valmax[numvaleur]=ecart/2.*1.1+0.5*(valmin[numvaleur]+valmax[numvaleur]);
1520     if (Button==1) valmax[numvaleur]=ecart/2./1.1+0.5*(valmin[numvaleur]+valmax[numvaleur]);
1521     ecart=valmax[numvaleur]-valmin[numvaleur];
1522     if (ecart<1e-10) valmax[numvaleur]=valmin[numvaleur]+1e-10;
1523     redess();
1524    
1525     }
1526     //---------------------------------------------------------------------------
1527    
1528     void __fastcall Tvisucttform::UpDown2Click(TObject *Sender,
1529     TUDBtnType Button)
1530     {
1531     int numvaleur=ListBox1->ItemIndex;
1532     double ecart=valmax[numvaleur]-valmin[numvaleur];
1533     if (Button==0) valmin[numvaleur]=0.5*(valmin[numvaleur]+valmax[numvaleur])-ecart/2./1.1;
1534     if (Button==1) valmin[numvaleur]=0.5*(valmin[numvaleur]+valmax[numvaleur])-ecart/2.*1.1;
1535     ecart=valmax[numvaleur]-valmin[numvaleur];
1536     if (ecart<1e-10) valmin[numvaleur]=valmax[numvaleur]-1e-10;
1537     redess();
1538     }
1539     //---------------------------------------------------------------------------
1540    
1541     void __fastcall Tvisucttform::CheckBox1Click(TObject *Sender)
1542     {
1543     static double valmaxenreg[100];
1544     static double valminenreg[100];
1545     if (CheckBox1->Checked)
1546     {
1547     UpDown1->Visible=false;
1548     UpDown2->Visible=false;
1549     for (int i=0;i<nb_renseignement;i++)
1550     {
1551     valmax[i]=valmaxenreg[i];
1552     valmin[i]=valminenreg[i];
1553     }
1554     }
1555     else
1556     {
1557     UpDown1->Visible=true;
1558     UpDown2->Visible=true;
1559     for (int i=0;i<nb_renseignement;i++)
1560     {
1561     valmaxenreg[i]=valmax[i];
1562     valminenreg[i]=valmin[i];
1563     }
1564     }
1565     redess();
1566     }
1567     //---------------------------------------------------------------------------
1568    
1569     void __fastcall Tvisucttform::CheckBox2Click(TObject *Sender)
1570     {
1571     if (Panel2->Visible==true) Panel2->Visible=false; else Panel2->Visible=true;
1572     }
1573     //---------------------------------------------------------------------------
1574    
1575     void __fastcall Tvisucttform::Button1Click(TObject *Sender)
1576     {
1577     double x=atof(Edit1->Text.c_str());
1578     double y=atof(Edit2->Text.c_str());
1579     double z=atof(Edit3->Text.c_str());
1580     Edit4->Text="";
1581     double res=evaluer(x,y,z);
1582     Edit4->Text=res;
1583     }
1584     //---------------------------------------------------------------------------
1585     double __fastcall Tvisucttform::evaluer(double x,double y,double z)
1586     {
1587     TPL_MAP_ENTITE<celluleaff*> liste;
1588     grille->rechercher(x,y,z,1e-10,liste);
1589     int nb=liste.get_nb();
1590     for (int i=0;i<nb;i++)
1591     {
1592     celluleaff* cell=liste.get(i);
1593     BOITE_3D boite=cell->get_boite_3D();
1594     if (boite.contient(x,y,z))
1595     {
1596     double xsi=-1+2*(x-boite.get_xmin())/(boite.get_xmax()-boite.get_xmin());
1597     double eta=-1+2*(y-boite.get_ymin())/(boite.get_ymax()-boite.get_ymin());
1598     double psi=-1+2*(z-boite.get_zmin())/(boite.get_zmax()-boite.get_zmin());
1599     double a1=1+xsi;
1600     double b1=1+eta;
1601     double c1=1+psi;
1602     double a2=1-xsi;
1603     double b2=1-eta;
1604     double c2=1-psi;
1605     double N1=a2*b2*c2;
1606     double N3=a1*b1*c2;
1607     double N2=a1*b2*c2;
1608     double N4=a2*b1*c2;
1609     double N5=a2*b2*c1;
1610     double N6=a1*b2*c1;
1611     double N7=a1*b1*c1;
1612     double N8=a2*b1*c1;
1613     int k=ListBox1->ItemIndex;
1614     double valeur1=cell->get_valeur(k,0);
1615     double valeur2=cell->get_valeur(k,1);
1616     double valeur3=cell->get_valeur(k,2);
1617     double valeur4=cell->get_valeur(k,3);
1618     double valeur5=cell->get_valeur(k,4);
1619     double valeur6=cell->get_valeur(k,5);
1620     double valeur7=cell->get_valeur(k,6);
1621     double valeur8=cell->get_valeur(k,7);
1622     double res=N1*valeur1+N2*valeur2+N3*valeur3+N4*valeur4+N5*valeur5+N6*valeur6+N7*valeur7+N8*valeur8;
1623     res=res/8.;
1624     return(res);
1625     }
1626     }
1627     return(0);
1628     }
1629     //---------------------------------------------------------------------------
1630    
1631     void __fastcall Tvisucttform::Button2Click(TObject *Sender)
1632     {
1633     double x=atof(Edit5->Text.c_str());
1634     double y=atof(Edit6->Text.c_str());
1635     double z=atof(Edit7->Text.c_str());
1636     double dx=atof(Edit8->Text.c_str());
1637     double dy=atof(Edit9->Text.c_str());
1638     double dz=atof(Edit10->Text.c_str());
1639     double tmin=atof(Edit11->Text.c_str());
1640     double tmax=atof(Edit12->Text.c_str());
1641     int nbpoint=atoi(Edit13->Text.c_str());
1642    
1643     Tgraph *form2=new Tgraph(Application);
1644     form2->Width=MainForm->ClientWidth/2.;
1645     form2->Height=MainForm->ClientHeight/2.;
1646     form2->Left=MainForm->ClientWidth/2.+1;
1647     form2->Top=0;
1648     form2->Caption=Caption;
1649     form2->Series1->Clear();
1650     form2->Chart1->Title->Text->Clear();
1651     char chaine[500];
1652     sprintf(chaine,"Courbe de valeur de la carte de taille pour le critère %s",ListBox1->Items->Strings[ListBox1->ItemIndex].c_str());
1653     form2->Chart1->Title->Text->Add(chaine);
1654     form2->Chart1->LeftAxis->Title->Caption="Valeur";
1655     form2->Chart1->BottomAxis->Title->Caption="t";
1656    
1657     for (int i=0;i<=nbpoint;i++)
1658     {
1659     double t=tmin+i*1.0/nbpoint*(tmax-tmin);
1660     double xx=x+t*dx;
1661     double yy=y+t*dy;
1662     double zz=z+t*dz;
1663     double res=evaluer(xx,yy,zz);
1664     form2->Series1->AddXY(t,res,"",clRed);
1665     }
1666     }
1667     //---------------------------------------------------------------------------
1668    
1669     void __fastcall Tvisucttform::Button3Click(TObject *Sender)
1670     {
1671     if (SaveDialog1->Execute())
1672     {
1673     double x=atof(Edit5->Text.c_str());
1674     double y=atof(Edit6->Text.c_str());
1675     double z=atof(Edit7->Text.c_str());
1676     double dx=atof(Edit8->Text.c_str());
1677     double dy=atof(Edit9->Text.c_str());
1678     double dz=atof(Edit10->Text.c_str());
1679     double tmin=atof(Edit11->Text.c_str());
1680     double tmax=atof(Edit12->Text.c_str());
1681     int nbpoint=atoi(Edit13->Text.c_str());
1682     FILE *in=fopen(SaveDialog1->FileName.c_str(),"wt");
1683     for (int i=0;i<=nbpoint;i++)
1684     {
1685     double t=tmin+i*1.0/nbpoint*(tmax-tmin);
1686     double xx=x+t*dx;
1687     double yy=y+t*dy;
1688     double zz=z+t*dz;
1689     double res=evaluer(xx,yy,zz);
1690     fprintf(in,"%lf;%lf;%lf;%lf;%lf;\n",t,xx,yy,zz,res);
1691     }
1692     fclose(in);
1693     }
1694     }
1695     //---------------------------------------------------------------------------
1696