Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

_QGAR_GenArc.TCC

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------+
00002  | Library QgarLib, graphics analysis and recognition                  |
00003  | Copyright (C) 2002  Qgar Project, LORIA                             |
00004  |                                                                     |
00005  | This library is free software; you can redistribute it and/or       |
00006  | modify it under the terms of the GNU Lesser General Public          |
00007  | License version 2.1, as published by the Free Software Foundation.  |
00008  |                                                                     |
00009  | This library is distributed in the hope that it will be useful,     |
00010  | but WITHOUT ANY WARRANTY; without even the implied warranty of      |
00011  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                |
00012  | See the GNU Lesser General Public License for more details.         |
00013  |                                                                     |
00014  | The GNU Lesser General Public License is included in the file       |
00015  | LICENSE.LGPL, in the root directory of the Qgar packaging. See      |
00016  | http://www.gnu.org/licenses/lgpl.html for the terms of the licence. |
00017  | To receive a paper copy, write to the Free Software Foundation,     |
00018  | Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.       |
00019  |                                                                     |
00020  | Contact Project Qgar for any information:                           |
00021  |   LORIA - équipe Qgar                                               |
00022  |   B.P. 239, 54506 Vandoeuvre-lès-Nancy Cedex, France                |
00023  |   email: qgar-contact@loria.fr                                      |
00024  |   http://www.qgar.org/                                              |
00025  *---------------------------------------------------------------------*/
00026 
00027 
00028 /**
00029  * @file   _QGAR_GenArc.TCC
00030  * @brief  Implementation of function members of class qgar::GenArc.
00031  *
00032  * @author <a href="mailto:qgar-develop@loria.fr?subject=Qgar fwd Gérald Masini">Gérald Masini</a>
00033  * @date    January 28, 2005  15:51
00034  * @since   Qgar 2.2
00035  */
00036 
00037 
00038 
00039 // STD
00040 #include <iostream>
00041 // QGAR
00042 #include <qgarlib/ISerializable.H>
00043 
00044 
00045 
00046 namespace qgar
00047 {
00048 
00049 
00050 // -------------------------------------------------------------------
00051 // C O N S T R U C T O R S
00052 // -------------------------------------------------------------------
00053 
00054 
00055 // DEFAULT CONSTRUCTOR
00056 
00057 template <class T>
00058 GenArc<T>::GenArc()
00059 
00060   : AbstractGenPrimitive<T>(0, 0, 0, 0),
00061     _center(0, 0)
00062 
00063 {
00064   // VOID
00065 }
00066 
00067 
00068 // COPY CONSTRUCTOR
00069 
00070 template <class T>
00071 GenArc<T>::GenArc(const GenArc<T>& anArc)
00072 
00073   : AbstractGenPrimitive<T>(anArc._source, anArc._target),
00074     _center(anArc._center)
00075 
00076 {
00077   // VOID
00078 }
00079 
00080 
00081 // INITIALIZE FROM A QGAR ARC
00082 
00083 template <class T>
00084 GenArc<T>::GenArc(const GenQgarArc<T>& aQArc)
00085 
00086   : AbstractGenPrimitive<T>(aQArc.accessSource(), aQArc.accessTarget()),
00087     _center(aQArc.accessCenter())
00088 
00089 {
00090   // VOID
00091 }
00092 
00093 
00094 // INITIALIZE FROM THREE POINTS
00095 
00096 template <class T>
00097 GenArc<T>::GenArc(const GenPoint<T>& aSource,
00098                   const GenPoint<T>& aTarget,
00099                   const GenPoint<T>& aCenter)
00100 
00101   : AbstractGenPrimitive<T>(aSource, aTarget),
00102     _center(aCenter)
00103 
00104 {
00105   // VOID
00106 }
00107 
00108 
00109 // -------------------------------------------------------------------
00110 // D E S T R U C T O R 
00111 // -------------------------------------------------------------------
00112 
00113 
00114 template <class T>
00115 GenArc<T>::~GenArc()
00116 {
00117   // VOID
00118 }
00119 
00120 
00121 // -------------------------------------------------------------------
00122 // C O P Y
00123 // -------------------------------------------------------------------
00124 
00125 
00126 template <class T> 
00127 GenArc<T>*
00128 GenArc<T>::clone() const
00129 {
00130   return new GenArc<T>(*this);
00131 }
00132 
00133 
00134 // -------------------------------------------------------------------
00135 // ACCESS TO GEOMETRICAL CHARACTERISTICS
00136 // -------------------------------------------------------------------
00137 
00138 
00139 // GET THE RADIUS
00140 
00141 template <class T>
00142 inline double
00143 GenArc<T>::radius() const
00144 {
00145   return qgDist(this->_source, this->_center);
00146 }
00147 
00148 
00149 // GET LENGTH OF THE ARC
00150 
00151 template <class T>
00152 double
00153 GenArc<T>::length() const
00154 {
00155   return std::fabs(this->radius() * angle());
00156 }
00157 
00158 
00159 // GET THE ANGLE OF THE ARC, IN [0, 2PI] RADIANS
00160 
00161 template <class T>
00162 double
00163 GenArc<T>::angle() const
00164 {
00165   double s = this->sourceAngle();
00166   double t = this->targetAngle();
00167 
00168   if(t > s)
00169     {
00170       return t - s;
00171     }
00172   else
00173     {
00174       return t - s + Math::QG_2PI;
00175     }
00176 }
00177 
00178 
00179 // GET THE ANGLE OF THE ARC, IN [0, 360] DEGREES
00180 
00181 template <class T>
00182 double
00183 GenArc<T>::angleDegrees() const
00184 {
00185   return qgRadiansToDegrees(angle());
00186 }
00187 
00188 
00189 // GET THE SOURCE ANGLE: ANGLE BETWEEN THE VECTOR JOINING THE CENTER
00190 // TO THE SOURCE POINT AND THE X AXIS, IN [0, 2PI] RADIANS
00191 
00192 template <class T>
00193 inline double
00194 GenArc<T>::sourceAngle() const
00195 {
00196   return qgAngle(this->_center, this->_source);
00197 }
00198 
00199 
00200 // Get the source angle in [0, 360[ degrees
00201 
00202 template <class T>
00203 inline double
00204  GenArc<T>::sourceAngleDegrees() const
00205 {
00206   return qgRadiansToDegrees(this->sourceAngle());
00207 }
00208 
00209 
00210 // GET THE TARGET ANGLE: ANGLE BETWEEN THE VECTOR JOINING THE CENTER
00211 // TO THE TARGET POINT AND THE X AXIS, IN [0, 2PI] RADIANS
00212 
00213 template <class T>
00214 inline double
00215 GenArc<T>::targetAngle() const
00216 {
00217   return qgAngle(this->_center, this->_target);
00218 }
00219 
00220  
00221 // Get the target angle in [0, 360[ degrees
00222 
00223 template <class T>
00224 inline double
00225 GenArc<T>::targetAngleDegrees() const
00226 {
00227   return qgRadiansToDegrees(this->targetAngle());
00228 }
00229 
00230 
00231 // -------------------------------------------------------------------
00232 // C E N T E R
00233 // -------------------------------------------------------------------
00234 
00235 
00236 // GET CENTER POINT
00237 
00238 template <class T>
00239 inline const GenPoint<T>&
00240 GenArc<T>::accessCenter() const
00241 {
00242   return this->_center;
00243 }
00244 
00245 
00246 // GET A COPY OF THE CENTER POINT
00247 
00248 template <class T>
00249 inline GenPoint<T>
00250 GenArc<T>::center() const
00251 {
00252   return this->_center;
00253 }
00254 
00255 
00256 // GET X COORDINATE OF CENTER POINT
00257 
00258 template <class T>
00259 inline T
00260 GenArc<T>::xCenter() const
00261 {
00262   return (this->_center).x();
00263 }
00264 
00265 
00266 // GET Y COORDINATE OF CENTER POINT
00267 
00268 template <class T>
00269 inline T
00270 GenArc<T>::yCenter() const
00271 {
00272   return (this->_center).y();
00273 }
00274 
00275 
00276 // SET X COORDINATE OF THE CENTER POINT
00277 
00278 
00279 template <class T>
00280 inline void
00281 GenArc<T>::setXCenter(T aX)
00282 {
00283   (this->_center).setX(aX);
00284 }
00285 
00286 
00287 // SET Y COORDINATE OF THE CENTER POINT
00288 
00289 
00290 template <class T>
00291 inline void
00292 GenArc<T>::setYCenter(T aY)
00293 {
00294   (this->_center).setY(aY);
00295 }
00296 
00297 
00298 // SET THE CENTER POINT
00299 
00300 template <class T>
00301 inline void
00302 GenArc<T>::setCenter(T aX, T aY)
00303 {
00304   (this->_center).setXY(aX,aY);
00305 }
00306 
00307 
00308 // SET THE CENTER POINT
00309 
00310 template <class T>
00311 inline void
00312 GenArc<T>::setCenter(const GenPoint<T>& aCenter)
00313 {
00314   (this->_center) = aCenter;
00315 }
00316 
00317 
00318 // -------------------------------------------------------------------
00319 // O P E R A T O R S 
00320 // -------------------------------------------------------------------
00321 
00322 
00323 template <class T>
00324 GenArc<T>&
00325 GenArc<T>::operator=(const GenArc<T>& anArc)
00326 {
00327   // Are left hand side and right hand side different objects?
00328   if (this != &anArc)
00329     {
00330       AbstractGenPrimitive<T>::operator=(anArc);
00331       this->_center = anArc._center;
00332     }
00333 
00334   return *this;
00335 }
00336 
00337 
00338 // SAME AS FUNCTION qgar::GenArc::eq
00339 
00340 template <class T>
00341 inline bool
00342 GenArc<T>::operator==(const GenArc<T>& anArc) const
00343 {
00344   return eq(anArc);
00345 }
00346 
00347 
00348 // SAME AS FUNCTION qgar::GenArc::notEq
00349 
00350 template <class T>
00351 inline bool
00352 GenArc<T>::operator!=(const GenArc<T>& anArc) const
00353 {
00354   return notEq(anArc);
00355 }
00356   
00357 
00358 // -------------------------------------------------------------------
00359 // F U N C T I O N A L   O P E R A T O R S 
00360 // -------------------------------------------------------------------
00361 
00362 
00363 // EQUALITY
00364 
00365 template <class T>
00366 bool
00367 GenArc<T>::eq(const GenArc<T>& anArc) const
00368 {
00369   return
00370        (this->_source == anArc._source) 
00371     && (this->_target == anArc._target)
00372     && (this->_center == anArc._center);
00373 }
00374 
00375 
00376 // INEQUALITY
00377 
00378 template <class T>
00379 bool
00380 GenArc<T>::notEq(const GenArc<T>& anArc) const
00381 {
00382   return
00383        (this->_source != anArc._source) 
00384     || (this->_target != anArc._target)
00385     || (this->_center != anArc._center);
00386 }
00387 
00388 
00389 // -------------------------------------------------------------------
00390 // S E R I A L I Z A T I O N / D E S E R I A L I Z A T I O N
00391 // -------------------------------------------------------------------
00392 
00393 
00394 template <class T>
00395 std::istream& 
00396 GenArc<T>::read(std::istream& anInStream)
00397 {
00398   qgReadObjName(anInStream, "Arc");
00399 
00400   qgReadObjData(anInStream, this->_source);
00401   qgReadObjData(anInStream, this->_target);
00402   qgReadObjData(anInStream, this->_center);
00403 
00404   return anInStream;
00405 }
00406 
00407 
00408 template <class T>
00409 std::ostream& 
00410 GenArc<T>::write(std::ostream& anOutStream) const
00411 {
00412   anOutStream << "Arc("
00413               << this->source()
00414               << ")("
00415               << this->target()
00416               << ")("
00417               << this->center()
00418               << ')';
00419   return anOutStream;
00420 }
00421 
00422 
00423 // VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
00424 // V                                                                 V
00425 // V            IMPLEMENTATION OF PURE VIRTUAL FUNCTIONS             V
00426 // V               INHERITED FROM AbstractGenPrimitive               V
00427 // V                                                                 V
00428 // VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
00429 
00430 
00431 // -------------------------------------------------------------------
00432 // G E O M E T R I C A L   S T R U C T U R E   U P D A T E S
00433 // -------------------------------------------------------------------
00434 
00435 
00436 // THE SOURCE HAS BEEN CHANGED
00437 
00438 template <class T>
00439 void
00440 GenArc<T>::updateSource()
00441 {
00442   // NOTHING TO DO
00443 }
00444 
00445 
00446 // THE TARGET HAS BEEN CHANGED
00447 
00448 template <class T>
00449 void
00450 GenArc<T>::updateTarget()
00451 {
00452   // NOTHING TO DO
00453 }
00454 
00455 
00456 // BOTH SOURCE AND TARGET HAVE BEEN CHANGED
00457 
00458 template <class T>
00459 void
00460 GenArc<T>::updateSourceTarget()
00461 {
00462   // NOTHING TO DO
00463 }
00464 
00465 
00466 // -------------------------------------------------------------------
00467 // G E O M E T R Y :   T R A N S L A T I O N 
00468 // -------------------------------------------------------------------
00469 
00470 
00471 template <class T>
00472 inline void
00473 GenArc<T>::translate(T aTransX, T aTransY)
00474 {
00475   this->setSourceTarget(this->xSource() + aTransX,
00476                         this->ySource() + aTransY,
00477                         this->xTarget() + aTransX,
00478                         this->yTarget() + aTransY);
00479 
00480   this->setCenter(_center.x() + aTransX, _center.y() + aTransY);
00481 }
00482 
00483 
00484 // VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
00485 // V                                                                 V
00486 // VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
00487 
00488 
00489 } // namespace qgar