2 // C++ : Gestion des vecteurs
4 // Copyright (C) 2009-2016 CEA/DEN, EDF R&D
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #include "HexVector.hxx"
23 #include "HexXmlWriter.hxx"
27 // ======================================================== Constructeur
28 Vector::Vector (Document* doc, double dx, double dy, double dz)
29 : EltBase (doc, EL_VECTOR)
35 // ======================================================== Constructeur bis
36 Vector::Vector (Vector* lautre)
37 : EltBase (lautre->el_root)
39 v_dx = lautre -> v_dx;
40 v_dy = lautre -> v_dy;
41 v_dz = lautre -> v_dz;
44 // ======================================================== calculNormale
45 // === Calcule un vecteur orthogonal et norme
46 int Vector::calculNormale (double& nx, double& ny, double& nz)
48 double epsil = (v_dx * v_dx + v_dy * v_dy + v_dz * v_dz)*1e-6;
50 if (v_dx > epsil || v_dx < -epsil) forme += 100;
51 if (v_dy > epsil || v_dy < -epsil) forme += 10;
52 if (v_dz > epsil || v_dz < -epsil) forme += 1;
57 // dx=dy=dz=0 : retour vecteur i + erreur
60 // dx = 0 : on prend le vecteur i
65 // dy = 0 : on prend le vecteur j
69 // dz = 0 : on prend le vecteur k
72 // dx, dy, dy non nuls : cas general;
76 double norme = sqrt (v_dx*v_dx + v_dy*v_dy);
81 // ========================================================= saveXml
82 void Vector::saveXml (XmlWriter* xml)
84 char buffer[12], coord[80];
86 sprintf (coord, "%g %g %g", v_dx, v_dy, v_dz);
88 xml->openMark ("Vector");
89 xml->addAttribute ("id", getName (buffer));
90 xml->addAttribute ("coord", coord);
92 xml->addAttribute ("name", el_name);
95 // ========================================================= getAngleX
96 double Vector::getAngleX ()
98 static const double Epsilon = 1e-6;
100 double norme = getNorm ();
104 double kos = v_dx / norme;
105 double deg = acos(kos) * 180.0 / M_PI;
108 // ===================================================== getCoord
109 double Vector::getCoord (int dir)
114 case dir_x : val = v_dx;
116 case dir_y : val = v_dy;
118 case dir_z : val = v_dz;
123 // ===================================================== renormer
124 int Vector::renormer()
126 double dn = getNorm ();
136 // ===================================================== vectoriel
137 void Vector::vectoriel (Vector* a, Vector*b)
139 v_dx = a->v_dy * b->v_dz - b->v_dy * a->v_dz;
140 v_dy = a->v_dz * b->v_dx - b->v_dz * a->v_dx;
141 v_dz = a->v_dx * b->v_dy - b->v_dx * a->v_dy;
144 // ===================================================== getCoord
145 double* Vector::getCoord (double coord[])
147 coord [dir_x] = v_dx;
148 coord [dir_y] = v_dy;
149 coord [dir_z] = v_dz;
152 // ===================================================== getUnitVector
153 int Vector::getUnitVector (double coord[])
155 coord [dir_x] = v_dx;
156 coord [dir_y] = v_dy;
157 coord [dir_z] = v_dz;
158 int ier = normer_vecteur (coord);
161 // ===================================================== multiplier
162 void Vector::multiplier (double scalaire)
168 // ===================================================== dump
175 printf ("(*** deleted ***)\n");
179 printf ("(%g, %g, %g)\n", v_dx,v_dy,v_dz);