Changeset 241:92f046dd7f6c in lemon
- Timestamp:
- 07/29/08 14:41:16 (16 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/dim2.h
r220 r241 21 21 22 22 #include <iostream> 23 #include <lemon/core.h>24 23 25 24 ///\ingroup misc … … 46 45 /// @{ 47 46 48 /// A simple two dimensional vector (plain vector) implementation49 50 /// A simple two dimensional vector (plain vector) implementation47 /// A simple two dimensional vector (plain vector) implementation 48 49 /// A simple two dimensional vector (plain vector) implementation 51 50 /// with the usual vector operations. 52 51 template<typename T> … … 187 186 } 188 187 189 ///Read a plain vector from a stream190 191 ///Read a plain vector from a stream.188 ///Read a plain vector from a stream 189 190 ///Read a plain vector from a stream. 192 191 ///\relates Point 193 192 /// … … 215 214 } 216 215 217 ///Write a plain vector to a stream218 219 ///Write a plain vector to a stream.216 ///Write a plain vector to a stream 217 218 ///Write a plain vector to a stream. 220 219 ///\relates Point 221 220 /// … … 262 261 263 262 264 /// A class to calculate or store the bounding box of plainvectors.265 266 /// A class to calculate or store the bounding box of plainvectors.267 ///263 /// A class to calculate or store the bounding box of plain vectors. 264 265 /// A class to calculate or store the bounding box of plain vectors. 266 /// 268 267 template<typename T> 269 268 class BoundingBox { 270 Point<T> bottom_left,top_right;269 Point<T> _bottom_left, _top_right; 271 270 bool _empty; 272 271 public: … … 276 275 277 276 ///Construct an instance from one point 278 BoundingBox(Point<T> a) { bottom_left=top_right=a; _empty = false; } 277 BoundingBox(Point<T> a) { 278 _bottom_left = _top_right = a; 279 _empty = false; 280 } 279 281 280 282 ///Construct an instance from two points … … 287 289 BoundingBox(Point<T> a,Point<T> b) 288 290 { 289 bottom_left=a;290 top_right=b;291 _bottom_left = a; 292 _top_right = b; 291 293 _empty = false; 292 294 } … … 303 305 BoundingBox(T l,T b,T r,T t) 304 306 { 305 bottom_left=Point<T>(l,b);306 top_right=Point<T>(r,t);307 _bottom_left=Point<T>(l,b); 308 _top_right=Point<T>(r,t); 307 309 _empty = false; 308 310 } … … 321 323 ///Make the BoundingBox empty 322 324 void clear() { 323 _empty =1;325 _empty = true; 324 326 } 325 327 … … 329 331 ///If the bounding box is empty, then the return value is not defined. 330 332 Point<T> bottomLeft() const { 331 return bottom_left;333 return _bottom_left; 332 334 } 333 335 … … 335 337 336 338 ///Set the bottom left corner of the box. 337 /// It should only be used for non-empty box.339 ///\pre The box must not be empty. 338 340 void bottomLeft(Point<T> p) { 339 bottom_left = p;341 _bottom_left = p; 340 342 } 341 343 … … 345 347 ///If the bounding box is empty, then the return value is not defined. 346 348 Point<T> topRight() const { 347 return top_right;349 return _top_right; 348 350 } 349 351 … … 351 353 352 354 ///Set the top right corner of the box. 353 /// It should only be used for non-empty box.355 ///\pre The box must not be empty. 354 356 void topRight(Point<T> p) { 355 top_right = p;357 _top_right = p; 356 358 } 357 359 … … 361 363 ///If the bounding box is empty, then the return value is not defined. 362 364 Point<T> bottomRight() const { 363 return Point<T>( top_right.x,bottom_left.y);365 return Point<T>(_top_right.x,_bottom_left.y); 364 366 } 365 367 … … 367 369 368 370 ///Set the bottom right corner of the box. 369 /// It should only be used for non-empty box.371 ///\pre The box must not be empty. 370 372 void bottomRight(Point<T> p) { 371 top_right.x = p.x;372 bottom_left.y = p.y;373 _top_right.x = p.x; 374 _bottom_left.y = p.y; 373 375 } 374 376 … … 378 380 ///If the bounding box is empty, then the return value is not defined. 379 381 Point<T> topLeft() const { 380 return Point<T>( bottom_left.x,top_right.y);382 return Point<T>(_bottom_left.x,_top_right.y); 381 383 } 382 384 … … 384 386 385 387 ///Set the top left corner of the box. 386 /// It should only be used for non-empty box.388 ///\pre The box must not be empty. 387 389 void topLeft(Point<T> p) { 388 top_right.y = p.y;389 bottom_left.x = p.x;390 _top_right.y = p.y; 391 _bottom_left.x = p.x; 390 392 } 391 393 … … 395 397 ///If the bounding box is empty, then the return value is not defined. 396 398 T bottom() const { 397 return bottom_left.y;399 return _bottom_left.y; 398 400 } 399 401 … … 401 403 402 404 ///Set the bottom of the box. 403 /// It should only be used for non-empty box.405 ///\pre The box must not be empty. 404 406 void bottom(T t) { 405 bottom_left.y = t;407 _bottom_left.y = t; 406 408 } 407 409 … … 411 413 ///If the bounding box is empty, then the return value is not defined. 412 414 T top() const { 413 return top_right.y;415 return _top_right.y; 414 416 } 415 417 … … 417 419 418 420 ///Set the top of the box. 419 /// It should only be used for non-empty box.421 ///\pre The box must not be empty. 420 422 void top(T t) { 421 top_right.y = t;423 _top_right.y = t; 422 424 } 423 425 … … 427 429 ///If the bounding box is empty, then the return value is not defined. 428 430 T left() const { 429 return bottom_left.x;431 return _bottom_left.x; 430 432 } 431 433 … … 433 435 434 436 ///Set the left side of the box. 435 /// It should only be used for non-empty box.437 ///\pre The box must not be empty. 436 438 void left(T t) { 437 bottom_left.x = t;439 _bottom_left.x = t; 438 440 } 439 441 … … 443 445 ///If the bounding box is empty, then the return value is not defined. 444 446 T right() const { 445 return top_right.x;447 return _top_right.x; 446 448 } 447 449 … … 449 451 450 452 ///Set the right side of the box. 451 /// It should only be used for non-empty box.453 ///\pre The box must not be empty. 452 454 void right(T t) { 453 top_right.x = t;455 _top_right.x = t; 454 456 } 455 457 … … 459 461 ///If the bounding box is empty, then the return value is not defined. 460 462 T height() const { 461 return top_right.y-bottom_left.y;463 return _top_right.y-_bottom_left.y; 462 464 } 463 465 … … 467 469 ///If the bounding box is empty, then the return value is not defined. 468 470 T width() const { 469 return top_right.x-bottom_left.x;471 return _top_right.x-_bottom_left.x; 470 472 } 471 473 … … 474 476 if (_empty) 475 477 return false; 476 else {477 return ( (u.x-bottom_left.x)*(top_right.x-u.x) >= 0 &&478 (u.y-bottom_left.y)*(top_right.y-u.y) >= 0 );478 else { 479 return ( (u.x-_bottom_left.x)*(_top_right.x-u.x) >= 0 && 480 (u.y-_bottom_left.y)*(_top_right.y-u.y) >= 0 ); 479 481 } 480 482 } … … 485 487 /// 486 488 BoundingBox& add(const Point<T>& u){ 487 if (_empty) {488 bottom_left=top_right=u;489 if (_empty) { 490 _bottom_left = _top_right = u; 489 491 _empty = false; 490 492 } 491 else {492 if ( bottom_left.x > u.x)bottom_left.x = u.x;493 if ( bottom_left.y > u.y)bottom_left.y = u.y;494 if ( top_right.x < u.x)top_right.x = u.x;495 if ( top_right.y < u.y)top_right.y = u.y;493 else { 494 if (_bottom_left.x > u.x) _bottom_left.x = u.x; 495 if (_bottom_left.y > u.y) _bottom_left.y = u.y; 496 if (_top_right.x < u.x) _top_right.x = u.x; 497 if (_top_right.y < u.y) _top_right.y = u.y; 496 498 } 497 499 return *this; … … 504 506 BoundingBox& add(const BoundingBox &u){ 505 507 if ( !u.empty() ){ 506 this->add(u.bottomLeft());507 this->add(u.topRight());508 add(u._bottom_left); 509 add(u._top_right); 508 510 } 509 511 return *this; … … 516 518 BoundingBox operator&(const BoundingBox& u) const { 517 519 BoundingBox b; 518 if ( this->_empty || u._empty) {520 if (_empty || u._empty) { 519 521 b._empty = true; 520 522 } else { 521 b. bottom_left.x = std::max(this->bottom_left.x,u.bottom_left.x);522 b. bottom_left.y = std::max(this->bottom_left.y,u.bottom_left.y);523 b. top_right.x = std::min(this->top_right.x,u.top_right.x);524 b. top_right.y = std::min(this->top_right.y,u.top_right.y);525 b._empty = b. bottom_left.x > b.top_right.x ||526 b. bottom_left.y > b.top_right.y;523 b._bottom_left.x = std::max(_bottom_left.x, u._bottom_left.x); 524 b._bottom_left.y = std::max(_bottom_left.y, u._bottom_left.y); 525 b._top_right.x = std::min(_top_right.x, u._top_right.x); 526 b._top_right.y = std::min(_top_right.y, u._top_right.y); 527 b._empty = b._bottom_left.x > b._top_right.x || 528 b._bottom_left.y > b._top_right.y; 527 529 } 528 530 return b;
Note: See TracChangeset
for help on using the changeset viewer.