1 |
//---------------------------------------------------------------------------
|
2 |
#include <vcl\vcl.h>
|
3 |
#include <vcl\printers.hpp>
|
4 |
#include <math.h>
|
5 |
#include <string.h>
|
6 |
#include <stdlib.h>
|
7 |
#pragma hdrstop
|
8 |
|
9 |
#include "fenetre.h"
|
10 |
#include "s_valeur.h"
|
11 |
//---------------------------------------------------------------------------
|
12 |
|
13 |
extern void trirea(float *a,int *la,int *ir);
|
14 |
|
15 |
|
16 |
void __fastcall TFenp::imprime(void)
|
17 |
{
|
18 |
int i,xc,yc;
|
19 |
float zoomx,zoomy;
|
20 |
int xcmax,ycmin,ycmax,xcmin;
|
21 |
int Height,Height2,Width;
|
22 |
char mess[500];
|
23 |
float zoomtmp,xcentretmp,ycentretmp;
|
24 |
|
25 |
Width=(int)(Printer()->PageWidth*rapport);
|
26 |
Height=(int)(Printer()->PageHeight*rapport*0.95);
|
27 |
Height2=(int)(Printer()->PageHeight*rapport);
|
28 |
/* normalisation sur la page */
|
29 |
for (i=0;i<nb_point;i++)
|
30 |
{
|
31 |
projection(point[i].x,point[i].y,point[i].z,&xc,&yc,0);
|
32 |
if (i==0)
|
33 |
{
|
34 |
xcmax=xc;
|
35 |
xcmin=xc;
|
36 |
ycmax=yc;
|
37 |
ycmin=yc;
|
38 |
}
|
39 |
if (xc>xcmax) xcmax=xc;
|
40 |
if (yc>ycmax) ycmax=yc;
|
41 |
if (xc<xcmin) xcmin=xc;
|
42 |
if (yc<ycmin) ycmin=yc;
|
43 |
}
|
44 |
xcmax++;xcmin--;
|
45 |
ycmax++;ycmin--;
|
46 |
if (xcmax!=xcmin) zoomx=Width*1./(xcmax-xcmin); else zoomx=1E30;
|
47 |
if (ycmax!=ycmin) zoomy=Height*1./(ycmax-ycmin); else zoomy=1E30;
|
48 |
if (zoomx>zoomy) zoom_p=zoomy; else zoom_p=zoomx;
|
49 |
zoom_p=zoom_p/1.15;
|
50 |
xcentre_p=(Width/2.-zoom_p*(xcmin+xcmax)/2.);
|
51 |
ycentre_p=(Height/2.-zoom_p*(ycmin+ycmax)/2.);
|
52 |
zoomtmp=zoom;
|
53 |
xcentretmp=xcentre;
|
54 |
ycentretmp=ycentre;
|
55 |
norme();
|
56 |
zoom_p=zoom_p*zoomtmp/zoom;
|
57 |
zoom=zoomtmp;
|
58 |
xcentre_p=xcentre_p+(xcentretmp-xcentre)/Fenp->Width*Width;
|
59 |
ycentre_p=ycentre_p+(ycentretmp-ycentre)/Fenp->Height*Height;
|
60 |
xcentre=xcentretmp;
|
61 |
ycentre=ycentretmp;
|
62 |
|
63 |
|
64 |
if (Geometrie1->Checked==true) strcpy(mess,"Geometrie de ");
|
65 |
if (Maillage1D1->Checked==true) strcpy(mess,"Maillage 1D de ");
|
66 |
if (Maillage2D1->Checked==true) strcpy(mess,"Maillage 2D de ");
|
67 |
if (Maillage3D1->Checked==true) strcpy(mess,"Maillage 3D de ");
|
68 |
if (Remaillage2D1->Checked==true) strcpy(mess,"Remaillage 2D de ");
|
69 |
if (Remaillage3D1->Checked==true) strcpy(mess,"Remaillage 3D de ");
|
70 |
strcat(mess,Fenp->Fichier);
|
71 |
strcpy(info,"Entrez la légende du dessin ?");
|
72 |
Valeur->Edit1->Text=mess;
|
73 |
Valeur->ShowModal();
|
74 |
strcpy(mess,Valeur->Edit1->Text.c_str());
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 |
/* debut d 'impression */
|
83 |
Printer()->Title=Fenp->Fichier;
|
84 |
Printer()->BeginDoc();
|
85 |
Printer()->Canvas->Pen->Color=clBlack;
|
86 |
Printer()->Canvas->MoveTo(1,1);
|
87 |
Printer()->Canvas->LineTo(1,Height2-2);
|
88 |
Printer()->Canvas->LineTo(Width-2,Height2-2);
|
89 |
Printer()->Canvas->LineTo(Width-2,1);
|
90 |
Printer()->Canvas->LineTo(1,1);
|
91 |
Printer()->Canvas->MoveTo(1,(int)(Height));
|
92 |
Printer()->Canvas->LineTo(Width-2,(int)(Height));
|
93 |
|
94 |
if (Geometrie1->Checked==true) print_geo();
|
95 |
if (Maillage1D1->Checked==true) print_1D();
|
96 |
if (Maillage2D1->Checked==true) print_2D();
|
97 |
if (Maillage3D1->Checked==true) print_3D();
|
98 |
if (Remaillage2D1->Checked==true) print_2D();
|
99 |
if (Remaillage3D1->Checked==true) print_3D();
|
100 |
if (Front3D1->Checked==true) print_2D();
|
101 |
print_axe();
|
102 |
Printer()->Canvas->Font->Color=clBlack;
|
103 |
Printer()->Canvas->Font->Size=(int)(16*rapport);
|
104 |
Printer()->Canvas->Brush->Color=clWhite;
|
105 |
Printer()->Canvas->Pen->Color=clBlack;
|
106 |
Printer()->Canvas->Rectangle(1,(int)(Height),Width-2,Height2-2);
|
107 |
Printer()->Canvas->TextOut((int)(0.05*Width),(int)(Height+0.3*(Height2-Height)),mess);
|
108 |
Printer()->EndDoc();
|
109 |
}
|
110 |
|
111 |
|
112 |
|
113 |
void __fastcall TFenp::print_geo(void)
|
114 |
{
|
115 |
int i,n1,n2;
|
116 |
float x1,x2,y1,y2,z1,z2;
|
117 |
int xc1,xc2,yc1,yc2;
|
118 |
|
119 |
Printer()->Canvas->Pen->Color=clBlack;
|
120 |
for (i=0;i<nb_segment;i++)
|
121 |
{
|
122 |
n1=segment[i].n1;
|
123 |
n2=segment[i].n2;
|
124 |
x1=point[n1].x;
|
125 |
y1=point[n1].y;
|
126 |
z1=point[n1].z;
|
127 |
x2=point[n2].x;
|
128 |
y2=point[n2].y;
|
129 |
z2=point[n2].z;
|
130 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
131 |
projection(x2,y2,z2,&xc2,&yc2,2);
|
132 |
Printer()->Canvas->MoveTo(xc1,yc1);
|
133 |
Printer()->Canvas->LineTo(xc2,yc2);
|
134 |
}
|
135 |
}
|
136 |
|
137 |
|
138 |
void __fastcall TFenp::print_1D(void)
|
139 |
{
|
140 |
int i,n1,n2;
|
141 |
float x1,x2,y1,y2,z1,z2;
|
142 |
int xc1,xc2,yc1,yc2;
|
143 |
char mess[20];
|
144 |
|
145 |
Printer()->Canvas->Pen->Color=clRed;
|
146 |
Printer()->Canvas->Font->Color=clFuchsia;
|
147 |
for (i=0;i<nb_point;i++)
|
148 |
{
|
149 |
x1=point[i].x;
|
150 |
y1=point[i].y;
|
151 |
z1=point[i].z;
|
152 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
153 |
Printer()->Canvas->MoveTo(xc1-2,yc1);
|
154 |
Printer()->Canvas->LineTo(xc1+2,yc1);
|
155 |
Printer()->Canvas->MoveTo(xc1,yc1-2);
|
156 |
Printer()->Canvas->LineTo(xc1,yc1+2);
|
157 |
if (Noeud1->Checked==true)
|
158 |
{
|
159 |
sprintf(mess,"%d",i);
|
160 |
Printer()->Canvas->TextOut(xc1+2,yc1+2,mess);
|
161 |
}
|
162 |
}
|
163 |
Printer()->Canvas->Font->Color=clYellow;
|
164 |
for (i=0;i<nb_segment;i++)
|
165 |
{
|
166 |
if ((segment[i].select==0)&& (Fenp->Debug1->Checked)) continue;
|
167 |
n1=segment[i].n1;
|
168 |
n2=segment[i].n2;
|
169 |
x1=point[n1].x;
|
170 |
y1=point[n1].y;
|
171 |
z1=point[n1].z;
|
172 |
x2=point[n2].x;
|
173 |
y2=point[n2].y;
|
174 |
z2=point[n2].z;
|
175 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
176 |
projection(x2,y2,z2,&xc2,&yc2,2);
|
177 |
Printer()->Canvas->MoveTo(xc1,yc1);
|
178 |
Printer()->Canvas->LineTo(xc2,yc2);
|
179 |
if (Maille2->Checked==true)
|
180 |
{
|
181 |
sprintf(mess,"%d",i);
|
182 |
Printer()->Canvas->TextOut((int)((xc1+xc2)*0.5),(int)((yc1+yc2)*0.5),mess);
|
183 |
}
|
184 |
}
|
185 |
if (numero_noeud>=0)
|
186 |
{
|
187 |
Printer()->Canvas->Font->Color=clBlack;
|
188 |
x1=point[numero_noeud].x;
|
189 |
y1=point[numero_noeud].y;
|
190 |
z1=point[numero_noeud].z;
|
191 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
192 |
sprintf(mess,"%d",numero_noeud);
|
193 |
Printer()->Canvas->TextOut(xc1+2,yc1+2,mess);
|
194 |
}
|
195 |
if (numero_maille>=0)
|
196 |
{
|
197 |
Printer()->Canvas->Font->Color=clBlack;
|
198 |
n1=segment[numero_maille].n1;
|
199 |
n2=segment[numero_maille].n2;
|
200 |
x1=point[n1].x;
|
201 |
y1=point[n1].y;
|
202 |
z1=point[n1].z;
|
203 |
x2=point[n2].x;
|
204 |
y2=point[n2].y;
|
205 |
z2=point[n2].z;
|
206 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
207 |
projection(x2,y2,z2,&xc2,&yc2,2);
|
208 |
sprintf(mess,"%d",numero_maille);
|
209 |
Printer()->Canvas->TextOut((int)((xc1+xc2)*0.5),(int)((yc1+yc2)*0.5),mess);
|
210 |
}
|
211 |
}
|
212 |
//---------------------------------------------------------------------------
|
213 |
void __fastcall TFenp::print_2D(void)
|
214 |
{
|
215 |
int i,n1,n2,n3;
|
216 |
float x1,x2,y1,y2,z1,z2,x3,y3,z3;
|
217 |
float ab[3],ac[3],g[3],crit;
|
218 |
int xc1,xc2,yc1,yc2,xc3,yc3;
|
219 |
TRect r;
|
220 |
char mess[20];
|
221 |
|
222 |
if (fc==1)
|
223 |
{
|
224 |
print_reel();
|
225 |
return;
|
226 |
}
|
227 |
Printer()->Canvas->Pen->Color=clRed;
|
228 |
if (Eclatee1->Checked==true) Printer()->Canvas->Pen->Color=clOlive;
|
229 |
for (i=0;i<nb_triangle;i++)
|
230 |
{
|
231 |
if ((triangle[i].num_ent==numface) || (numface==(-1)))
|
232 |
{
|
233 |
if ((triangle[i].select==0) && (Fenp->Debug1->Checked)) continue;
|
234 |
n1=triangle[i].n1;
|
235 |
n2=triangle[i].n2;
|
236 |
n3=triangle[i].n3;
|
237 |
x1=point[n1].x;
|
238 |
y1=point[n1].y;
|
239 |
z1=point[n1].z;
|
240 |
x2=point[n2].x;
|
241 |
y2=point[n2].y;
|
242 |
z2=point[n2].z;
|
243 |
x3=point[n3].x;
|
244 |
y3=point[n3].y;
|
245 |
z3=point[n3].z;
|
246 |
if (Normal1->Checked==false)
|
247 |
{
|
248 |
if (Qualite1->Checked==true)
|
249 |
{
|
250 |
crit=crit_cal2d(n1,n2,n3);
|
251 |
if (crit>0.5) Printer()->Canvas->Pen->Color=clLime;
|
252 |
else if (crit>0.2) Printer()->Canvas->Pen->Color=clBlue;
|
253 |
else if (crit>0.1) Printer()->Canvas->Pen->Color=clRed;
|
254 |
else Printer()->Canvas->Pen->Color=clMaroon;
|
255 |
}
|
256 |
ab[0]=x2-x1;ab[1]=y2-y1;ab[2]=z2-z1;
|
257 |
ac[0]=x3-x1;ac[1]=y3-y1;ac[2]=z3-z1;
|
258 |
g[0]=x1+0.33333*(ab[0]+ac[0]);
|
259 |
g[1]=y1+0.33333*(ab[1]+ac[1]);
|
260 |
g[2]=z1+0.33333*(ab[2]+ac[2]);
|
261 |
x1=g[0]+0.8*(x1-g[0]);y1=g[1]+0.8*(y1-g[1]);z1=g[2]+0.8*(z1-g[2]);
|
262 |
x2=g[0]+0.8*(x2-g[0]);y2=g[1]+0.8*(y2-g[1]);z2=g[2]+0.8*(z2-g[2]);
|
263 |
x3=g[0]+0.8*(x3-g[0]);y3=g[1]+0.8*(y3-g[1]);z3=g[2]+0.8*(z3-g[2]);
|
264 |
}
|
265 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
266 |
projection(x2,y2,z2,&xc2,&yc2,2);
|
267 |
projection(x3,y3,z3,&xc3,&yc3,2);
|
268 |
Printer()->Canvas->MoveTo(xc1,yc1);
|
269 |
Printer()->Canvas->LineTo(xc2,yc2);
|
270 |
Printer()->Canvas->LineTo(xc3,yc3);
|
271 |
Printer()->Canvas->LineTo(xc1,yc1);
|
272 |
Printer()->Canvas->Font->Color=clFuchsia;
|
273 |
if (Noeud1->Checked==true)
|
274 |
{
|
275 |
sprintf(mess,"%d",n1);
|
276 |
projection(point[n1].x,point[n1].y,point[n1].z,&xc1,&yc1,2);
|
277 |
Printer()->Canvas->TextOut(xc1+2,yc1+2,mess);
|
278 |
sprintf(mess,"%d",n2);
|
279 |
projection(point[n2].x,point[n2].y,point[n2].z,&xc2,&yc2,2);
|
280 |
Printer()->Canvas->TextOut(xc2+2,yc2+2,mess);
|
281 |
sprintf(mess,"%d",n3);
|
282 |
projection(point[n3].x,point[n3].y,point[n3].z,&xc3,&yc3,2);
|
283 |
Printer()->Canvas->TextOut(xc3+2,yc3+2,mess);
|
284 |
}
|
285 |
Printer()->Canvas->Font->Color=clYellow;
|
286 |
if (Maille2->Checked==true)
|
287 |
{
|
288 |
sprintf(mess,"%d",i);
|
289 |
Printer()->Canvas->TextOut((int)((xc1+xc2+xc3)*0.333333),(int)((yc1+yc2+yc3)*0.33333333),mess);
|
290 |
}
|
291 |
}
|
292 |
}
|
293 |
if (numero_noeud>=0)
|
294 |
{
|
295 |
Printer()->Canvas->Font->Color=clBlack;
|
296 |
x1=point[numero_noeud].x;
|
297 |
y1=point[numero_noeud].y;
|
298 |
z1=point[numero_noeud].z;
|
299 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
300 |
sprintf(mess,"%d",numero_noeud);
|
301 |
Printer()->Canvas->TextOut(xc1+2,yc1+2,mess);
|
302 |
}
|
303 |
if (numero_maille>=0)
|
304 |
{
|
305 |
Printer()->Canvas->Font->Color=clBlack;
|
306 |
n1=triangle[numero_maille].n1;
|
307 |
n2=triangle[numero_maille].n2;
|
308 |
n3=triangle[numero_maille].n3;
|
309 |
x1=point[n1].x;
|
310 |
y1=point[n1].y;
|
311 |
z1=point[n1].z;
|
312 |
x2=point[n2].x;
|
313 |
y2=point[n2].y;
|
314 |
z2=point[n2].z;
|
315 |
x3=point[n3].x;
|
316 |
y3=point[n3].y;
|
317 |
z3=point[n3].z;
|
318 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
319 |
projection(x2,y2,z2,&xc2,&yc2,2);
|
320 |
projection(x3,y3,z3,&xc3,&yc3,2);
|
321 |
sprintf(mess,"%d",numero_maille);
|
322 |
Printer()->Canvas->TextOut((int)((xc1+xc2+xc3)*0.333333),(int)((yc1+yc2+yc3)*0.33333333),mess);
|
323 |
}
|
324 |
|
325 |
}
|
326 |
//---------------------------------------------------------------------------
|
327 |
void __fastcall TFenp::print_3D(void)
|
328 |
{
|
329 |
int i,n1,n2,n3,n4;
|
330 |
float x1,x2,y1,y2,z1,z2,x3,y3,z3,x4,y4,z4;
|
331 |
float ab[3],ac[3],ad[3],g[3],crit;
|
332 |
int xc1,xc2,yc1,yc2,xc3,yc3,xc4,yc4;
|
333 |
char mess[20];
|
334 |
TRect r;
|
335 |
|
336 |
if ((Activerlerendu3D1->Checked==true)&&(fc==1))
|
337 |
{
|
338 |
print_reel();
|
339 |
return;
|
340 |
}
|
341 |
Printer()->Canvas->Pen->Color=clRed;
|
342 |
if (Eclatee1->Checked==true) Printer()->Canvas->Pen->Color=clOlive;
|
343 |
for (i=0;i<nb_tetra;i++)
|
344 |
{
|
345 |
if ((tetra[i].select==0)&& (Fenp->Debug1->Checked)) continue;
|
346 |
n1=tetra[i].n1;
|
347 |
n2=tetra[i].n2;
|
348 |
n3=tetra[i].n3;
|
349 |
n4=tetra[i].n4;
|
350 |
x1=point[n1].x;
|
351 |
y1=point[n1].y;
|
352 |
z1=point[n1].z;
|
353 |
x2=point[n2].x;
|
354 |
y2=point[n2].y;
|
355 |
z2=point[n2].z;
|
356 |
x3=point[n3].x;
|
357 |
y3=point[n3].y;
|
358 |
z3=point[n3].z;
|
359 |
x4=point[n4].x;
|
360 |
y4=point[n4].y;
|
361 |
z4=point[n4].z;
|
362 |
if (Normal1->Checked==false)
|
363 |
{
|
364 |
if (Qualite1->Checked==true)
|
365 |
{
|
366 |
crit=crit_cal3d(n1,n2,n3,n4);
|
367 |
if (crit>0.5) Printer()->Canvas->Pen->Color=clLime;
|
368 |
else if (crit>0.2) Printer()->Canvas->Pen->Color=clBlue;
|
369 |
else if (crit>0.1) Printer()->Canvas->Pen->Color=clRed;
|
370 |
else Printer()->Canvas->Pen->Color=clMaroon;
|
371 |
}
|
372 |
ab[0]=x2-x1;ab[1]=y2-y1;ab[2]=z2-z1;
|
373 |
ac[0]=x3-x1;ac[1]=y3-y1;ac[2]=z3-z1;
|
374 |
ad[0]=x4-x1;ad[1]=y4-y1;ad[2]=z4-z1;
|
375 |
g[0]=x1+0.25*(ab[0]+ac[0]+ad[0]);
|
376 |
g[1]=y1+0.25*(ab[1]+ac[1]+ad[1]);
|
377 |
g[2]=z1+0.25*(ab[2]+ac[2]+ad[2]);
|
378 |
x1=g[0]+0.8*(x1-g[0]);y1=g[1]+0.8*(y1-g[1]);z1=g[2]+0.8*(z1-g[2]);
|
379 |
x2=g[0]+0.8*(x2-g[0]);y2=g[1]+0.8*(y2-g[1]);z2=g[2]+0.8*(z2-g[2]);
|
380 |
x3=g[0]+0.8*(x3-g[0]);y3=g[1]+0.8*(y3-g[1]);z3=g[2]+0.8*(z3-g[2]);
|
381 |
x4=g[0]+0.8*(x4-g[0]);y4=g[1]+0.8*(y4-g[1]);z4=g[2]+0.8*(z4-g[2]);
|
382 |
}
|
383 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
384 |
projection(x2,y2,z2,&xc2,&yc2,2);
|
385 |
projection(x3,y3,z3,&xc3,&yc3,2);
|
386 |
projection(x4,y4,z4,&xc4,&yc4,2);
|
387 |
Printer()->Canvas->MoveTo(xc1,yc1);
|
388 |
Printer()->Canvas->LineTo(xc2,yc2);
|
389 |
Printer()->Canvas->LineTo(xc3,yc3);
|
390 |
Printer()->Canvas->LineTo(xc1,yc1);
|
391 |
Printer()->Canvas->MoveTo(xc4,yc4);
|
392 |
Printer()->Canvas->LineTo(xc1,yc1);
|
393 |
Printer()->Canvas->MoveTo(xc4,yc4);
|
394 |
Printer()->Canvas->LineTo(xc2,yc2);
|
395 |
Printer()->Canvas->MoveTo(xc4,yc4);
|
396 |
Printer()->Canvas->LineTo(xc3,yc3);
|
397 |
Printer()->Canvas->Font->Color=clFuchsia;
|
398 |
if (Noeud1->Checked==true)
|
399 |
{
|
400 |
sprintf(mess,"%d",n1);
|
401 |
Printer()->Canvas->TextOut(xc1+2,yc1+2,mess);
|
402 |
sprintf(mess,"%d",n2);
|
403 |
Printer()->Canvas->TextOut(xc2+2,yc2+2,mess);
|
404 |
sprintf(mess,"%d",n3);
|
405 |
Printer()->Canvas->TextOut(xc3+2,yc3+2,mess);
|
406 |
sprintf(mess,"%d",n4);
|
407 |
Printer()->Canvas->TextOut(xc4+2,yc4+2,mess);
|
408 |
}
|
409 |
Printer()->Canvas->Font->Color=clYellow;
|
410 |
if (Maille2->Checked==true)
|
411 |
{
|
412 |
sprintf(mess,"%d",i);
|
413 |
Printer()->Canvas->TextOut((int)((xc1+xc2+xc3+xc4)*0.25),(int)((yc1+yc2+yc3+yc4)*0.25),mess);
|
414 |
}
|
415 |
}
|
416 |
if (numero_noeud>=0)
|
417 |
{
|
418 |
Printer()->Canvas->Font->Color=clBlack;
|
419 |
x1=point[numero_noeud].x;
|
420 |
y1=point[numero_noeud].y;
|
421 |
z1=point[numero_noeud].z;
|
422 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
423 |
sprintf(mess,"%d",numero_noeud);
|
424 |
Printer()->Canvas->TextOut(xc1+2,yc1+2,mess);
|
425 |
}
|
426 |
if (numero_maille>=0)
|
427 |
{
|
428 |
Printer()->Canvas->Font->Color=clBlack;
|
429 |
n1=tetra[numero_maille].n1;
|
430 |
n2=tetra[numero_maille].n2;
|
431 |
n3=tetra[numero_maille].n3;
|
432 |
n4=tetra[numero_maille].n4;
|
433 |
x1=point[n1].x;
|
434 |
y1=point[n1].y;
|
435 |
z1=point[n1].z;
|
436 |
x2=point[n2].x;
|
437 |
y2=point[n2].y;
|
438 |
z2=point[n2].z;
|
439 |
x3=point[n3].x;
|
440 |
y3=point[n3].y;
|
441 |
z3=point[n3].z;
|
442 |
x4=point[n4].x;
|
443 |
y4=point[n4].y;
|
444 |
z4=point[n4].z;
|
445 |
projection(x1,y1,z1,&xc1,&yc1,2);
|
446 |
projection(x2,y2,z2,&xc2,&yc2,2);
|
447 |
projection(x3,y3,z3,&xc3,&yc3,2);
|
448 |
projection(x4,y4,z4,&xc4,&yc4,2);
|
449 |
sprintf(mess,"%d",numero_maille);
|
450 |
Printer()->Canvas->TextOut((int)((xc1+xc2+xc3+xc4)*0.25),(int)((yc1+yc2+yc3+yc4)*0.25),mess);
|
451 |
}
|
452 |
|
453 |
|
454 |
}
|
455 |
//---------------------------------------------------------------------------
|
456 |
void __fastcall TFenp::print_reel(void)
|
457 |
{
|
458 |
int *iordre;
|
459 |
float *distance;
|
460 |
int xpoint[8];
|
461 |
TPoint ypoint[8];
|
462 |
float xe,ye,ze,xee,yee,zee;
|
463 |
float xa,ya,za;
|
464 |
float xb,yb,zb;
|
465 |
float xc,yc,zc;
|
466 |
float xg,yg,zg;
|
467 |
float nx,ny,nz;
|
468 |
char mess[20];
|
469 |
struct s_triangle *tete=NULL,*tri;
|
470 |
int i;
|
471 |
int color;
|
472 |
float dismin,dismax,diff,g[4];
|
473 |
static float arot[3][3]={{-1.,-1.,-1.},{-1.,-1.,-1.},{-1.,-1.,-1.}};
|
474 |
int pareil;
|
475 |
|
476 |
|
477 |
|
478 |
|
479 |
pareil=0;
|
480 |
if (tete!=NULL)
|
481 |
if (arot[0][0]==rot[0][0])
|
482 |
if (arot[1][0]==rot[1][0])
|
483 |
if (arot[2][0]==rot[2][0])
|
484 |
if (arot[0][1]==rot[0][1])
|
485 |
if (arot[1][1]==rot[1][1])
|
486 |
if (arot[2][1]==rot[2][1])
|
487 |
if (arot[0][2]==rot[0][2])
|
488 |
if (arot[1][2]==rot[1][2])
|
489 |
if (arot[2][2]==rot[2][2]) pareil=1;
|
490 |
|
491 |
|
492 |
|
493 |
if (pareil==0)
|
494 |
{
|
495 |
tete=NULL;
|
496 |
arot[0][0]=rot[0][0];
|
497 |
arot[1][0]=rot[1][0];
|
498 |
arot[2][0]=rot[2][0];
|
499 |
arot[0][1]=rot[0][1];
|
500 |
arot[1][1]=rot[1][1];
|
501 |
arot[2][1]=rot[2][1];
|
502 |
arot[0][2]=rot[0][2];
|
503 |
arot[1][2]=rot[1][2];
|
504 |
arot[2][2]=rot[2][2];
|
505 |
/* oeuil */
|
506 |
xe=1000.*maxcoord-0.5*(xmin+xmax);
|
507 |
ye=1000.*maxcoord-0.5*(ymin+ymax);
|
508 |
ze=1000.*maxcoord-0.5*(zmin+zmax);
|
509 |
/* oeuil dans le repere local */
|
510 |
xee=rot[0][0]*xe+rot[1][0]*ye+rot[2][0]*ze;
|
511 |
yee=rot[0][1]*xe+rot[1][1]*ye+rot[2][1]*ze;
|
512 |
zee=rot[0][2]*xe+rot[1][2]*ye+rot[2][2]*ze;
|
513 |
iordre=(int *)calloc(nb_triangle+1,sizeof(int));
|
514 |
distance=(float *)calloc(nb_triangle+1,sizeof(float));
|
515 |
for (i=0;i<nb_triangle;i++)
|
516 |
{
|
517 |
triangle[i].dis=0.;
|
518 |
triangle[i].suivant=NULL;
|
519 |
xa=point[triangle[i].n1].x;
|
520 |
ya=point[triangle[i].n1].y;
|
521 |
za=point[triangle[i].n1].z;
|
522 |
xb=point[triangle[i].n2].x;
|
523 |
yb=point[triangle[i].n2].y;
|
524 |
zb=point[triangle[i].n2].z;
|
525 |
xc=point[triangle[i].n3].x;
|
526 |
yc=point[triangle[i].n3].y;
|
527 |
zc=point[triangle[i].n3].z;
|
528 |
xg=0.333333*(xa+xb+xc);
|
529 |
yg=0.333333*(ya+yb+yc);
|
530 |
zg=0.333333*(za+zb+zc);
|
531 |
triangle[i].dis=(xee-xg)*(xee-xg)+(yee-yg)*(yee-yg)+(zee-zg)*(zee-zg);
|
532 |
if (i==0)
|
533 |
{
|
534 |
dismin=triangle[i].dis;
|
535 |
dismax=triangle[i].dis;
|
536 |
}
|
537 |
else
|
538 |
{
|
539 |
if (triangle[i].dis<dismin) dismin=triangle[i].dis;
|
540 |
if (triangle[i].dis>dismax) dismax=triangle[i].dis;
|
541 |
}
|
542 |
nx=(yb-ya)*(zc-za)-(zb-za)*(yc-ya);
|
543 |
ny=(xc-xa)*(zb-za)-(xb-xa)*(zc-za);
|
544 |
nz=(xb-xa)*(yc-ya)-(yb-ya)*(xc-xa);
|
545 |
triangle[i].angle=(float)((nx*(xee-xg)+ny*(yee-yg)+nz*(zee-zg))/sqrt((double)((nx*nx+ny*ny+nz*nz)*(triangle[i].dis))));
|
546 |
if (triangle[i].angle>=1.) triangle[i].angle=0.99999999;
|
547 |
if (triangle[i].angle<=(-1.)) triangle[i].angle=(-0.99999999);
|
548 |
distance[i]=triangle[i].dis;
|
549 |
iordre[i]=i+1;
|
550 |
|
551 |
}
|
552 |
trirea(distance,&(nb_triangle),iordre);
|
553 |
diff=dismax-dismin;
|
554 |
dismin=dismin-0.025*diff;
|
555 |
dismax=dismax+0.025*diff;
|
556 |
Printer()->Canvas->Pen->Color=Cshade[0];
|
557 |
Printer()->Canvas->Brush->Color=Cshade[1];
|
558 |
for (i=nb_triangle-1;i>(-1);i--)
|
559 |
{
|
560 |
tri=&(triangle[iordre[i]-1]);
|
561 |
if ((tri->select==0)&& (Fenp->Debug1->Checked)) continue;
|
562 |
if (((tri->num_ent==numface) || (numface==(-1))&&(tri->dis-dismin*loin-(1.-loin)*dismax>0.)))
|
563 |
{
|
564 |
xa=point[tri->n1].x;
|
565 |
ya=point[tri->n1].y;
|
566 |
za=point[tri->n1].z;
|
567 |
xb=point[tri->n2].x;
|
568 |
yb=point[tri->n2].y;
|
569 |
zb=point[tri->n2].z;
|
570 |
xc=point[tri->n3].x;
|
571 |
yc=point[tri->n3].y;
|
572 |
zc=point[tri->n3].z;
|
573 |
if (Normal1->Checked==false)
|
574 |
{
|
575 |
g[0]=0.33333*(xa+xb+xc);
|
576 |
g[1]=0.33333*(ya+yb+yc);
|
577 |
g[2]=0.33333*(za+zb+zc);
|
578 |
xa=g[0]+homo*(xa-g[0]);ya=g[1]+homo*(ya-g[1]);za=g[2]+homo*(za-g[2]);
|
579 |
xb=g[0]+homo*(xb-g[0]);yb=g[1]+homo*(yb-g[1]);zb=g[2]+homo*(zb-g[2]);
|
580 |
xc=g[0]+homo*(xc-g[0]);yc=g[1]+homo*(yc-g[1]);zc=g[2]+homo*(zc-g[2]);
|
581 |
}
|
582 |
projection(xa,ya,za,&xpoint[0],&xpoint[1],2);
|
583 |
projection(xb,yb,zb,&xpoint[2],&xpoint[3],2);
|
584 |
projection(xc,yc,zc,&xpoint[4],&xpoint[5],2);
|
585 |
ypoint[0].x=xpoint[0];
|
586 |
ypoint[0].y=xpoint[1];
|
587 |
ypoint[1].x=xpoint[2];
|
588 |
ypoint[1].y=xpoint[3];
|
589 |
ypoint[2].x=xpoint[4];
|
590 |
ypoint[2].y=xpoint[5];
|
591 |
color=(int)(-10*fabs((double)(tri->angle))+10);
|
592 |
if (color>10) color=10;
|
593 |
if (color<1) color=1;
|
594 |
Printer()->Canvas->Brush->Color=Cshade[color];
|
595 |
Printer()->Canvas->Polygon(ypoint,2);
|
596 |
Printer()->Canvas->Font->Color=clFuchsia;
|
597 |
if (Noeud1->Checked==true)
|
598 |
{
|
599 |
sprintf(mess,"%d",tri->n1);
|
600 |
Printer()->Canvas->TextOut(xpoint[0]+2,xpoint[1]+2,mess);
|
601 |
sprintf(mess,"%d",tri->n2);
|
602 |
Printer()->Canvas->TextOut(xpoint[2]+2,xpoint[3]+2,mess);
|
603 |
sprintf(mess,"%d",tri->n3);
|
604 |
Printer()->Canvas->TextOut(xpoint[4]+2,xpoint[5]+2,mess);
|
605 |
}
|
606 |
if (tri->n1==numero_noeud)
|
607 |
{
|
608 |
Printer()->Canvas->Font->Color=clBlack;
|
609 |
sprintf(mess,"%d",tri->n1);
|
610 |
Printer()->Canvas->TextOut(xpoint[0]+2,xpoint[1]+2,mess);
|
611 |
}
|
612 |
if (tri->n2==numero_noeud)
|
613 |
{
|
614 |
Printer()->Canvas->Font->Color=clBlack;
|
615 |
sprintf(mess,"%d",tri->n2);
|
616 |
Printer()->Canvas->TextOut(xpoint[2]+2,xpoint[3]+2,mess);
|
617 |
}
|
618 |
if (tri->n3==numero_noeud)
|
619 |
{
|
620 |
Printer()->Canvas->Font->Color=clBlack;
|
621 |
sprintf(mess,"%d",tri->n3);
|
622 |
Printer()->Canvas->TextOut(xpoint[4]+2,xpoint[5]+2,mess);
|
623 |
}
|
624 |
if (tri->num!=numero_maille) Printer()->Canvas->Font->Color=clYellow;
|
625 |
else
|
626 |
{
|
627 |
Printer()->Canvas->Font->Color=clBlack;
|
628 |
sprintf(mess,"%d",tri->num);
|
629 |
Printer()->Canvas->TextOut((int)((xpoint[0]+xpoint[2]+xpoint[4])*0.333333),(int)((xpoint[1]+xpoint[3]+xpoint[5])*0.33333333),mess);
|
630 |
}
|
631 |
if (Maille2->Checked==true)
|
632 |
{
|
633 |
sprintf(mess,"%d",tri->num);
|
634 |
Printer()->Canvas->TextOut((int)((xpoint[0]+xpoint[2]+xpoint[4])*0.333333),(int)((xpoint[1]+xpoint[3]+xpoint[5])*0.33333333),mess);
|
635 |
}
|
636 |
}
|
637 |
}
|
638 |
free(iordre);
|
639 |
free(distance);
|
640 |
}
|
641 |
}
|
642 |
void __fastcall TFenp::print_axe(void)
|
643 |
{
|
644 |
int xc,yc;
|
645 |
|
646 |
Printer()->Canvas->Pen->Color=clBlue;
|
647 |
projection(75.,0.,0.,&xc,&yc,0);
|
648 |
Printer()->Canvas->MoveTo(100,100);
|
649 |
Printer()->Canvas->LineTo(100+xc,100+yc);
|
650 |
Printer()->Canvas->Pen->Color=clRed;
|
651 |
projection(0.,75.,0.,&xc,&yc,0);
|
652 |
Printer()->Canvas->MoveTo(100,100);
|
653 |
Printer()->Canvas->LineTo(100+xc,100+yc);
|
654 |
Printer()->Canvas->Pen->Color=clBlack;
|
655 |
projection(0.,0.,75.,&xc,&yc,0);
|
656 |
Printer()->Canvas->MoveTo(100,100);
|
657 |
Printer()->Canvas->LineTo(100+xc,100+yc);
|
658 |
}
|
659 |
|
660 |
|
661 |
|