Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

CoordPointUnknown.h

Go to the documentation of this file.
00001 /* -*- Mode: C++ -*-
00002  * $Id: CoordPointUnknown.h,v 1.7 2002/08/31 14:51:26 s02davro Exp $
00003  *
00004  *
00005  * COPYRIGHT INFORMATION
00006  *
00007  * This file is part of RoboSoc created by Fredrik Heintz <frehe@ida.liu.se>
00008  * Copyright (C) 1999, 2000 Fredrik Heintz, Linköping University, Sweden
00009  *
00010  * You are allowed to modify and use this code as long as you retain this
00011  * notice. If you make any changes or have any comments I would appreciate
00012  * it if you send me a message. For more information, please see
00013  * http://www.ida.liu.se/~frehe/RoboCup/RoboSoc/
00014  *
00015  *
00016  * IDENTIFICATION
00017  *
00018  * Filename: CoordPointUnknown.h
00019  * Unitname: Library
00020  * $Revision: 1.7 $
00021  * Created by: Fredrik Heintz 1999-xx-xx
00022  * Last modified by $Author: s02davro $ $Date: 2002/08/31 14:51:26 $
00023  *
00024  *
00025  * HISTORY
00026  *
00027  * $Log: CoordPointUnknown.h,v $
00028  * Revision 1.7  2002/08/31 14:51:26  s02davro
00029  * Modifications and corrections of point classes.
00030  *
00031  * Revision 1.6  2002/08/02 21:33:56  s02davro
00032  * Added documentation. Restructing.
00033  *
00034  * Revision 1.5  2001/08/29 21:08:28  frehe
00035  * Replaces class T with typename T where T can be a built in type.
00036  *
00037  * Revision 1.4  2000/09/18 15:20:05  frehe
00038  * Due to a problem with namespaces the name for atan2, atan, acos and asin 
00039  * is changed to ATan2, ATan, ASin and ACos.
00040  *
00041  * Revision 1.3  2000/09/04 15:21:49  frehe
00042  * Changed the name of the trigonometric functions to the same as in the 
00043  * standard math library (sin, cos, tan, asin, acos, atan, and atan2).
00044  *
00045  * Revision 1.2  2000/09/01 03:23:52  frehe
00046  * Made minor changes.
00047  *
00048  * Revision 1.1  2000/09/01 01:24:38  frehe
00049  * Importet the current version of RoboSoc (soon to be v2.5.0)
00050  *
00051  *
00052  */
00053 
00066 #ifndef COORDPOINTUNKNOWN_H
00067 #define COORDPOINTUNKNOWN_H
00068 
00069 #include <iostream>
00070 
00071 #include "math_utils.h"
00072 #include "AngleDegrees.h"
00073 #include "WithUnknown.h"
00074 #include "CoordPoint.h"
00075 #include "CoordVector.h"
00076 #include "CoordVectorUnknown.h"
00077 #include "UnknownValueException.h"
00078 #include "rs_throw.h"
00079 
00080 #define POINTUNKNOWN_HEAD std::string("#PointUnknown")
00081 
00082 RS_BEGIN_NAMESPACE
00083 
00084 template<typename T> class CoordVectorUnknown;
00085 
00099 template<typename T> class CoordPointUnknown {
00100 public:
00102   CoordPointUnknown();
00103   
00105   CoordPointUnknown(const T& x, const T& y);
00106 
00108   CoordPointUnknown(const WithUnknown<T>& x, const WithUnknown<T>& y);
00109 
00111   CoordPointUnknown(const CoordPoint<T>& pt);
00112 
00114   CoordPointUnknown(const CoordPointUnknown<T>& pt);
00115 
00118   CoordPointUnknown(const CoordPoint<T>& pt,
00119         const CoordVectorUnknown<T>& vec);
00120   CoordPointUnknown(const CoordPointUnknown<T>& pt,
00121         const CoordVector<T>& vec);
00122   CoordPointUnknown(const CoordPointUnknown<T>& pt,
00123         const CoordVectorUnknown<T>& vec);
00125 
00131   explicit CoordPointUnknown(const CoordVectorUnknown<T>& vec);
00132   explicit CoordPointUnknown(const CoordVector<T>& vec);
00134  
00136   CoordPointUnknown<T>& operator =(const CoordPointUnknown<T>& pt);
00137 
00140   CoordPointUnknown<T> operator- () const;
00141   CoordPointUnknown<T> operator- (const CoordPointUnknown<T>& pt) const;
00142   CoordPointUnknown<T> operator- (const CoordVectorUnknown<T>& vec) const;
00143   CoordPointUnknown<T> operator+ (const CoordPointUnknown<T>& pt) const;
00144   CoordPointUnknown<T> operator+ (const CoordVectorUnknown<T>& vec) const;
00145   CoordPointUnknown<T> operator* (const WithUnknown<T>& val) const;
00146   CoordPointUnknown<T> operator* (const CoordPointUnknown<T>& pt) const;
00147   CoordPointUnknown<T> operator/ (const WithUnknown<T>& val) const;
00148   CoordPointUnknown<T> operator/ (const CoordPointUnknown<T>& pt) const;
00149   CoordPointUnknown<T>& operator-=(const CoordPointUnknown<T>& pt);
00150   CoordPointUnknown<T>& operator-=(const CoordVectorUnknown<T>& vec);
00151   CoordPointUnknown<T>& operator+=(const CoordPointUnknown<T>& pt);
00152   CoordPointUnknown<T>& operator+=(const CoordVectorUnknown<T>& vec);
00153   CoordPointUnknown<T>& operator*=(const WithUnknown<T>& val);
00154   CoordPointUnknown<T>& operator*=(const CoordPointUnknown<T>& pt);
00155   CoordPointUnknown<T>& operator/=(const WithUnknown<T>& val);
00156   CoordPointUnknown<T>& operator/=(const CoordPointUnknown<T>& pt);
00158 
00161   bool operator ! () const;
00162   bool operator ==(const CoordPointUnknown<T>& pt) const;
00163   bool operator !=(const CoordPointUnknown<T>& pt) const;
00165 
00167   CoordPointUnknown<T>& makeUnknown();
00168 
00170   bool isKnown() const;
00171 
00173   bool isUnknown() const;
00174 
00177   CoordPoint<T> getPoint() const throw(UnknownValueException);
00178 
00180   WithUnknown<T> getX() const;
00181 
00183   WithUnknown<T> getY() const;
00184 
00186   CoordPointUnknown<T>& addX(const WithUnknown<T>& pt_x);
00187 
00189   CoordPointUnknown<T>& addY(const WithUnknown<T>& pt_y);
00190 
00192   CoordPointUnknown<T>& addXY(const WithUnknown<T>& pt_x,
00193             const WithUnknown<T>& pt_y);
00194 
00196   CoordPointUnknown<T>& setX(const WithUnknown<T>& pt_x);
00197 
00199   CoordPointUnknown<T>& setY(const WithUnknown<T>& pt_y);
00200 
00202   CoordPointUnknown<T>& set (const WithUnknown<T>& pt_x, 
00203            const WithUnknown<T>& pt_y);
00204   
00207   CoordVectorUnknown<T> getVectorTo(const CoordPointUnknown<T>& pt) const;
00208 
00211   AngleDegreesUnknown<T> getDirectionTo(const CoordPointUnknown<T>& pt) const;
00212 
00215   WithUnknown<T> getDistanceTo(const CoordPointUnknown<T>& pt) const;
00216   
00217 protected:
00219   WithUnknown<T> x;
00220 
00222   WithUnknown<T> y;  
00223 };
00224 
00225 template<typename T>
00226 CoordPointUnknown<T>::CoordPointUnknown() {
00227 }
00228 
00229 template<typename T>
00230 CoordPointUnknown<T>::CoordPointUnknown(const WithUnknown<T>& pt_x, 
00231           const WithUnknown<T>& pt_y)
00232   : x(pt_x),
00233     y(pt_y) {
00234 }
00235 
00236 template<typename T>
00237 CoordPointUnknown<T>::CoordPointUnknown(const T& pt_x, const T& pt_y)
00238   : x(pt_x),
00239     y(pt_y) {
00240 }
00241 
00242 template<typename T>
00243 CoordPointUnknown<T>::CoordPointUnknown(const CoordPoint<T>& pt)
00244   : x(pt.getX()),
00245     y(pt.getY()) {
00246 }
00247 
00248 template<typename T>
00249 CoordPointUnknown<T>::CoordPointUnknown(const CoordPointUnknown<T>& pt)
00250   : x(pt.x),
00251     y(pt.y) {
00252 }
00253 
00254 template<typename T>
00255 CoordPointUnknown<T>::CoordPointUnknown(const CoordPoint<T>& pt, 
00256           const CoordVectorUnknown<T>& v) {
00257   *this = pt + v;
00258 }
00259 
00260 template<typename T>
00261 CoordPointUnknown<T>::CoordPointUnknown(const CoordPointUnknown<T>& pt, 
00262           const CoordVector<T>& v) {
00263   *this = pt + v;
00264 }
00265 
00266 template<typename T>
00267 CoordPointUnknown<T>::CoordPointUnknown(const CoordPointUnknown<T>& pt, 
00268           const CoordVectorUnknown<T>& v) {
00269   *this = pt + v;
00270 }
00271 
00272 template<typename T>
00273 CoordPointUnknown<T>::CoordPointUnknown(const CoordVector<T>& v) {
00274   x = v.getLength() * cos(v.getAngle());
00275   y = v.getLength() * sin(v.getAngle());
00276 }
00277 
00278 template<typename T>
00279 CoordPointUnknown<T>::CoordPointUnknown(const CoordVectorUnknown<T>& v) {
00280   x = v.getLength() * cos(v.getAngle());
00281   y = v.getLength() * sin(v.getAngle());
00282 }
00283 
00284 template<typename T>
00285 CoordPointUnknown<T>& 
00286 CoordPointUnknown<T>::operator =(const CoordPointUnknown<T>& pt) {
00287   if ( this != &pt ) {
00288     y = pt.y;
00289     x = pt.x;
00290   }
00291   return *this;
00292 }
00293 
00294 template<typename T>
00295 inline bool CoordPointUnknown<T>::isKnown() const {
00296   return x.isKnown() && y.isKnown();
00297 }
00298 
00299 template<typename T>
00300 inline bool CoordPointUnknown<T>::isUnknown() const {
00301   return x.isUnknown() && y.isUnknown();
00302 }
00303 
00304 template<typename T>
00305 CoordPointUnknown<T>& CoordPointUnknown<T>::makeUnknown() {
00306   x.makeUnknown();
00307   y.makeUnknown();
00308   return *this;
00309 }
00310 
00311 template <typename T> 
00312 inline CoordPoint<T> 
00313 CoordPointUnknown<T>::getPoint() const throw(UnknownValueException) {
00314   if ( isUnknown() ) {
00315     RS_THROW(UnknownValueException, "Tried to take the value of an unknown point");
00316     return CoordPoint<T>();
00317   } else
00318     return CoordPoint<T>(x.getValue(), y.getValue());
00319 }
00320 
00321 template<typename T>
00322 inline CoordPointUnknown<T>& 
00323 CoordPointUnknown<T>::addX (const WithUnknown<T>& pt_x) {
00324   x += pt_x;
00325   return *this;
00326 }
00327 
00328 template<typename T>
00329 inline CoordPointUnknown<T>& 
00330 CoordPointUnknown<T>::addY (const WithUnknown<T>& pt_y) {
00331   y += pt_y;
00332   return *this;
00333 }
00334 
00335 template<typename T>
00336 inline CoordPointUnknown<T>& 
00337 CoordPointUnknown<T>::addXY (const WithUnknown<T>& pt_x,
00338            const WithUnknown<T>& pt_y) {
00339   x += pt_x;
00340   y += pt_y;
00341   return *this;
00342 }
00343 
00344 template<typename T>
00345 inline WithUnknown<T> CoordPointUnknown<T>::getX() const {
00346   return x;
00347 }
00348 
00349 template<typename T>
00350 inline WithUnknown<T> CoordPointUnknown<T>::getY() const {
00351   return y;
00352 }
00353 
00354 template<typename T>
00355 inline CoordPointUnknown<T>& 
00356 CoordPointUnknown<T>::setX(const WithUnknown<T>& pt_x) {
00357   x = pt_x;
00358   return *this;
00359 }
00360 
00361 template<typename T>
00362 inline CoordPointUnknown<T>& 
00363 CoordPointUnknown<T>::setY(const WithUnknown<T>& pt_y) {
00364   y = pt_y;
00365   return *this;
00366 }
00367 
00368 template<typename T>
00369 inline CoordPointUnknown<T>& 
00370 CoordPointUnknown<T>::set(const WithUnknown<T>& pt_x, 
00371         const WithUnknown<T>& pt_y) {
00372   x = pt_x;
00373   y = pt_y;
00374   return *this;
00375 }
00376 
00377 template<typename T>
00378 AngleDegreesUnknown<T> 
00379 CoordPointUnknown<T>::getDirectionTo(const CoordPointUnknown<T>& pt) const {
00380   if ( pt.isUnknown() )
00381     return AngleDegreesUnknown<T>();
00382   else
00383     return ATan2((pt.y - y), (pt.x - x));
00384 }
00385 
00386 template<typename T>
00387 inline WithUnknown<T> 
00388 CoordPointUnknown<T>::getDistanceTo(const CoordPointUnknown<T>& pt) const {
00389   return sqrt(sqr(pt.x - x) + sqr(pt.y - y));
00390 }
00391 
00392 template<typename T>
00393 CoordVectorUnknown<T> 
00394 CoordPointUnknown<T>::getVectorTo(const CoordPointUnknown<T>& pt) const {
00395   return CoordVectorUnknown<T>(*this, pt);
00396 }
00397 
00398 template<typename T>
00399 inline CoordPointUnknown<T> CoordPointUnknown<T>::operator -() const {
00400   return CoordPointUnknown<T>(-x,-y);
00401 }
00402 
00403 template<typename T>
00404 CoordPointUnknown<T> 
00405 CoordPointUnknown<T>::operator-(const CoordVectorUnknown<T>& v) const {
00406   return *this + CoordPointUnknown<T>(-v);
00407 }
00408 
00409 template<typename T>
00410 inline CoordPointUnknown<T> 
00411 CoordPointUnknown<T>::operator -(const CoordPointUnknown<T>& pt) const {
00412   return CoordPointUnknown<T>(x - pt.x, y - pt.y);
00413 }
00414 
00415 template<typename T>
00416 inline CoordPointUnknown<T> 
00417 CoordPointUnknown<T>::operator +(const CoordPointUnknown<T>& pt) const {
00418   return CoordPointUnknown<T>(x + pt.x, y + pt.y);
00419 }
00420 
00421 template<typename T>
00422 CoordPointUnknown<T> 
00423 CoordPointUnknown<T>::operator+(const CoordVectorUnknown<T>& v) const {
00424   return *this + CoordPointUnknown<T>(v);
00425 }
00426 
00427 template<typename T>
00428 inline CoordPointUnknown<T> 
00429 CoordPointUnknown<T>::operator *(const CoordPointUnknown<T>& pt) const {
00430   return CoordPointUnknown<T>(x * pt.x, y * pt.y);
00431 }
00432 
00433 template<typename T>
00434 inline CoordPointUnknown<T> 
00435 CoordPointUnknown<T>::operator *(const WithUnknown<T>& a) const {
00436   return CoordPointUnknown<T>(x * a, y * a);
00437 }
00438 
00439 template<typename T>
00440 inline CoordPointUnknown<T> 
00441 CoordPointUnknown<T>::operator /(const CoordPointUnknown<T>& pt) const {
00442 #if CHECK_DIVisION_BY_ZERO == 1
00443   if ( pt.x == T(0) ) {
00444     if ( pt.y == T(0) ) {
00445       return CoordPointUnknown_DIVisION_BY_ZERO_RESULT;
00446     } else {
00447       return CoordPointUnknown<T>(T_DIVisION_BY_ZERO_RESULT, y / pt.y);
00448     }
00449   } else {
00450     if ( pt.y == T(0) ) {
00451       return CoordPointUnknown<T>(x / pt.x, T_DIVisION_BY_ZERO_RESULT);
00452     } else {
00453 #endif
00454       return CoordPointUnknown<T>(x / pt.x, y / pt.y);
00455 #if CHECK_DIVisION_BY_ZERO == 1      
00456     }
00457   }
00458 #endif
00459 }
00460 
00461 template<typename T>
00462 inline CoordPointUnknown<T> 
00463 CoordPointUnknown<T>::operator /(const WithUnknown<T>& a) const {
00464 #if CHECK_DIVisION_BY_ZERO == 1
00465   if (a == T(0))
00466     return CoordPointUnknown_DIVisION_BY_ZERO_RESULT;
00467   else
00468 #endif
00469     return CoordPointUnknown<T>(x / a, y / a);
00470 }
00471 
00472 template<typename T>
00473 inline CoordPointUnknown<T>& 
00474 CoordPointUnknown<T>::operator-=(const CoordPointUnknown<T>& pt) {
00475   x -= pt.x;
00476   y -= pt.y;
00477   return *this;
00478 }
00479 
00480 template<typename T>
00481 inline CoordPointUnknown<T>& 
00482 CoordPointUnknown<T>::operator-=(const CoordVectorUnknown<T>& vec) {
00483   *this = *this - vec;
00484   return *this;
00485 }
00486 
00487 template<typename T>
00488 inline CoordPointUnknown<T>& 
00489 CoordPointUnknown<T>::operator+=(const CoordVectorUnknown<T>& vec) {
00490   *this = *this + vec;
00491   return *this;
00492 }
00493 
00494 template<typename T>
00495 inline CoordPointUnknown<T>& 
00496 CoordPointUnknown<T>::operator+=(const CoordPointUnknown<T>& pt) {
00497   x += pt.x;
00498   y += pt.y;
00499   return *this;
00500 }
00501 
00502 template<typename T>
00503 inline CoordPointUnknown<T>& 
00504 CoordPointUnknown<T>::operator*=(const WithUnknown<T>& a) {
00505   x *= a;
00506   y *= a;
00507   return *this;
00508 }
00509 
00510 template<typename T>
00511 inline CoordPointUnknown<T>& 
00512 CoordPointUnknown<T>::operator*=(const CoordPointUnknown<T>& pt) {
00513   x *= pt.x;
00514   y *= pt.y;
00515   return *this;
00516 }
00517 
00518 template<typename T>
00519 CoordPointUnknown<T>& 
00520 CoordPointUnknown<T>::operator/=(const WithUnknown<T>& a) {
00521 #if CHECK_DIVisION_BY_ZERO == 1
00522   if ( a == T(0)) {
00523     x = T_DIVisION_BY_ZERO_RESULT;
00524     y = T_DIVisION_BY_ZERO_RESULT;
00525   } else {
00526 #endif
00527     x /= a;
00528     y /= a;
00529 #if CHECK_DIVisION_BY_ZERO == 1
00530   }
00531 #endif
00532   return *this;
00533 }
00534 
00535 template<typename T>
00536 inline CoordPointUnknown<T>& 
00537 CoordPointUnknown<T>::operator/=(const CoordPointUnknown<T>& pt) {
00538 #if CHECK_DIVisION_BY_ZERO == 1
00539   if ( pt.x == T(0) )
00540     x = T_DIVisION_BY_ZERO_RESULT;
00541   else
00542 #endif
00543     x /= pt.x;
00544   
00545 #if CHECK_DIVisION_BY_ZERO == 1
00546   if ( pt.y == T(0) )
00547     y = T_DIVisION_BY_ZERO_RESULT;
00548   else
00549 #endif
00550     y /= pt.y;
00551 
00552   return *this;
00553 }
00554 
00555 template<typename T>
00556 inline bool CoordPointUnknown<T>::operator !() const {
00557   return (!y) && (!x);
00558 }
00559 
00560 template<typename T>
00561 inline bool 
00562 CoordPointUnknown<T>::operator ==(const CoordPointUnknown<T>& pt) const {
00563   return (y == pt.y) && (x == pt.x);
00564 }
00565 
00566 template<typename T>
00567 inline bool 
00568 CoordPointUnknown<T>::operator !=(const CoordPointUnknown<T>& pt) const {
00569   return (y != pt.y) || (x != pt.x);
00570 }
00571 
00572 
00573 template<typename T>
00574 inline CoordPointUnknown<T> operator -(const CoordPoint<T>& pt1,
00575                const CoordPointUnknown<T>& pt2) {
00576   return (-pt2) + pt1;
00577 }
00578 
00579 
00580 template<typename T>
00581 inline CoordPointUnknown<T> operator +(const CoordPoint<T>& pt1,
00582                const CoordPointUnknown<T>& pt2) {
00583   return pt2 + pt1;
00584 }
00585 
00586 template<typename T>
00587 inline CoordPointUnknown<T> operator *(const T& a,
00588                const CoordPointUnknown<T>& pt) {
00589   return pt * a;
00590 }
00591 
00592 template<typename T>
00593 inline CoordPointUnknown<T> operator *(const WithUnknown<T>& a,
00594                const CoordPointUnknown<T>& pt) {
00595   return pt * a;
00596 }
00597 
00598 template<typename T>
00599 inline CoordPointUnknown<T> operator *(const CoordPoint<T>& pt1,
00600                const CoordPointUnknown<T>& pt2) {
00601   return pt2 * pt1;
00602 }
00603 
00604 
00605 template<typename T>
00606 CoordPointUnknown<T> operator /(const CoordPoint<T>& pt1,
00607         const CoordPointUnknown<T>& pt2) {
00608   if ( pt2.isUnknown() )
00609     return CoordPointUnknown<T>();
00610   else
00611     return pt1 / pt2.getPoint();
00612 }
00613 
00614 template<typename T>
00615 inline bool operator ==(const CoordPoint<T>& pt1,
00616       const CoordPointUnknown<T>& pt2) {
00617   return pt2 == pt1;
00618 }
00619 
00620 template<typename T>
00621 inline bool operator !=(const CoordPoint<T>& pt1,
00622       const CoordPointUnknown<T>& pt2) {
00623   return pt2 != pt1;
00624 }
00625 
00626 template<typename T>
00627 inline const std::string toString(const CoordPointUnknown<T>& pt) {
00628 #ifdef POINTUNKNOWN_HEAD
00629   return POINTUNKNOWN_HEAD + "(" + toString(pt.getX()) + ", " + 
00630     toString(pt.getY()) + ")";
00631 #else
00632   return "(" + toString(pt.getX()) + ", " + toString(pt.getY()) + ")";
00633 #endif
00634 }
00635 
00636 template<typename T>
00637 inline std::ostream& operator<<(std::ostream& os, 
00638         const CoordPointUnknown<T>& pt) {
00639 #ifdef POINTUNKNOWN_HEAD
00640   return os << POINTUNKNOWN_HEAD << "(" << pt.getX() << ", " 
00641       << pt.getY() << ")";
00642 #else
00643   return os << "(" << pt.getX() << ", " << pt.getY() << ")";
00644 #endif
00645 }
00646 
00647 // Extend this to be the point on the line between pt1 and pt2 
00648 // with a certain ratio 1:1 is the middle point?
00649 template<typename T>
00650 inline CoordPointUnknown<T> middlePoint(const CoordPointUnknown<T>& pt1,
00651           const CoordPointUnknown<T>& pt2) {
00652   return pt1 + CoordPointUnknown<T>((pt2.getX() - pt1.getX())/2,
00653             (pt2.getY() - pt1.getY())/2);
00654 }
00655 
00656 
00657 RS_END_NAMESPACE
00658 
00659 
00660 #endif // COORDPOINTUNKNOWN_H

Generated on Mon Aug 29 07:57:55 2011 for RoboSoc by doxygen1.3-rc3