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

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