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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     geo_int_elli_plane.c Type:Func
4    
5     Intersection ellipse plane
6    
7     Date de creation : Tue Jul 8 09:37:23 1997
8    
9     Derniere version : Wed Jul 9 16:24:46 1997
10    
11    
12    
13     Vincent FRANCOIS
14    
15     *****************************************************************/
16    
17    
18    
19    
20    
21     /**************************/
22     /* include */
23     #include <stdio.h>
24     #include <string.h>
25     #include <math.h>
26     #include "const.h"
27     #include "memoire.h"
28     #include "struct.h"
29     #include "prototype.h"
30    
31    
32    
33     /**************************/
34     /* variables globales */
35    
36    
37    
38     /**************************/
39     /* programme principal */
40    
41     int geo_int_elli_plane(struct s_edge *edge,struct s_ellipse *ellipse,float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3,float *x,float *y ,float *z)
42     {
43     struct s_par_ellipse *param;
44     float A,B,C,resu,res[3],rad,ox[3],oy[3],oz[4],cteta,steta,teta,alpha,t1,t2,coord[3],tt,ttt,delta;
45     int sol1,sol2,n1,n2;
46     int nb_sol;
47    
48     param=ellipse->param;
49     /* definition du plan */
50     ox[0]=x2-x1;ox[1]=y2-y1;ox[2]=z2-z1;
51     oy[0]=x3-x1;oy[1]=y3-y1;oy[2]=z3-z1;
52     PVEC(oz,ox,oy);
53     oz[3]=(-oz[0]*x1-oz[1]*y1-oz[2]*z1);
54    
55     /* resolution */
56     A=param->a*(oz[0]*param->u[0]+oz[1]*param->u[1]+oz[2]*param->u[2]);
57     B=param->b*(oz[0]*param->v[0]+oz[1]*param->v[1]+oz[2]*param->v[2]);
58     C=(-oz[0]*param->centre[0]-oz[1]*param->centre[1]-oz[2]*param->centre[2]-oz[3]);
59     rad=A*A+B*B;
60     if (EGAL(rad,0.0,0.0001)) return(0);
61     rad=(float)sqrt((double)rad);
62     resu=C/rad;
63     if (fabs((double)resu)>1.0001) return(0);
64     if (resu>1.) resu=1.;
65     if (resu<(-1)) resu=(-1);
66     cteta=A/rad;
67     steta=B/rad;
68     if (cteta>1.) cteta=1.;
69     if (cteta<(-1)) cteta=(-1);
70     teta=(float)acos((double)cteta);
71     if (steta<0.) teta=(-teta);
72     alpha=(float)acos((double)resu);
73     t1=teta+alpha;
74     t2=teta-alpha;
75     while (t1<edge->t1) t1=t1+2*PI;
76     while (t2<edge->t1) t2=t2+2*PI;
77    
78    
79    
80    
81     /* validation de la resolution */
82     nb_sol=0;
83     t1=t1-edge->t1;
84     t2=t2-edge->t1;
85    
86     if (t1>edge->t2) sol1=0; else sol1=1;
87     if (t2>edge->t2) sol2=0; else sol2=1;
88     if ((sol1==0) && (sol2==0)) return(0);
89     delta=ox[0]*oy[1]-ox[1]*oy[0];
90     if (EGAL(delta,0.0,0.0001))
91     {
92     delta=ox[0]*oy[2]-ox[2]*oy[0];
93     if (EGAL(delta,0.0,0.0001))
94     {
95     delta=ox[1]*oy[2]-ox[2]*oy[1];
96     n1=1;n2=2;
97     }
98     else
99     {
100     n1=0;n2=2;
101     }
102     }
103     else
104     {
105     n1=0;n2=1;
106     }
107     if (sol1==1)
108     {
109     eval_ellipse(param,t1+edge->t1,FONCTION,coord);
110     res[0]=coord[0]-x1;res[1]=coord[1]-y1;res[2]=coord[2]-z1;
111     tt=(res[n1]*oy[n2]-res[n2]*oy[n1])/delta;
112     ttt=(ox[n1]*res[n2]-ox[n2]*res[n1])/delta;
113     if ((tt<-0.0001)||(tt>0.9999)) sol1=0;
114     if ((ttt<-0.0001)||(ttt>=0.9999)) sol1=0;
115     }
116     if (sol1==1)
117     {
118     x[nb_sol]=coord[0];
119     y[nb_sol]=coord[1];
120     z[nb_sol]=coord[2];
121     nb_sol++;
122     }
123     if (sol2==1)
124     {
125     eval_ellipse(param,t2+edge->t1,FONCTION,coord);
126     res[0]=coord[0]-x1;res[1]=coord[1]-y1;res[2]=coord[2]-z1;
127     tt=(res[n1]*oy[n2]-res[n2]*oy[n1])/delta;
128     ttt=(ox[n1]*res[n2]-ox[n2]*res[n1])/delta;
129     if ((tt<-0.0001)||(tt>=0.9999)) sol2=0;
130     if ((ttt<-0.0001)||(ttt>=0.9999)) sol2=0;
131     }
132     if (sol2==1)
133     {
134     x[nb_sol]=coord[0];
135     y[nb_sol]=coord[1];
136     z[nb_sol]=coord[2];
137     nb_sol++;
138     }
139     return(nb_sol);
140    
141    
142    
143    
144     }