ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/acismesh/o2d_opt_point.cpp
Revision: 1
Committed: Mon Jun 11 22:53:07 2007 UTC (17 years, 11 months ago)
File size: 8219 byte(s)
Log Message:

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     o2d_opt_point.c Type:Func
4    
5     Bouge de point
6    
7     Date de creation : Mon May 26 17:39:46 1997
8    
9     Derniere version : Wed Jun 4 14:35:04 1997
10    
11    
12    
13    
14     Vincent FRANCOIS
15    
16     *****************************************************************/
17    
18    
19    
20    
21    
22     /**************************/
23     /* include */
24     #include <stdio.h>
25     #include <string.h>
26     #include <math.h>
27     #include "const.h"
28     #include "memoire.h"
29     #include "struct.h"
30     #include "prototype.h"
31    
32    
33     /**************************/
34     /* variables globales */
35     extern struct environnement env;
36     extern struct s_mesh *mesh;
37     extern struct s_acis *acis;
38    
39    
40    
41     /**************************/
42     /* programme principal */
43    
44     int o2d_opt_point(struct s_face *face,struct s_noeud *no,float *crit,float *nu,float *nv,float *nx,float *ny,float *nz)
45     {
46     struct s_noeud *no1,*no2,*no3,*nob1,*nob2,*noa,*nob,*noc;
47     struct s_triangle *tri;
48     float xdep,ydep,zdep,udep,vdep;
49     float du,dv,u,v,u1,u2,v1,v2,uopt,vopt;
50     float ddeb,alpha,d,n1n3[4],n1n2[4],normal1[4],normal2[4];
51     float qual,qualcourant,qualcoq,qualtmp,qual1,qual2,qual3,qual4,qual5,qual6,qual7,qual8;
52     int i;
53    
54    
55     if (no->num_ent!=face->num) return(0);
56     if (no->creation==RECUPERER) return(0);
57    
58    
59     xdep=no->x;
60     ydep=no->y;
61     zdep=no->z;
62     udep=no->u;
63     vdep=no->v;
64    
65    
66     /* decalage de parametre */
67     if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-udep; else du=0.;
68     if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-vdep; else dv=0.;
69     eval_decale(&u,du,no->u,U);
70     eval_decale(&v,dv,no->v,V);
71    
72    
73     uopt=0.;
74     vopt=0.;
75     qual=1.;
76     /* critere de depart */
77     for (i=0;i<no->nb_triangle;i++)
78     {
79     MINI(qual,qual,no->triangle[i]->crit);
80     no1=ADRESSE(no->triangle[i]->n1,noeud,mesh->);
81     no2=ADRESSE(no->triangle[i]->n2,noeud,mesh->);
82     no3=ADRESSE(no->triangle[i]->n3,noeud,mesh->);
83     if (no==no1)
84     {
85     nob1=no2;
86     nob2=no3;
87     }
88     if (no==no2)
89     {
90     nob1=no1;
91     nob2=no3;
92     }
93     if (no==no3)
94     {
95     nob1=no1;
96     nob2=no2;
97     }
98     eval_decale(&u1,du,nob1->u,LIBRE);
99     eval_decale(&v1,dv,nob1->v,LIBRE);
100     uopt=uopt+u1;
101     vopt=vopt+v1;
102     eval_decale(&u1,du,nob2->u,LIBRE);
103     eval_decale(&v1,dv,nob2->v,LIBRE);
104     uopt=uopt+u1;
105     vopt=vopt+v1;
106     }
107     uopt=uopt/no->nb_triangle/2.;
108     vopt=vopt/no->nb_triangle/2.;
109    
110    
111     ddeb=(float)sqrt((double)((u-uopt)*(u-uopt)+(v-vopt)*(v-vopt)));
112     alpha=0.5;
113     d=alpha*ddeb;
114     qualcourant=qual;
115    
116    
117     while (alpha>0.1)
118     {
119     /* cas 1 */
120     u2=u+d;
121     v2=v;
122     eval_face(face,&u2,&v2,FONCTION,&no->x,&no->y,&no->z,du,dv);
123     qual1=1.;
124     for (i=0;i<no->nb_triangle;i++)
125     {
126     tri=no->triangle[i];
127     qualtmp=m2d_cal_qual(tri->n1,tri->n2,tri->n3);
128     noa=ADRESSE(tri->n1,noeud,mesh->);
129     nob=ADRESSE(tri->n2,noeud,mesh->);
130     noc=ADRESSE(tri->n3,noeud,mesh->);
131     VEC(n1n3,noa,noc);
132     VEC(n1n2,noa,nob);
133     eval_normal(face,normal2,u2-du,v2-dv);
134     PVEC(normal1,normal2,n1n3);
135     if (PSCA(normal1,n1n2)<0.0001) qualtmp=0.;;
136     if (qualtmp<qual1) qual1=qualtmp;
137     }
138    
139     /* cas 2 */
140     u2=u-d;
141     v2=v;
142     eval_face(face,&u2,&v2,FONCTION,&no->x,&no->y,&no->z,du,dv);
143     qual2=1.;
144     for (i=0;i<no->nb_triangle;i++)
145     {
146     tri=no->triangle[i];
147     qualtmp=m2d_cal_qual(tri->n1,tri->n2,tri->n3);
148     noa=ADRESSE(tri->n1,noeud,mesh->);
149     nob=ADRESSE(tri->n2,noeud,mesh->);
150     noc=ADRESSE(tri->n3,noeud,mesh->);
151     VEC(n1n3,noa,noc);
152     VEC(n1n2,noa,nob);
153     eval_normal(face,normal2,u2-du,v2-dv);
154     PVEC(normal1,normal2,n1n3);
155     if (PSCA(normal1,n1n2)<0.0001) qualtmp=0.;;
156     if (qualtmp<qual2) qual2=qualtmp;
157     }
158    
159     /* cas 3 */
160     u2=u;
161     v2=v+d;
162     eval_face(face,&u2,&v2,FONCTION,&no->x,&no->y,&no->z,du,dv);
163     qual3=1.;
164     for (i=0;i<no->nb_triangle;i++)
165     {
166     tri=no->triangle[i];
167     qualtmp=m2d_cal_qual(tri->n1,tri->n2,tri->n3);
168     noa=ADRESSE(tri->n1,noeud,mesh->);
169     nob=ADRESSE(tri->n2,noeud,mesh->);
170     noc=ADRESSE(tri->n3,noeud,mesh->);
171     VEC(n1n3,noa,noc);
172     VEC(n1n2,noa,nob);
173     eval_normal(face,normal2,u2-du,v2-dv);
174     PVEC(normal1,normal2,n1n3);
175     if (PSCA(normal1,n1n2)<0.0001) qualtmp=0.;;
176     if (qualtmp<qual3) qual3=qualtmp;
177     }
178    
179     /* cas 4 */
180     u2=u;
181     v2=v-d;
182     eval_face(face,&u2,&v2,FONCTION,&no->x,&no->y,&no->z,du,dv);
183     qual4=1.;
184     for (i=0;i<no->nb_triangle;i++)
185     {
186     tri=no->triangle[i];
187     qualtmp=m2d_cal_qual(tri->n1,tri->n2,tri->n3);
188     noa=ADRESSE(tri->n1,noeud,mesh->);
189     nob=ADRESSE(tri->n2,noeud,mesh->);
190     noc=ADRESSE(tri->n3,noeud,mesh->);
191     VEC(n1n3,noa,noc);
192     VEC(n1n2,noa,nob);
193     eval_normal(face,normal2,u2-du,v2-dv);
194     PVEC(normal1,normal2,n1n3);
195     if (PSCA(normal1,n1n2)<0.0001) qualtmp=0.;;
196     if (qualtmp<qual4) qual4=qualtmp;
197     }
198     /* cas 5 */
199     u2=u+d*0.707106;
200     v2=v+d*0.707106;
201     eval_face(face,&u2,&v2,FONCTION,&no->x,&no->y,&no->z,du,dv);
202     qual5=1.;
203     for (i=0;i<no->nb_triangle;i++)
204     {
205     tri=no->triangle[i];
206     qualtmp=m2d_cal_qual(tri->n1,tri->n2,tri->n3);
207     noa=ADRESSE(tri->n1,noeud,mesh->);
208     nob=ADRESSE(tri->n2,noeud,mesh->);
209     noc=ADRESSE(tri->n3,noeud,mesh->);
210     VEC(n1n3,noa,noc);
211     VEC(n1n2,noa,nob);
212     eval_normal(face,normal2,u2-du,v2-dv);
213     PVEC(normal1,normal2,n1n3);
214     if (PSCA(normal1,n1n2)<0.0001) qualtmp=0.;;
215     if (qualtmp<qual5) qual5=qualtmp;
216     }
217     /* cas 6 */
218     u2=u-d*0.707106;
219     v2=v+d*0.707106;
220     eval_face(face,&u2,&v2,FONCTION,&no->x,&no->y,&no->z,du,dv);
221     qual6=1.;
222     for (i=0;i<no->nb_triangle;i++)
223     {
224     tri=no->triangle[i];
225     qualtmp=m2d_cal_qual(tri->n1,tri->n2,tri->n3);
226     noa=ADRESSE(tri->n1,noeud,mesh->);
227     nob=ADRESSE(tri->n2,noeud,mesh->);
228     noc=ADRESSE(tri->n3,noeud,mesh->);
229     VEC(n1n3,noa,noc);
230     VEC(n1n2,noa,nob);
231     eval_normal(face,normal2,u2-du,v2-dv);
232     PVEC(normal1,normal2,n1n3);
233     if (PSCA(normal1,n1n2)<0.0001) qualtmp=0.;;
234     if (qualtmp<qual6) qual6=qualtmp;
235     }
236     /* cas 7 */
237     u2=u-d*0.707106;
238     v2=v-d*0.707106;
239     eval_face(face,&u2,&v2,FONCTION,&no->x,&no->y,&no->z,du,dv);
240     qual7=1.;
241     for (i=0;i<no->nb_triangle;i++)
242     {
243     tri=no->triangle[i];
244     qualtmp=m2d_cal_qual(tri->n1,tri->n2,tri->n3);
245     noa=ADRESSE(tri->n1,noeud,mesh->);
246     nob=ADRESSE(tri->n2,noeud,mesh->);
247     noc=ADRESSE(tri->n3,noeud,mesh->);
248     VEC(n1n3,noa,noc);
249     VEC(n1n2,noa,nob);
250     eval_normal(face,normal2,u2-du,v2-dv);
251     PVEC(normal1,normal2,n1n3);
252     if (PSCA(normal1,n1n2)<0.0001) qualtmp=0.;;
253     if (qualtmp<qual7) qual7=qualtmp;
254     }
255     /* cas 8 */
256     u2=u+d*0.707106;
257     v2=v-d*0.707106;
258     eval_face(face,&u2,&v2,FONCTION,&no->x,&no->y,&no->z,du,dv);
259     qual8=1.;
260     for (i=0;i<no->nb_triangle;i++)
261     {
262     tri=no->triangle[i];
263     qualtmp=m2d_cal_qual(tri->n1,tri->n2,tri->n3);
264     noa=ADRESSE(tri->n1,noeud,mesh->);
265     nob=ADRESSE(tri->n2,noeud,mesh->);
266     noc=ADRESSE(tri->n3,noeud,mesh->);
267     VEC(n1n3,noa,noc);
268     VEC(n1n2,noa,nob);
269     eval_normal(face,normal2,u2-du,v2-dv);
270     PVEC(normal1,normal2,n1n3);
271     if (PSCA(normal1,n1n2)<0.0001) qualtmp=0.;;
272     if (qualtmp<qual8) qual8=qualtmp;
273     }
274     MAXI(qualcoq,qual1,qual2);
275     MAXI(qualcoq,qualcoq,qual3);
276     MAXI(qualcoq,qualcoq,qual4);
277     MAXI(qualcoq,qualcoq,qual5);
278     MAXI(qualcoq,qualcoq,qual6);
279     MAXI(qualcoq,qualcoq,qual7);
280     MAXI(qualcoq,qualcoq,qual8);
281     if (qualcoq<qualcourant+0.0001) alpha=alpha-0.1;
282     else
283     {
284     if (qualcoq==qual1) u=u+d;
285     if (qualcoq==qual2) u=u-d;
286     if (qualcoq==qual3) v=v+d;
287     if (qualcoq==qual4) v=v-d;
288     if (qualcoq==qual5) {u=u+d*0.707106;v=v+d*0.707106;}
289     if (qualcoq==qual6) {u=u-d*0.707106;v=v+d*0.707106;}
290     if (qualcoq==qual7) {u=u-d*0.707106;v=v-d*0.707106;}
291     if (qualcoq==qual8) {u=u+d*0.707106;v=v-d*0.707106;}
292     qualcourant=qualcoq;
293     }
294     d=ddeb*alpha;
295     }
296    
297     no->x=xdep;
298     no->y=ydep;
299     no->z=zdep;
300     no->u=udep;
301     no->v=vdep;
302    
303     if (qualcourant>qual)
304     {
305     *crit=qualcourant;
306     eval_decale(nu,-du,u,U);
307     eval_decale(nv,-dv,v,V);
308     eval_face(face,nu,nv,FONCTION,nx,ny,nz,0.,0.);
309     return(1);
310     }
311     else return(0);
312    
313    
314     }