Salome HOME
Merge from V6_main_20120808 08Aug12
[modules/hexablock.git] / src / HEXABLOCK / HexVector.cxx
1
2 // C++ : Gestion des vecteurs
3
4 // Copyright (C) 2009-2012  CEA/DEN, EDF R&D
5 //
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.
10 //
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.
15 //
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
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 #include "HexVector.hxx"
23 #include "HexXmlWriter.hxx"
24
25 BEGIN_NAMESPACE_HEXA
26
27 // ======================================================== Constructeur
28 Vector::Vector (Document* doc, double dx, double dy, double dz)
29       : EltBase (doc, EL_VECTOR)
30 {
31     v_dx = dx;
32     v_dy = dy;
33     v_dz = dz;
34 }
35 // ======================================================== Constructeur bis
36 Vector::Vector (Vector* lautre)
37       : EltBase (lautre->el_root)
38 {
39     v_dx = lautre -> v_dx;
40     v_dy = lautre -> v_dy;
41     v_dz = lautre -> v_dz;
42 }
43
44 // ======================================================== calculNormale
45 // === Calcule un vecteur orthogonal et norme
46 int Vector::calculNormale (double& nx, double& ny, double& nz)
47 {
48     double epsil = (v_dx * v_dx + v_dy * v_dy + v_dz * v_dz)*1e-6;
49     int    forme = 2000;
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;
53
54     nx = ny = nz = 0;
55     switch (forme)
56        {
57                              // dx=dy=dz=0 : retour vecteur i + erreur
58        case 2000 : nx = 1; 
59                    return HERR;
60                              // dx = 0 : on prend le vecteur i
61        case 2001 :  
62        case 2010 :  
63        case 2011 : nx = 1;
64                    return HOK;  
65                              // dy = 0 : on prend le vecteur j
66        case 2100 :  
67        case 2101 : ny = 1; 
68                    return HOK;  
69                              // dz = 0 : on prend le vecteur k
70        case 2110 : nz = 1;
71                    return HOK;  
72                              // dx, dy, dy non nuls : cas general;
73        default :;
74        }
75
76    double norme = sqrt (v_dx*v_dx + v_dy*v_dy);
77    nx =  v_dy / norme;
78    ny = -v_dx / norme;
79    return HOK;  
80 }
81 // ========================================================= saveXml 
82 void Vector::saveXml (XmlWriter* xml)
83 {
84    char buffer[12], coord[80];
85
86    sprintf (coord, "%g %g %g", v_dx, v_dy, v_dz);
87
88    xml->openMark     ("Vector");
89    xml->addAttribute ("id",    getName (buffer));
90    xml->addAttribute ("coord", coord);
91    if (el_name!=buffer) 
92        xml->addAttribute ("name", el_name);
93    xml->closeMark ();
94 }
95 // ========================================================= getAngleX
96 double Vector::getAngleX ()
97 {
98    static const double Epsilon = 1e-6;
99
100    double norme = getNorm ();
101    if (norme < Epsilon)
102       return 0.0;
103
104    double kos = v_dx / norme;
105    double deg = acos(kos) * 180.0 / M_PI;
106    return deg;
107 }
108
109 END_NAMESPACE_HEXA