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

# Content
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 }