| ... | ... |
@@ -512,48 +512,89 @@ |
| 512 | 512 |
} |
| 513 | 513 |
|
| 514 | 514 |
///Intersection of two bounding boxes |
| 515 | 515 |
|
| 516 | 516 |
///Intersection of two bounding boxes. |
| 517 | 517 |
/// |
| 518 | 518 |
BoundingBox operator&(const BoundingBox& u) const {
|
| 519 | 519 |
BoundingBox b; |
| 520 | 520 |
if (_empty || u._empty) {
|
| 521 | 521 |
b._empty = true; |
| 522 | 522 |
} else {
|
| 523 | 523 |
b._bottom_left.x = std::max(_bottom_left.x, u._bottom_left.x); |
| 524 | 524 |
b._bottom_left.y = std::max(_bottom_left.y, u._bottom_left.y); |
| 525 | 525 |
b._top_right.x = std::min(_top_right.x, u._top_right.x); |
| 526 | 526 |
b._top_right.y = std::min(_top_right.y, u._top_right.y); |
| 527 | 527 |
b._empty = b._bottom_left.x > b._top_right.x || |
| 528 | 528 |
b._bottom_left.y > b._top_right.y; |
| 529 | 529 |
} |
| 530 | 530 |
return b; |
| 531 | 531 |
} |
| 532 | 532 |
|
| 533 | 533 |
};//class Boundingbox |
| 534 | 534 |
|
| 535 | 535 |
|
| 536 |
///Read a bounding box from a stream |
|
| 537 |
|
|
| 538 |
///Read a bounding box from a stream. |
|
| 539 |
///\relates BoundingBox |
|
| 540 |
template<typename T> |
|
| 541 |
inline std::istream& operator>>(std::istream &is, BoundingBox<T>& b) {
|
|
| 542 |
char c; |
|
| 543 |
Point<T> p; |
|
| 544 |
if (is >> c) {
|
|
| 545 |
if (c != '(') is.putback(c);
|
|
| 546 |
} else {
|
|
| 547 |
is.clear(); |
|
| 548 |
} |
|
| 549 |
if (!(is >> p)) return is; |
|
| 550 |
b.bottomLeft(p); |
|
| 551 |
if (is >> c) {
|
|
| 552 |
if (c != ',') is.putback(c); |
|
| 553 |
} else {
|
|
| 554 |
is.clear(); |
|
| 555 |
} |
|
| 556 |
if (!(is >> p)) return is; |
|
| 557 |
b.topRight(p); |
|
| 558 |
if (is >> c) {
|
|
| 559 |
if (c != ')') is.putback(c); |
|
| 560 |
} else {
|
|
| 561 |
is.clear(); |
|
| 562 |
} |
|
| 563 |
return is; |
|
| 564 |
} |
|
| 565 |
|
|
| 566 |
///Write a bounding box to a stream |
|
| 567 |
|
|
| 568 |
///Write a bounding box to a stream. |
|
| 569 |
///\relates BoundingBox |
|
| 570 |
template<typename T> |
|
| 571 |
inline std::ostream& operator<<(std::ostream &os, const BoundingBox<T>& b) |
|
| 572 |
{
|
|
| 573 |
os << "(" << b.bottomLeft() << "," << b.topRight() << ")";
|
|
| 574 |
return os; |
|
| 575 |
} |
|
| 576 |
|
|
| 536 | 577 |
///Map of x-coordinates of a \ref Point "Point"-map |
| 537 | 578 |
|
| 538 | 579 |
///\ingroup maps |
| 539 | 580 |
///Map of x-coordinates of a \ref Point "Point"-map. |
| 540 | 581 |
/// |
| 541 | 582 |
template<class M> |
| 542 | 583 |
class XMap |
| 543 | 584 |
{
|
| 544 | 585 |
M& _map; |
| 545 | 586 |
public: |
| 546 | 587 |
|
| 547 | 588 |
typedef typename M::Value::Value Value; |
| 548 | 589 |
typedef typename M::Key Key; |
| 549 | 590 |
///\e |
| 550 | 591 |
XMap(M& map) : _map(map) {}
|
| 551 | 592 |
Value operator[](Key k) const {return _map[k].x;}
|
| 552 | 593 |
void set(Key k,Value v) {_map.set(k,typename M::Value(v,_map[k].y));}
|
| 553 | 594 |
}; |
| 554 | 595 |
|
| 555 | 596 |
///Returns an \ref XMap class |
| 556 | 597 |
|
| 557 | 598 |
///This function just returns an \ref XMap class. |
| 558 | 599 |
/// |
| 559 | 600 |
///\ingroup maps |
0 comments (0 inline)