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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     eval_mindis_face_face.cpp Type:Func
4    
5     Calcul la distance minimum entre deux faces
6    
7     Date de creation : 2-2-1999 10 :25 :59
8     Derniere version : 2-2-1999 10 :25 :59
9    
10     Vincent FRANCOIS
11    
12     *****************************************************************/
13    
14    
15    
16    
17    
18     /**************************/
19     /* include */
20     #include <stdio.h>
21     #include <string.h>
22     #include <math.h>
23     #include "struct.h"
24     #include "const.h"
25     #include "prototype.h"
26    
27     /**************************/
28     /* variables globales */
29     extern struct s_acis *acis;
30    
31    
32    
33     /**************************/
34     /* programme principal */
35    
36     void eval_mindis_face_face(struct s_face *face1, struct s_face *face2,float *dis, float *par)
37     {
38     float u1,v1,uu1,vv1;
39     float u2,v2,uu2,vv2;
40     float g0,g1;
41     int ok;
42     float u1m,v1m,eps,u1d,v1d,u1a,v1a,lu1,lv1;
43     float u2m,v2m,u2d,v2d,u2a,v2a,lu2,lv2;
44    
45     if (face1->rev_u==0.)
46     {
47     u1d=face1->uinf;
48     u1a=face1->usup;
49     }
50     else
51     {
52     u1d=0.;
53     u1a=face1->rev_u;
54     }
55     if (face1->rev_v==0.)
56     {
57     v1d=face1->vinf;
58     v1a=face1->vsup;
59     }
60     else
61     {
62     v1d=0.;
63     v1a=face1->rev_v;
64     }
65     if (face2->rev_u==0.)
66     {
67     u2d=face2->uinf;
68     u2a=face2->usup;
69     }
70     else
71     {
72     u2d=0.;
73     u2a=face2->rev_u;
74     }
75     if (face2->rev_v==0.)
76     {
77     v2d=face2->vinf;
78     v2a=face2->vsup;
79     }
80     else
81     {
82     v2d=0.;
83     v2a=face2->rev_v;
84     }
85    
86    
87     MINI(eps,0.0001*(u1a-u1d),0.0001*(v1a-v1d));;
88     MINI(eps,eps,0.0001*(v2a-v2d));
89     MINI(eps,eps,0.0001*(u1a-u1d));
90     MAXI(lu1,3.*eps,0.0001*(u1a-u1d));
91     MAXI(lv1,3.*eps,0.0001*(v1a-v1d));
92     MAXI(lu2,3.*eps,0.0001*(u2a-u2d));
93     MAXI(lv2,3.*eps,0.0001*(v2a-v2d));
94     ok=0;
95     do
96     {
97     u1m=(u1d+u1a)/2.;
98     v1m=(v1d+v1a)/2.;
99     u2m=(u2d+u2a)/2.;
100     v2m=(v2d+v2a)/2.;
101     u1=u1m-eps;
102     v1=v1m-eps;
103     uu1=u1m+eps;
104     vv1=v1m+eps;
105     u2=u2m-eps;
106     v2=v2m-eps;
107     uu2=u2m+eps;
108     vv2=v2m+eps;
109     g0=eval_dis_face_face(face1,u1,v1m,face2,u2m,v2m,FONCTION);
110     g1=eval_dis_face_face(face1,uu1,v1m,face2,u2m,v2m,FONCTION);
111     if (g0<g1) u1a=uu1;
112     else u1d=u1;
113     g0=eval_dis_face_face(face1,u1m,v1,face2,u2m,v2m,FONCTION);
114     g1=eval_dis_face_face(face1,u1m,vv1,face2,u2m,v2m,FONCTION);
115     if (g0<g1) v1a=vv1;
116     else v1d=v1;
117     g0=eval_dis_face_face(face1,u1m,v1m,face2,u2,v2m,FONCTION);
118     g1=eval_dis_face_face(face1,u1m,v1m,face2,uu2,v2m,FONCTION);
119     if (g0<g1) u2a=uu2;
120     else u2d=u2;
121     g0=eval_dis_face_face(face1,u1m,v1m,face2,u2m,v2,FONCTION);
122     g1=eval_dis_face_face(face1,u1m,v1m,face2,u2m,vv2,FONCTION);
123     if (g0<g1) v2a=vv2;
124     else v2d=v2;
125     if ((u1a-u1d<lu1) && (v1a-v1d<lv1)&& (u2a-u2d<lu2) && (v2a-v2d<lv2) ) ok=1;
126     }
127     while (ok==0);
128     par[0]=(u1a+u1d)/2.;
129     par[1]=(v1a+v1d)/2.;
130     par[2]=(u2a+u2d)/2.;
131     par[3]=(v2a+v2d)/2.;
132     *dis=(float)sqrt((double)eval_dis_face_face(face1,par[0],par[1],face2,par[2],par[3],FONCTION));
133     }