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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     eval_mindis_face.cpp Type:Func
4    
5     Calcul la distance minimum entre une entite et un point
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(struct s_face *face, float *x,float *dis, float *par)
37     {
38     float u,v,uu,vv;
39     float g0,g1;
40     int ok;
41     float um,vm,eps,ud,vd,ua,va,lu,lv;
42    
43     if (face->rev_u==0.)
44     {
45     ud=face->uinf;
46     ua=face->usup;
47     }
48     else
49     {
50     ud=0.;
51     ua=face->rev_u;
52     }
53     if (face->rev_v==0.)
54     {
55     vd=face->vinf;
56     va=face->vsup;
57     }
58     else
59     {
60     vd=0.;
61     va=face->rev_v;
62     }
63     MINI(eps,0.0001*(ua-ud),0.0001*(va-vd));;
64     MAXI(lu,3.*eps,0.0001*(ua-ud));
65     MAXI(lv,3.*eps,0.0001*(va-vd));
66     ok=0;
67     do
68     {
69     um=(ud+ua)/2.;
70     vm=(vd+va)/2.;
71     u=um-eps;
72     v=vm-eps;
73     uu=um+eps;
74     vv=vm+eps;
75     g0=eval_dis_point_face(face,x,u,vm,FONCTION);
76     g1=eval_dis_point_face(face,x,uu,vm,FONCTION);
77     if (g0<g1) ua=uu;
78     else ud=u;
79     g0=eval_dis_point_face(face,x,um,v,FONCTION);
80     g1=eval_dis_point_face(face,x,um,vv,FONCTION);
81     if (g0<g1) va=vv;
82     else vd=v;
83     if ((ua-ud<lu) && (va-vd<lv) ) ok=1;
84     }
85     while (ok==0);
86     par[0]=(ua+ud)/2.;
87     par[1]=(va+vd)/2.;
88     *dis=(float)sqrt((double)eval_dis_point_face(face,x,par[0],par[1],FONCTION));
89     }