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

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