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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     m2d_int_seg_seg.c Type:Func
4    
5     Intersection entre segment AB et le sement MN
6    
7     Date de creation : Wed Feb 19 14:36:10 1997
8    
9     Derniere version : Thu May 8 10:09:04 1997
10    
11    
12    
13    
14    
15    
16    
17    
18    
19    
20    
21    
22    
23    
24    
25     Vincent FRANCOIS
26    
27     *****************************************************************/
28    
29    
30    
31    
32    
33     /**************************/
34     /* include */
35     #include <stdio.h>
36     #include <math.h>
37     #include <math.h>
38     #include "const.h"
39     #include "struct.h"
40     #include "memoire.h"
41     #include "prototype.h"
42    
43    
44     /**************************/
45     /* variables globales */
46     extern struct environnement env;
47     extern struct s_mesh *mesh;
48    
49     /**************************/
50     /* programme principal */
51     #define VRAI 1
52     #define FAUX 0
53    
54    
55    
56     int m2d_int_seg_seg(int a,int b,int m,int n)
57     {
58     struct s_noeud *noa,*nob,*nom,*non;
59     float ab[3],nm[3],am[3],an[3],det,sol1,sol2,tmp;
60     float eps,eps2;
61     float ua,va,ub,vb,un,vn,um,vm,du,dv;
62     int equation[4],ne1,ne2;
63    
64    
65     noa=ADRESSE(a,noeud,mesh->);
66     nob=ADRESSE(b,noeud,mesh->);
67     nom=ADRESSE(m,noeud,mesh->);
68     non=ADRESSE(n,noeud,mesh->);
69     /* decalage */
70     if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-noa->u; else du=0.;
71     if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-noa->v; else dv=0.;
72     eval_decale(&ua,du,noa->u,U);
73     eval_decale(&va,dv,noa->v,V);
74     eval_decale(&ub,du,nob->u,U);
75     eval_decale(&vb,dv,nob->v,V);
76     eval_decale(&un,du,non->u,U);
77     eval_decale(&vn,dv,non->v,V);
78     eval_decale(&um,du,nom->u,U);
79     eval_decale(&vm,dv,nom->v,V);
80     ab[0]=ub-ua;
81     ab[1]=vb-va;
82     ab[2]=0.;
83     nm[0]=um-un;
84     nm[1]=vm-vn;
85     nm[2]=0.;
86     am[0]=um-ua;
87     am[1]=vm-va;
88     am[2]=0.;
89     equation[0]=1; /* etat de l'equation 0 */
90     equation[1]=1;
91     equation[2]=1;
92     equation[3]=3; /* cette variable comporte le bilan du nombre d'equation */
93     eps2=PSCA(ab,ab);
94     eps=(float)sqrt((double)eps2);
95     eps=eps*0.0001;
96     eps2=eps2*0.0001;
97     /* recherche du nombre d'equation -> inter franche ou para ou confondu */
98     if ( (EGAL(ab[0],0,eps)) && (EGAL(nm[0],0,eps)) )
99     if (EGAL(am[0],0,eps)) equation[0]=0; else return(FAUX);
100     if ( (EGAL(ab[1],0,eps)) && (EGAL(nm[1],0,eps)) )
101     if (EGAL(am[1],0,eps)) equation[1]=0; else return(FAUX);
102     if ( (EGAL(ab[2],0,eps)) && (EGAL(nm[2],0,eps)) )
103     if (EGAL(am[2],0,eps)) equation[2]=0; else return(FAUX);
104     equation[3]=equation[0]+equation[1]+equation[2];
105     if (equation[3]==3)
106     {
107     det=DETER(ab[0],nm[0],ab[1],nm[1]);
108     if ((float)fabs((double)det)>eps2)
109     {
110     det=1/det;
111     sol1=det*DETER(am[0],nm[0],am[1],nm[1]);
112     sol2=det*DETER(ab[0],am[0],ab[1],am[1]);
113     if ( (float)fabs((double)(sol1*ab[2]-sol2*nm[2]-am[2]))>eps2) return(FAUX);
114     return(m2d_ex_sol(sol1,sol2,1));
115     }
116     else
117     {
118     equation[0]=0;
119     equation[3]=2;
120     /* on verifie la compatibilite des deux equations dont le det est nul*/
121     if (ab[0]!=0) tmp=ab[1]*am[0]/ab[0]; else tmp=nm[1]*am[0]/nm[0];
122     if (!(EGAL(tmp,am[1],eps))) return(FAUX);
123     }
124     }
125     if (equation[3]==2)
126     {
127     /* on repere les equations qui existent */
128     if (equation[0]!=0)
129     {
130     ne1=0;
131     if (equation[1]!=0) ne2=1; else ne2=2;
132     }
133     else
134     {
135     ne1=1;
136     ne2=2;
137     }
138    
139     det=DETER(ab[ne1],nm[ne1],ab[ne2],nm[ne2]);
140     if ((float)fabs((double)det)>eps2)
141     {
142     det=1/det;
143     sol1=det*DETER(am[ne1],nm[ne1],am[ne2],nm[ne2]);
144     sol2=det*DETER(ab[ne1],am[ne1],ab[ne2],am[ne2]);
145     return(m2d_ex_sol(sol1,sol2,1));
146     }
147     else
148     {
149     equation[ne1]=0;
150     equation[3]=1;
151     /* on verifie la compatibilite des deux equations dont le det est nul */
152     if (ab[ne1]!=0) tmp=ab[ne2]*am[ne1]/ab[ne1]; else tmp=nm[ne2]*am[ne1]/nm[ne1];
153     if (!(EGAL(tmp,am[ne2],eps))) return(FAUX);
154     }
155    
156     }
157     if (equation[3]==1)
158     {
159     /* on repere l' equation qui existe */
160     if (equation[0]!=0) ne1=0; else
161     if (equation[1]!=0) ne1=1; else ne1=2;
162     an[0]=un-ua;
163     an[1]=vn-va;
164     an[2]=0.;
165     tmp=1/ab[ne1];
166     sol1=am[ne1]*tmp;
167     sol2=an[ne1]*tmp;
168     return(m2d_ex_sol(sol1,sol2,2));
169     }
170     return(0);
171     }