Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's quick Index  

HxVec2Int.h

00001 /*
00002  *  Copyright (c) 1998, University of Amsterdam, The Netherlands.
00003  *  All rights reserved.
00004  *
00005  *
00006  *  Author(s):
00007  *  Dennis Koelma (koelma@wins.uva.nl)
00008  *  Edo Poll (poll@wins.uva.nl)
00009  */
00010 
00011 #ifndef HxVec2Int_h
00012 #define HxVec2Int_h
00013 
00014 #include <cstdlib>
00015 #include "HxIoFwd.h"
00016 #include "HxMath.h"
00017 #include "HxString.h"
00018 
00019 #undef min
00020 #undef max
00021 
00022 #include "HxScalarInt.h"
00023 class HxScalarDouble;
00024 class HxVec2Double;
00025 class HxVec3Int;
00026 class HxVec3Double;
00027 class HxComplex;
00028 
00029 
00033 class L_HXBASIS HxVec2Int {
00034 public:
00035 
00037 
00039                             HxVec2Int();
00040 
00042                             HxVec2Int(int x, int y);
00043                             
00045                             HxVec2Int(const HxVec2Int& v);
00047 
00048     void*                   operator new(size_t, void * = 0);
00049 
00051 
00054     int                     dim() const;
00055     
00057     int                     x() const;
00058     
00060     int                     y() const;
00061 
00063     int                     getValue(int dimension) const; // dimension: 1 or 2
00064     void                    setValue(int dimension, int value); // dimension: 1 or 2
00066 
00068 /** \name Conversion*/
00070                             operator HxScalarInt() const;
00071 
00073                             operator HxScalarDouble() const;
00074 
00076                             operator HxVec2Double() const;
00077 
00079                             operator HxVec3Int() const;
00080 
00082                             operator HxVec3Double() const;
00083 
00085                             operator HxComplex() const;
00087 
00089 
00093     int                     operator==(const HxVec2Int& v) const;
00094 
00096     int                     operator!=(const HxVec2Int& v) const;
00097 
00099     int                     operator< (const HxVec2Int& v) const;
00100 
00102     int                     operator<=(const HxVec2Int& v) const;
00103 
00105     int                     operator> (const HxVec2Int& v) const;
00106 
00108     int                     operator>=(const HxVec2Int& v) const;
00109 
00114     static const HxVec2Int SMALL_VAL;
00115 
00120     static const HxVec2Int LARGE_VAL;
00122 
00124 
00128     HxVec2Int               operator-() const;
00129 
00131     HxVec2Int               complement() const;
00132 
00134     HxVec2Int               abs() const;
00135 
00137     HxVec2Int               ceil() const;
00138 
00140     HxVec2Int               floor() const;
00141 
00143     HxVec2Int               round() const;
00144 
00146     HxScalarInt             sum() const;
00147     
00149     HxScalarInt             product() const;
00150 
00152     HxScalarInt             min() const;
00153 
00155     HxScalarInt             max() const;
00156 
00158     HxScalarInt             norm1() const;
00159 
00161     HxScalarDouble          norm2() const;
00162 
00164     HxScalarInt             normInf() const;
00165 
00167     HxVec2Double            sqrt() const;
00168 
00170     HxVec2Double            sin() const;
00171 
00173     HxVec2Double            cos() const;
00174 
00176     HxVec2Double            tan() const;
00177 
00179     HxVec2Double            asin() const;
00180 
00182     HxVec2Double            acos() const;
00183 
00185     HxVec2Double            atan() const;
00186 
00188     HxScalarDouble          atan2() const;
00189 
00191     HxVec2Double            sinh() const;
00192 
00194     HxVec2Double            cosh() const;
00195 
00197     HxVec2Double            tanh() const;
00198 
00200     HxVec2Double            exp() const;
00201 
00203     HxVec2Double            log() const;
00204 
00206     HxVec2Double            log10() const;
00208 
00210 
00214     HxVec2Int&              operator+=(const HxVec2Int& v);
00215 
00217     HxVec2Int&              operator-=(const HxVec2Int& v);
00218 
00220     HxVec2Int&              operator*=(const HxVec2Int& v);
00221 
00223     HxVec2Int&              operator/=(const HxVec2Int& v);
00224 
00225 
00227     friend HxVec2Int        operator+(const HxVec2Int& v1,
00228                                       const HxVec2Int& v2);
00229 
00231     friend HxVec2Int        operator-(const HxVec2Int& v1,
00232                                       const HxVec2Int& v2);
00233 
00235     friend HxVec2Int        operator*(const HxVec2Int& v1,
00236                                       const HxVec2Int& v2);
00237 
00239     friend HxVec2Int        operator/(const HxVec2Int& v1,
00240                                       const HxVec2Int& v2);
00241 
00242 
00244     HxVec2Int               min(const HxVec2Int& v) const;
00245 
00247     HxVec2Int&              minAssign(const HxVec2Int& v);
00248 
00250     HxVec2Int               max(const HxVec2Int& v) const;
00251 
00253     HxVec2Int&              maxAssign(const HxVec2Int& v);
00254 
00256     HxVec2Int               inf(const HxVec2Int& v) const;
00257 
00259     HxVec2Int&              infAssign(const HxVec2Int& v);
00260 
00262     HxVec2Int               sup(const HxVec2Int& v) const;
00263 
00265     HxVec2Int&              supAssign(const HxVec2Int& v);
00266 
00268     HxVec2Int               pow(const HxVec2Int& v) const;
00269 
00271     HxVec2Int               mod(const HxVec2Int& v) const;
00272 
00274     HxVec2Int               and(const HxVec2Int& v) const;
00275 
00277     HxVec2Int               or(const HxVec2Int& v) const;
00278 
00280     HxVec2Int               xor(const HxVec2Int& v) const;
00281 
00283     HxVec2Int               leftShift(const HxVec2Int& v) const;
00284 
00286     HxVec2Int               rightShift(const HxVec2Int& v) const;
00287 
00289     HxScalarInt             dot(const HxVec2Int& v) const;
00290 
00292     HxVec2Int               cross(const HxVec2Int& v) const;
00294 
00296 
00298     STD_OSTREAM&            put(STD_OSTREAM& os) const;
00299 
00301     HxString                toString() const;
00303 
00304 private:
00305     int                     _values[2];
00306 };
00307 
00308 typedef HxVec2Int (*HxUpoVec2Int)(const HxVec2Int& a);
00309 typedef HxVec2Int (*HxBpoVec2Int)(const HxVec2Int& a1, const HxVec2Int& a2);
00310 
00311 inline STD_OSTREAM&
00312 operator<<(STD_OSTREAM& os, const HxVec2Int v)
00313 {
00314     return v.put(os);
00315 }
00316 
00317 inline
00318 HxVec2Int::HxVec2Int() 
00319 { 
00320 }
00321 
00322 inline
00323 HxVec2Int::HxVec2Int(int x, int y)
00324 {
00325     _values[0] = x;
00326     _values[1] = y;
00327 }
00328 
00329 inline
00330 HxVec2Int::HxVec2Int(const HxVec2Int& v)
00331 {
00332     _values[0] = v._values[0];
00333     _values[1] = v._values[1];
00334 }
00335 
00336 inline void*
00337 HxVec2Int::operator new(size_t size, void *m) 
00338 {
00339     return m ? m : new char[size];
00340 }
00341 
00342 inline int
00343 HxVec2Int::dim() const 
00344 { 
00345     return 2;
00346 }
00347 
00348 inline int
00349 HxVec2Int::x() const 
00350 { 
00351     return _values[0]; 
00352 }
00353 
00354 inline int
00355 HxVec2Int::y() const 
00356 { 
00357     return _values[1]; 
00358 }
00359 
00360 inline int
00361 HxVec2Int::getValue(int dim) const 
00362 { 
00363     return _values[dim - 1]; 
00364 }
00365 
00366 inline void
00367 HxVec2Int::setValue(int dim, int val)
00368 { 
00369     _values[dim - 1] = val; 
00370 }
00371 
00372 inline int
00373 HxVec2Int::operator==(const HxVec2Int& v) const
00374 {
00375     return (_values[0] == v._values[0]) && (_values[1] == v._values[1]);
00376 }
00377 
00378 inline int
00379 HxVec2Int::operator!=(const HxVec2Int& v) const
00380 {
00381     return (_values[0] != v._values[0]) || (_values[1] != v._values[1]);
00382 }
00383 
00384 inline int
00385 HxVec2Int::operator<(const HxVec2Int& v) const
00386 {
00387     return (::abs(_values[0]) + ::abs(_values[1])) < 
00388            (::abs(v._values[0]) + ::abs(v._values[1]));
00389 }
00390 
00391 inline int
00392 HxVec2Int::operator<=(const HxVec2Int& v) const
00393 {
00394     return (::abs(_values[0]) + ::abs(_values[1])) <=
00395            (::abs(v._values[0]) + ::abs(v._values[1]));
00396 }
00397 
00398 inline int
00399 HxVec2Int::operator>(const HxVec2Int& v) const
00400 {
00401     return (::abs(_values[0]) + ::abs(_values[1])) >
00402            (::abs(v._values[0]) + ::abs(v._values[1]));
00403 }
00404 
00405 inline int
00406 HxVec2Int::operator>=(const HxVec2Int& v) const
00407 {
00408     return (::abs(_values[0]) + ::abs(_values[1])) >=
00409            (::abs(v._values[0]) + ::abs(v._values[1]));
00410 }
00411 
00412 inline HxVec2Int
00413 HxVec2Int::operator-() const
00414 {
00415     return HxVec2Int(-_values[0], -_values[1]);
00416 }
00417 
00418 inline HxVec2Int
00419 HxVec2Int::complement() const
00420 {
00421     return HxVec2Int(~_values[0], ~_values[1]);
00422 }
00423 
00424 inline HxVec2Int
00425 HxVec2Int::abs() const
00426 {
00427     return HxVec2Int(::abs(_values[0]), ::abs(_values[1]));
00428 }
00429 
00430 inline HxVec2Int
00431 HxVec2Int::ceil() const
00432 {
00433     return *this;
00434 }
00435 
00436 inline HxVec2Int
00437 HxVec2Int::floor() const
00438 {
00439     return *this;
00440 }
00441 
00442 inline HxVec2Int
00443 HxVec2Int::round() const
00444 {
00445     return *this;
00446 }
00447 
00448 inline HxVec2Int&
00449 HxVec2Int::operator+=(const HxVec2Int& v)
00450 {
00451     _values[0] += v._values[0];
00452     _values[1] += v._values[1];
00453     return *this;
00454 }
00455 
00456 inline HxVec2Int&
00457 HxVec2Int::operator-=(const HxVec2Int& v)
00458 {
00459     _values[0] -= v._values[0];
00460     _values[1] -= v._values[1];
00461     return *this;
00462 }
00463 
00464 inline HxVec2Int&
00465 HxVec2Int::operator*=(const HxVec2Int& v)
00466 {
00467     _values[0] *= v._values[0];
00468     _values[1] *= v._values[1];
00469     return *this;
00470 }
00471 
00472 inline HxVec2Int&
00473 HxVec2Int::operator/=(const HxVec2Int& v)
00474 {
00475     _values[0] /= v._values[0];
00476     _values[1] /= v._values[1];
00477     return *this;
00478 }
00479 
00480 inline HxVec2Int
00481 operator+(const HxVec2Int& v1, const HxVec2Int& v2)
00482 {
00483     return HxVec2Int(v1._values[0] + v2._values[0],
00484                      v1._values[1] + v2._values[1]);
00485 }
00486 
00487 inline HxVec2Int
00488 operator-(const HxVec2Int& v1, const HxVec2Int& v2)
00489 {
00490     return HxVec2Int(v1._values[0] - v2._values[0],
00491                      v1._values[1] - v2._values[1]);
00492 }
00493 
00494 inline HxVec2Int
00495 operator*(const HxVec2Int& v1, const HxVec2Int& v2)
00496 {
00497     return HxVec2Int(v1._values[0] * v2._values[0],
00498                      v1._values[1] * v2._values[1]);
00499 }
00500 
00501 inline HxVec2Int
00502 operator/(const HxVec2Int& v1, const HxVec2Int& v2)
00503 {
00504     return HxVec2Int(v1._values[0] / v2._values[0],
00505                      v1._values[1] / v2._values[1]);
00506 }
00507 
00508 inline HxVec2Int
00509 HxVec2Int::min(const HxVec2Int& v) const
00510 {
00511     return (operator<(v)) ? (*this) : v;
00512 }
00513 
00514 inline HxVec2Int&
00515 HxVec2Int::minAssign(const HxVec2Int& v)
00516 {
00517     if (operator<(v))
00518         return *this;
00519     operator=(v);
00520     return *this;
00521 }
00522 
00523 inline HxVec2Int
00524 HxVec2Int::max(const HxVec2Int& v) const
00525 {
00526     return (operator>(v)) ? (*this) : v;
00527 }
00528 
00529 inline HxVec2Int&
00530 HxVec2Int::maxAssign(const HxVec2Int& v)
00531 {
00532     if (operator>(v))
00533         return *this;
00534     operator=(v);
00535     return *this;
00536 }
00537 
00538 inline HxVec2Int
00539 HxVec2Int::inf(const HxVec2Int& v) const
00540 {
00541     return HxVec2Int((_values[0] < v._values[0]) ? _values[0] : v._values[0],
00542                      (_values[1] < v._values[1]) ? _values[1] : v._values[1]);
00543 }
00544 
00545 inline HxVec2Int&
00546 HxVec2Int::infAssign(const HxVec2Int& v)
00547 {
00548     _values[0] = (_values[0] < v._values[0]) ? _values[0] : v._values[0];
00549     _values[1] = (_values[1] < v._values[1]) ? _values[1] : v._values[1];
00550     return *this;
00551 }
00552 
00553 inline HxVec2Int
00554 HxVec2Int::sup(const HxVec2Int& v) const
00555 {
00556     return HxVec2Int((_values[0] > v._values[0]) ? _values[0] : v._values[0],
00557                      (_values[1] > v._values[1]) ? _values[1] : v._values[1]);
00558 }
00559 
00560 inline HxVec2Int&
00561 HxVec2Int::supAssign(const HxVec2Int& v)
00562 {
00563     _values[0] = (_values[0] > v._values[0]) ? _values[0] : v._values[0];
00564     _values[1] = (_values[1] > v._values[1]) ? _values[1] : v._values[1];
00565     return *this;
00566 }
00567 
00568 inline HxVec2Int
00569 HxVec2Int::pow(const HxVec2Int& v) const
00570 {
00571     return HxVec2Int((int) (::pow(_values[0], v._values[0]) + 0.5),
00572                      (int) (::pow(_values[1], v._values[1]) + 0.5));
00573 }
00574 
00575 inline HxVec2Int
00576 HxVec2Int::mod(const HxVec2Int& v) const
00577 {
00578     return HxVec2Int(_values[0] % v._values[0],
00579                      _values[1] % v._values[1]);
00580 }
00581 
00582 inline HxVec2Int
00583 HxVec2Int::and(const HxVec2Int& v) const
00584 {
00585     return HxVec2Int(_values[0] & v._values[0],
00586                      _values[1] & v._values[1]);
00587 }
00588 
00589 inline HxVec2Int
00590 HxVec2Int::or(const HxVec2Int& v) const
00591 {
00592     return HxVec2Int(_values[0] | v._values[0],
00593                      _values[1] | v._values[1]);
00594 }
00595 
00596 inline HxVec2Int
00597 HxVec2Int::xor(const HxVec2Int& v) const
00598 {
00599     return HxVec2Int(_values[0] ^ v._values[0],
00600                      _values[1] ^ v._values[1]);
00601 }
00602 
00603 inline HxVec2Int
00604 HxVec2Int::leftShift(const HxVec2Int& v) const
00605 {
00606     return HxVec2Int(_values[0] << v._values[0],
00607                      _values[1] << v._values[1]);
00608 }
00609 
00610 inline HxVec2Int
00611 HxVec2Int::rightShift(const HxVec2Int& v) const
00612 {
00613     return HxVec2Int(_values[0] >> v._values[0],
00614                      _values[1] >> v._values[1]);
00615 }
00616 
00617 inline HxVec2Int
00618 HxVec2Int::cross(const HxVec2Int&) const
00619 {
00620     return HxVec2Int(0, 0);
00621 }
00622 
00623 inline HxScalarInt
00624 HxVec2Int::sum() const
00625 {
00626     return _values[0] + _values[1];
00627 }
00628 
00629 inline HxScalarInt
00630 HxVec2Int::product() const
00631 {
00632     return _values[0] * _values[1];
00633 }
00634 
00635 inline HxScalarInt
00636 HxVec2Int::min() const
00637 {
00638     return (_values[0] < _values[1]) ? _values[0] : _values[1];
00639 }
00640 
00641 inline HxScalarInt
00642 HxVec2Int::max() const
00643 {
00644     return (_values[0] > _values[1]) ? _values[0] : _values[1];
00645 }
00646 
00647 #endif

Generated on Tue Feb 3 14:18:44 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001