0022762: Bug in Graphic3d_Vector::IsParallel
[occt.git] / src / Graphic3d / Graphic3d_Vector.cxx
1
2 // File         Graphic3d_Vector.cxx
3 // Created      Fevrier 1992
4 // Author       NW,JPB,CAL
5 // Modified     27/12/98 : FMN ; PERF: OPTIMISATION LOADER (LOPTIM)
6
7 //-Copyright    MatraDatavision 1991,1992
8
9 //-Version      
10
11 //-Design       Declaration des variables specifiques aux vecteurs
12
13 //-Warning      Un vecteur est defini par ses composantes ou par
14 //              deux points
15 //              Il peut etre normalise
16
17 //-References   
18
19 //-Language     C++ 2.0
20
21 //-Declarations
22
23 // for the class
24 #include <Graphic3d_Vector.ixx>
25
26 #include <Standard_Boolean.hxx>
27
28 //-Aliases
29
30 //-Global data definitions
31
32 #define Graphic3d_Vector_MyEpsilon 0.000001
33
34 //      -- les coordonnees du vecteur
35 //      MyX             :       Standard_ShortReal;
36 //      MyY             :       Standard_ShortReal;
37 //      MyZ             :       Standard_ShortReal;
38
39 //      -- la norme du vecteur
40 //      MyNorme         :       Standard_ShortReal;
41
42 //-Constructors
43
44 Graphic3d_Vector::Graphic3d_Vector ():
45 MyX (Standard_ShortReal (1.0)),
46 MyY (Standard_ShortReal (1.0)),
47 MyZ (Standard_ShortReal (1.0)),
48 MyNorme (Standard_ShortReal (1.0)) {
49 }
50
51 Graphic3d_Vector::Graphic3d_Vector (const Standard_Real AX, const Standard_Real AY, const Standard_Real AZ):
52 MyX (Standard_ShortReal (AX)),
53 MyY (Standard_ShortReal (AY)),
54 MyZ (Standard_ShortReal (AZ)),
55 MyNorme (Standard_ShortReal (Graphic3d_Vector::NormeOf (AX, AY, AZ))) {
56 }
57
58 Graphic3d_Vector::Graphic3d_Vector (const Graphic3d_Vertex& APoint1, const Graphic3d_Vertex& APoint2) {
59
60 Standard_Real X1, Y1, Z1;
61 Standard_Real X2, Y2, Z2;
62
63         APoint1.Coord (X1, Y1, Z1);
64         APoint2.Coord (X2, Y2, Z2);
65
66         MyX     = Standard_ShortReal (X2 - X1);
67         MyY     = Standard_ShortReal (Y2 - Y1);
68         MyZ     = Standard_ShortReal (Z2 - Z1);
69
70         MyNorme = Standard_ShortReal (Graphic3d_Vector::NormeOf (X2 - X1, Y2 - Y1, Z2 - Z1));
71
72 }
73
74 //-Destructors
75
76 //-Methods, in order
77
78 void Graphic3d_Vector::Coord (Standard_Real& AX, Standard_Real& AY, Standard_Real& AZ) const {
79
80         AX      = Standard_Real (MyX);
81         AY      = Standard_Real (MyY);
82         AZ      = Standard_Real (MyZ);
83
84 }
85
86 Standard_Real Graphic3d_Vector::X () const {
87
88         return Standard_Real (MyX);
89
90 }
91
92 Standard_Real Graphic3d_Vector::Y () const {
93
94         return Standard_Real (MyY);
95
96 }
97
98 Standard_Real Graphic3d_Vector::Z () const {
99
100         return Standard_Real (MyZ);
101
102 }
103
104 void Graphic3d_Vector::Normalize () {
105
106         if (Abs (MyNorme) <= RealEpsilon ())
107                 Graphic3d_VectorError::Raise ("The norm is null");
108
109         if (!IsNormalized()) // CQO CTS40181
110             {   
111                MyX      = MyX / MyNorme;
112                MyY      = MyY / MyNorme;
113                MyZ      = MyZ / MyNorme;
114             }
115
116         MyNorme = Standard_ShortReal (1.0);
117
118 }
119
120 void Graphic3d_Vector::SetCoord (const Standard_Real Xnew, const Standard_Real Ynew, const Standard_Real Znew) {
121
122         MyX     = Standard_ShortReal (Xnew);
123         MyY     = Standard_ShortReal (Ynew);
124         MyZ     = Standard_ShortReal (Znew);
125
126         MyNorme = Standard_ShortReal (Graphic3d_Vector::NormeOf (Standard_Real (MyX), Standard_Real (MyY), Standard_Real (MyZ)));
127
128 }
129
130 void Graphic3d_Vector::SetXCoord (const Standard_Real Xnew) {
131
132         MyX     = Standard_ShortReal (Xnew);
133
134         MyNorme = Standard_ShortReal (Graphic3d_Vector::NormeOf (Standard_Real (MyX), Standard_Real (MyY), Standard_Real (MyZ)));
135
136 }
137
138 void Graphic3d_Vector::SetYCoord (const Standard_Real Ynew) {
139
140         MyY     = Standard_ShortReal (Ynew);
141
142         MyNorme = Standard_ShortReal (Graphic3d_Vector::NormeOf (Standard_Real (MyX), Standard_Real (MyY), Standard_Real (MyZ)));
143
144 }
145
146 void Graphic3d_Vector::SetZCoord (const Standard_Real Znew) {
147
148         MyZ     = Standard_ShortReal (Znew);
149
150         MyNorme = Standard_ShortReal (Graphic3d_Vector::NormeOf (Standard_Real (MyX), Standard_Real (MyY), Standard_Real (MyZ)));
151
152 }
153
154 Standard_Boolean Graphic3d_Vector::LengthZero () const {
155
156         return (Abs (Standard_Real (MyNorme)) <= RealEpsilon ());
157
158 }
159
160 Standard_Boolean Graphic3d_Vector::IsNormalized () const {
161
162         return (Abs (Standard_Real (MyNorme) - 1.0) <=
163                                 Graphic3d_Vector_MyEpsilon);
164
165 }
166
167 Standard_Boolean Graphic3d_Vector::IsParallel (const Graphic3d_Vector& AV1, const Graphic3d_Vector& AV2) {
168
169   Standard_Real aDif1 = 0, aDif2 = 0, aDif3 = 0;
170
171   aDif1 = AV1.X () * AV2.Y () - AV1.Y () * AV2.X ();
172   aDif2 = AV1.X () * AV2.Z () - AV1.Z () * AV2.X ();
173   aDif3 = AV1.Y () * AV2.Z () - AV1.Z () * AV2.Y ();
174
175   return (  (Abs (aDif1) <= Graphic3d_Vector_MyEpsilon) &&
176             (Abs (aDif2) <= Graphic3d_Vector_MyEpsilon) &&
177             (Abs (aDif3) <= Graphic3d_Vector_MyEpsilon)  );
178 }
179
180 Standard_Real Graphic3d_Vector::NormeOf (const Standard_Real AX, const Standard_Real AY, const Standard_Real AZ) {
181
182         return (Sqrt (AX*AX+AY*AY+AZ*AZ));
183
184 }
185
186 Standard_Real Graphic3d_Vector::NormeOf (const Graphic3d_Vector& AVector) {
187
188 Standard_Real X, Y, Z;
189
190         AVector.Coord(X, Y, Z);
191         return (Graphic3d_Vector::NormeOf (X, Y, Z));
192
193 }