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

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     m1d_param_ellipse Type:func
4    
5     Parametrage d'une ellipse
6    
7     Date de creation : Thu Nov 28 10:26:41 1996
8    
9     Derniere version : Fri May 30 15:31:30 1997
10    
11    
12    
13    
14    
15    
16    
17     Vincent FRANCOIS
18    
19     *****************************************************************/
20    
21    
22    
23    
24    
25     /**************************/
26     /* include */
27     #include <stdio.h>
28     #include <string.h>
29     #include <stdlib.h>
30     #include <math.h>
31     #include "const.h"
32     #include "memoire.h"
33     #include "struct.h"
34     #include "prototype.h"
35    
36    
37     /**************************/
38     /* variables globales */
39     extern struct s_acis *acis;
40     extern struct s_param *para;
41    
42    
43    
44     /**************************/
45     /* programme principal */
46    
47     void m1d_param_ellipse(struct s_edge *edge,struct s_ellipse *ellipse)
48     {
49     struct s_point *p1,*p2;
50     float vec[4],vec1[4],vec2[4],co,si,det;
51     int num0,num1;
52    
53     if (edge->sense==0)
54     {
55     p1=edge->start_vertex->point;
56     p2=edge->end_vertex->point;
57     }
58     else
59     {
60     p2=edge->start_vertex->point;
61     p1=edge->end_vertex->point;
62     }
63     NEW_ENTITE(ellipse->param,par_ellipse,para->);
64     memcpy(ellipse->param->centre,ellipse->center,3*sizeof(float));
65     memcpy(vec,ellipse->major,3*sizeof(float));
66     NORME(vec);
67     ellipse->param->a=vec[3];
68     ellipse->param->b=ellipse->ratio*vec[3];
69     memcpy(ellipse->param->u,vec,3*sizeof(float));
70     memcpy(vec,ellipse->normal,3*sizeof(float));
71     NORME(vec);
72     memcpy(ellipse->param->w,vec,3*sizeof(float));
73     PVEC(ellipse->param->v,ellipse->param->w,ellipse->param->u);
74     vec1[0]=p1->coord[0]-ellipse->center[0];
75     vec1[1]=p1->coord[1]-ellipse->center[1];
76     vec1[2]=p1->coord[2]-ellipse->center[2];
77     vec2[0]=p2->coord[0]-ellipse->center[0];
78     vec2[1]=p2->coord[1]-ellipse->center[1];
79     vec2[2]=p2->coord[2]-ellipse->center[2];
80     det=ellipse->param->b*ellipse->param->a*(ellipse->param->u[0]*ellipse->param->v[1]-ellipse->param->u[1]*ellipse->param->v[0]);
81     if (EGAL(det,0.0,0.0001))
82     {
83     det=ellipse->param->b*ellipse->param->a*(ellipse->param->u[0]*ellipse->param->v[2]-ellipse->param->u[2]*ellipse->param->v[0]);
84     if (EGAL(det,0.0,0.0001))
85     {
86     det=ellipse->param->b*ellipse->param->a*(ellipse->param->u[1]*ellipse->param->v[2]-ellipse->param->u[2]*ellipse->param->v[1]);
87     num0=1;
88     num1=2;
89     }
90     else
91     {
92     num0=0;
93     num1=2;
94     }
95     }
96     else
97     {
98     num0=0;
99     num1=1;
100     }
101     co=(vec1[num0]*ellipse->param->b*ellipse->param->v[num1]-vec1[num1]*ellipse->param->b*ellipse->param->v[num0])/det;
102     si=(vec1[num1]*ellipse->param->a*ellipse->param->u[num0]-vec1[num0]*ellipse->param->a*ellipse->param->u[num1])/det;
103     if (co>1.) co=1.;
104     if (co<(-1.)) co=(-1.);
105     edge->t1=(float)acos((double)co);
106     if (si<-0.0001) edge->t1=(-edge->t1);
107     if (edge->t1<-0.0001) edge->t1=edge->t1+2*PI;
108     co=(vec2[num0]*ellipse->param->b*ellipse->param->v[num1]-vec2[num1]*ellipse->param->b*ellipse->param->v[num0])/det;
109     si=(vec2[num1]*ellipse->param->a*ellipse->param->u[num0]-vec2[num0]*ellipse->param->a*ellipse->param->u[num1])/det;
110     if (co>1.) co=1.;
111     if (co<(-1.)) co=(-1.);
112     edge->t2=(float)acos((double)co);
113     if (si<-0.0001) edge->t2=(-edge->t2);
114     if (edge->t2<-0.0001) edge->t2=edge->t2+2*PI;
115     edge->t2=edge->t2-edge->t1;
116     if (edge->t2<0.0001) edge->t2=edge->t2+2*PI;
117     }