Moka kernel
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
vertex.icc
Go to the documentation of this file.
1 /*
2  * lib-gmapkernel : Un noyau de 3-G-cartes et des opérations.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of lib-gmapkernel
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 //******************************************************************************
25 #include <cassert>
26 #include <cmath>
27 //******************************************************************************
28 INLINE
30 {
31  setXYZ(0,0,0);
32 }
33 //******************************************************************************
34 INLINE
36 {
37  setXYZ(Ax,Ay,Az);
38 }
39 //******************************************************************************
40 INLINE
42 {
43  setXYZ(ATab[0],ATab[1],ATab[2]);
44 }
45 //******************************************************************************
46 INLINE
47 CVertex::CVertex(const CVertex& AVector)
48 {
49  setXYZ(AVector.getX(), AVector.getY(), AVector.getZ());
50 }
51 //******************************************************************************
52 INLINE
54 {
55  return FCoord[0];
56 }
57 //******************************************************************************
58 INLINE
60 {
61  return FCoord[1];
62 }
63 //******************************************************************************
64 INLINE
66 {
67  return FCoord[2];
68 }
69 //******************************************************************************
70 INLINE
72 {
73  assert(0<=ADim && ADim<=2);
74  return FCoord[ADim];
75 }
76 //******************************************************************************
77 INLINE
79 {
80  FCoord[0] = ANewX;
81 }
82 //******************************************************************************
83 INLINE
85 {
86  FCoord[1] = ANewY;
87 }
88 //******************************************************************************
89 INLINE
91 {
92  FCoord[2] = ANewZ;
93 }
94 //******************************************************************************
95 INLINE
96 void CVertex::setCoord(int ADim, TCoordinate ANewCoord)
97 {
98  assert(0<=ADim && ADim<=2);
99  FCoord[ADim] = ANewCoord;
100 }
101 //******************************************************************************
102 INLINE
104 {
105  setX(ANewX);
106  setY(ANewY);
107  setZ(ANewZ);
108 }
109 //******************************************************************************
110 INLINE
112 {
113  setXYZ(AVector.getX(), AVector.getY(), AVector.getZ());
114  return *this;
115 }
116 //******************************************************************************
117 INLINE
118 bool CVertex::operator==(const CVertex& AVector) const
119 {
120  return
121  isZero(this->getX() - AVector.getX()) &&
122  isZero(this->getY() - AVector.getY()) &&
123  isZero(this->getZ() - AVector.getZ());
124 }
125 //******************************************************************************
126 INLINE
127 bool CVertex::operator!=(const CVertex& AVector) const
128 {
129  return ! (*this == AVector);
130 }
131 //******************************************************************************
132 INLINE
134 {
135  *this= *this + AVector;
136  return *this;
137 }
138 //******************************************************************************
139 INLINE
141 {
142  return *this= *this - AVector;
143 }
144 //******************************************************************************
145 INLINE
147 {
148  return CVertex(getX()*ACoef, getY()*ACoef, getZ()*ACoef);
149 }
150 //******************************************************************************
151 INLINE
153 {
154  assert(!isZero(ACoef));
155  return CVertex(getX()/ACoef, getY()/ACoef, getZ()/ACoef);
156 }
157 //******************************************************************************
158 INLINE
160 {
161  return *this = *this * ACoef;
162 }
163 //******************************************************************************
164 INLINE
166 {
167  return *this = *this / ACoef;
168 }
169 //******************************************************************************
170 INLINE
171 CVertex CVertex::operator+(const CVertex& AVector) const
172 {
173  return CVertex(getX() + AVector.getX(),
174  getY() + AVector.getY(),
175  getZ() + AVector.getZ());
176 }
177 //******************************************************************************
178 INLINE
179 CVertex CVertex::operator-(const CVertex& AVector) const
180 {
181  return CVertex(getX() - AVector.getX(),
182  getY() - AVector.getY(),
183  getZ() - AVector.getZ());
184 }
185 //******************************************************************************
186 INLINE
188 {
189  return *this;
190 }
191 //******************************************************************************
192 INLINE
194 {
195  return CVertex(-getX(),-getY(),-getZ());
196 }
197 //******************************************************************************
198 INLINE
199 CVertex CVertex::operator*(const CVertex& AVector) const
200 {
201  return CVertex(getY()*AVector.getZ() - AVector.getY()*getZ(),
202  getZ()*AVector.getX() - AVector.getZ()*getX(),
203  getX()*AVector.getY() - AVector.getX()*getY());
204 }
205 //******************************************************************************
206 INLINE
207 CVertex CVertex::multiply(const CVertex& AVector) const
208 {
209  return CVertex(getX()*AVector.getX(),
210  getY()*AVector.getY(),
211  getZ()*AVector.getZ());
212 }
213 //******************************************************************************
214 INLINE
215 CVertex CVertex::divide(const CVertex& AVector) const
216 {
217  assert(!isZero(AVector.getX()));
218  assert(!isZero(AVector.getY()));
219  assert(!isZero(AVector.getZ()));
220 
221  return CVertex(getX()/AVector.getX(),
222  getY()/AVector.getY(),
223  getZ()/AVector.getZ());
224 }
225 //******************************************************************************
226 INLINE
227 TCoordinate CVertex::dot(const CVertex& AVector) const
228 {
229  return
230  getX()*AVector.getX() +
231  getY()*AVector.getY() +
232  getZ()*AVector.getZ();
233 }
234 //******************************************************************************
235 INLINE
236 bool CVertex::isNull() const
237 {
238  return
239  isZero(getX()) &&
240  isZero(getY()) &&
241  isZero(getZ());
242 }
243 //******************************************************************************
244 INLINE
246 {
247  return sqrt(sqrNorm());
248 }
249 //******************************************************************************
250 INLINE
252 {
253  TCoordinate n = norm();
254  if (! isNull()) *this /= n;
255  return n;
256 }
257 //******************************************************************************
258 INLINE
260 {
261  CVertex result(*this);
262  result.normalize();
263  return result;
264 }
265 //******************************************************************************
266 INLINE
268 {
269  return sqr(getX()) + sqr(getY()) + sqr(getZ());
270 }
271 //******************************************************************************
272 INLINE
273 CVertex operator*(TCoordinate ACoef, const CVertex& AVertex)
274 {
275  return AVertex*ACoef;
276 }
277 //******************************************************************************
278 INLINE
279 std::ostream& operator<<(std::ostream& AStream, const CVertex& AVertex)
280 {
281  AStream << "(";
282  AStream << "x="; AStream << AVertex.getX() << "\t";
283  // AStream.form("% .5f", AVertex.getX());
284  AStream << ",";
285  AStream << "y="; AStream << AVertex.getY() << "\t";
286  // AStream.form("% .5f", AVertex.getY());
287  AStream << ",";
288  AStream << "z="; AStream << AVertex.getZ() << "\t";
289  // AStream.form("% .5f", AVertex.getZ());
290  AStream << ")";
291 
292  return AStream;
293 }
294 //******************************************************************************