1 |
francois |
283 |
//------------------------------------------------------------ |
2 |
|
|
//------------------------------------------------------------ |
3 |
|
|
// MAGiC |
4 |
|
|
// Jean Christophe Cuilli�re et Vincent FRANCOIS |
5 |
|
|
// D�partement de G�nie M�canique - UQTR |
6 |
|
|
//------------------------------------------------------------ |
7 |
|
|
// Le projet MAGIC est un projet de recherche du d�partement |
8 |
|
|
// de g�nie m�canique de l'Universit� du Qu�bec � |
9 |
|
|
// Trois Rivi�res |
10 |
|
|
// Les librairies ne peuvent �tre utilis�es sans l'accord |
11 |
|
|
// des auteurs (contact : francois@uqtr.ca) |
12 |
|
|
//------------------------------------------------------------ |
13 |
|
|
//------------------------------------------------------------ |
14 |
|
|
// |
15 |
|
|
// stline.cpp |
16 |
|
|
// |
17 |
|
|
//------------------------------------------------------------ |
18 |
|
|
//------------------------------------------------------------ |
19 |
|
|
// COPYRIGHT 2000 |
20 |
|
|
// Version du 02/03/2006 � 11H24 |
21 |
|
|
//------------------------------------------------------------ |
22 |
|
|
//------------------------------------------------------------ |
23 |
|
|
|
24 |
|
|
|
25 |
|
|
#include "gestionversion.h" |
26 |
|
|
|
27 |
|
|
#include "stline.h" |
28 |
|
|
#include "stvector.h" |
29 |
|
|
#include "stdirection.h" |
30 |
|
|
#include "st_point.h" |
31 |
|
|
#include "st_gestionnaire.h" |
32 |
|
|
#include "ot_mathematique.h" |
33 |
|
|
#include "constantegeo.h" |
34 |
|
|
|
35 |
|
|
#include <math.h> |
36 |
|
|
|
37 |
|
|
|
38 |
|
|
|
39 |
|
|
|
40 |
|
|
|
41 |
|
|
ST_LINE::ST_LINE(long LigneCourante,std::string idori,long point,long vector):ST_COURBE(LigneCourante,idori),id_point(point),id_vector(vector) |
42 |
|
|
{ |
43 |
|
|
} |
44 |
|
|
|
45 |
|
|
ST_LINE::ST_LINE(double *origine,double *dir):ST_COURBE() |
46 |
|
|
{ |
47 |
|
|
point[0]=origine[0]; |
48 |
|
|
point[1]=origine[1]; |
49 |
|
|
point[2]=origine[2]; |
50 |
|
|
vecteur_directeur[0]=dir[0]; |
51 |
|
|
vecteur_directeur[1]=dir[1]; |
52 |
|
|
vecteur_directeur[2]=dir[2]; |
53 |
|
|
} |
54 |
|
|
|
55 |
|
|
|
56 |
|
|
|
57 |
|
|
long ST_LINE::get_id_point(void) |
58 |
|
|
{ |
59 |
|
|
return id_point; |
60 |
|
|
} |
61 |
|
|
|
62 |
|
|
void ST_LINE::initialiser(ST_GESTIONNAIRE *gest) |
63 |
|
|
{ |
64 |
|
|
ST_VECTOR* vecteur=gest->lst_vector.getid(id_vector); |
65 |
|
|
ST_POINT* pt=gest->lst_point.getid(id_point); |
66 |
|
|
pt->evaluer(point); |
67 |
|
|
ST_DIRECTION* dir=gest->lst_direction.getid(vecteur->get_id_direction()); |
68 |
|
|
double *direct=dir->get_direction(); |
69 |
|
|
vecteur_directeur[0]=direct[0]; |
70 |
|
|
vecteur_directeur[1]=direct[1]; |
71 |
|
|
vecteur_directeur[2]=direct[2]; |
72 |
|
|
} |
73 |
|
|
|
74 |
|
|
long ST_LINE::get_id_vector(void) |
75 |
|
|
{ |
76 |
|
|
return id_vector; |
77 |
|
|
} |
78 |
|
|
void ST_LINE::evaluer(double t,double *xyz) |
79 |
|
|
{ |
80 |
|
|
xyz[0]=point[0]+t*vecteur_directeur[0]; |
81 |
|
|
xyz[1]=point[1]+t*vecteur_directeur[1]; |
82 |
|
|
xyz[2]=point[2]+t*vecteur_directeur[2]; |
83 |
|
|
} |
84 |
|
|
void ST_LINE::deriver(double t,double *dxyz) |
85 |
|
|
{ |
86 |
|
|
dxyz[0]=vecteur_directeur[0]; |
87 |
|
|
dxyz[1]=vecteur_directeur[1]; |
88 |
|
|
dxyz[2]=vecteur_directeur[2]; |
89 |
|
|
} |
90 |
|
|
void ST_LINE::deriver_seconde(double t,double *ddxyz,double* dxyz ,double* xyz ) |
91 |
|
|
{ |
92 |
|
|
ddxyz[0]=0.; |
93 |
|
|
ddxyz[1]=0.; |
94 |
|
|
ddxyz[2]=0.; |
95 |
|
|
|
96 |
|
|
if (dxyz!=NULL) |
97 |
|
|
{ |
98 |
|
|
dxyz[0]=vecteur_directeur[0]; |
99 |
|
|
dxyz[1]=vecteur_directeur[1]; |
100 |
|
|
dxyz[2]=vecteur_directeur[2]; |
101 |
|
|
} |
102 |
|
|
if (xyz!=NULL) |
103 |
|
|
{ |
104 |
|
|
xyz[0]=point[0]+t*vecteur_directeur[0]; |
105 |
|
|
xyz[1]=point[1]+t*vecteur_directeur[1]; |
106 |
|
|
xyz[2]=point[2]+t*vecteur_directeur[2]; |
107 |
|
|
} |
108 |
|
|
} |
109 |
|
|
|
110 |
|
|
|
111 |
|
|
void ST_LINE::inverser(double& t,double *xyz,double precision) |
112 |
|
|
{ |
113 |
|
|
int num; |
114 |
|
|
if (!(OPERATEUR::egal(vecteur_directeur[0],0.,0.000001))) num=0; |
115 |
|
|
else if (!(OPERATEUR::egal(vecteur_directeur[1],0.,0.000001))) num=1; |
116 |
|
|
else num=2; |
117 |
|
|
t=xyz[num]-point[num]; |
118 |
|
|
t=t/vecteur_directeur[num]; |
119 |
|
|
} |
120 |
|
|
|
121 |
|
|
|
122 |
|
|
double ST_LINE::get_tmin() |
123 |
|
|
{ |
124 |
|
|
return -1e300; |
125 |
|
|
} |
126 |
|
|
double ST_LINE::get_tmax() |
127 |
|
|
{ |
128 |
|
|
return 1e300; |
129 |
|
|
} |
130 |
|
|
double ST_LINE::get_longueur(double t1,double t2,double precis) |
131 |
|
|
{ |
132 |
|
|
double norme=vecteur_directeur[0]*vecteur_directeur[0]+vecteur_directeur[1]*vecteur_directeur[1]+vecteur_directeur[2]*vecteur_directeur[2]; |
133 |
|
|
norme=sqrt(norme); |
134 |
|
|
return norme*(t2-t1); |
135 |
|
|
} |
136 |
|
|
int ST_LINE::est_periodique(void) |
137 |
|
|
{ |
138 |
|
|
return 0; |
139 |
|
|
} |
140 |
|
|
double ST_LINE::get_periode(void) |
141 |
|
|
{ |
142 |
|
|
return 0.; |
143 |
|
|
} |
144 |
|
|
|
145 |
|
|
int ST_LINE::get_type_geometrique(TPL_LISTE_ENTITE<double> ¶m) |
146 |
|
|
{ |
147 |
|
|
param.ajouter(point[0]); |
148 |
|
|
param.ajouter(point[1]); |
149 |
|
|
param.ajouter(point[2]); |
150 |
|
|
param.ajouter(vecteur_directeur[0]); |
151 |
|
|
param.ajouter(vecteur_directeur[1]); |
152 |
|
|
param.ajouter(vecteur_directeur[2]); |
153 |
|
|
return MGCo_LINE; |
154 |
|
|
} |
155 |
|
|
|
156 |
|
|
|
157 |
|
|
void ST_LINE::est_util(ST_GESTIONNAIRE* gest) |
158 |
|
|
{ |
159 |
|
|
util=true; |
160 |
|
|
gest->lst_point.getid(id_point)->est_util(gest); |
161 |
|
|
gest->lst_vector.getid(id_vector)->est_util(gest); |
162 |
|
|
} |
163 |
|
|
|
164 |
|
|
|
165 |
|
|
|
166 |
|
|
void ST_LINE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> ¶m) |
167 |
|
|
{ |
168 |
|
|
// The first parameter indicate the code access |
169 |
|
|
param.ajouter(1); |
170 |
|
|
// The follewing two parameters of the list indicate the orders of the net points |
171 |
|
|
|
172 |
|
|
param.ajouter(2); |
173 |
|
|
param.ajouter(0); |
174 |
|
|
|
175 |
|
|
// The follewing two parameters indicate the number of rows and colons of the control points |
176 |
|
|
// respectively to the two parameters directions |
177 |
|
|
|
178 |
|
|
param.ajouter(2); |
179 |
|
|
param.ajouter(0); |
180 |
|
|
|
181 |
|
|
// this present the knot vector in the u-direction |
182 |
|
|
|
183 |
|
|
param.ajouter(0); |
184 |
|
|
param.ajouter(0); |
185 |
|
|
param.ajouter(1); |
186 |
|
|
param.ajouter(1); |
187 |
|
|
|
188 |
|
|
double u_inf=10e6; |
189 |
|
|
double xyz[3]; |
190 |
|
|
|
191 |
|
|
xyz[0]=point[0]+u_inf*vecteur_directeur[0]; |
192 |
|
|
xyz[1]=point[1]+u_inf*vecteur_directeur[1]; |
193 |
|
|
xyz[2]=point[2]+u_inf*vecteur_directeur[2]; |
194 |
|
|
|
195 |
|
|
param.ajouter(xyz[0]); |
196 |
|
|
param.ajouter(xyz[1]); |
197 |
|
|
param.ajouter(xyz[2]); |
198 |
francois |
433 |
param.ajouter(1.); |
199 |
francois |
283 |
|
200 |
|
|
|
201 |
|
|
xyz[0]=point[0]-u_inf*vecteur_directeur[0]; |
202 |
|
|
xyz[1]=point[1]-u_inf*vecteur_directeur[1]; |
203 |
|
|
xyz[2]=point[2]-u_inf*vecteur_directeur[2]; |
204 |
|
|
|
205 |
|
|
param.ajouter(xyz[0]); |
206 |
|
|
param.ajouter(xyz[1]); |
207 |
|
|
param.ajouter(xyz[2]); |
208 |
francois |
433 |
param.ajouter(1.); |
209 |
francois |
283 |
|
210 |
|
|
indx_premier_ptctr=9; |
211 |
|
|
|
212 |
|
|
} |