00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
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
00648
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