00001
00002
00003
00004
00005
00006
00007
00008
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;
00064 void setValue(int dimension, int value);
00066
00068
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