gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 5 0
merge default
0 files changed with 115 insertions and 65 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -1259,12 +1259,17 @@
1259 1259
  /// with visitor interface.
1260 1260
  ///
1261 1261
  /// The %BfsVisit class provides an alternative interface to the Bfs
1262 1262
  /// class. It works with callback mechanism, the BfsVisit object calls
1263 1263
  /// the member functions of the \c Visitor class on every BFS event.
1264 1264
  ///
1265
  /// This interface of the BFS algorithm should be used in special cases
1266
  /// when extra actions have to be performed in connection with certain
1267
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1268
  /// instead.
1269
  ///
1265 1270
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1266 1271
  /// The default value is
1267 1272
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1268 1273
  /// \ref BfsVisit, it is only passed to \ref BfsVisitDefaultTraits.
1269 1274
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1270 1275
  /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty visitor, which
Ignore white space 12 line context
... ...
@@ -1206,12 +1206,17 @@
1206 1206
  /// with visitor interface.
1207 1207
  ///
1208 1208
  /// The %DfsVisit class provides an alternative interface to the Dfs
1209 1209
  /// class. It works with callback mechanism, the DfsVisit object calls
1210 1210
  /// the member functions of the \c Visitor class on every DFS event.
1211 1211
  ///
1212
  /// This interface of the DFS algorithm should be used in special cases
1213
  /// when extra actions have to be performed in connection with certain
1214
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1215
  /// instead.
1216
  ///
1212 1217
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1213 1218
  /// The default value is
1214 1219
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1215 1220
  /// \ref DfsVisit, it is only passed to \ref DfsVisitDefaultTraits.
1216 1221
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1217 1222
  /// \ref DfsVisitor "DfsVisitor<_Digraph>" is an empty visitor, which
Ignore white space 6 line context
... ...
@@ -25,14 +25,13 @@
25 25
///\file
26 26
///\brief A simple two dimensional vector and a bounding box implementation
27 27
///
28 28
/// The class \ref lemon::dim2::Point "dim2::Point" implements
29 29
/// a two dimensional vector with the usual operations.
30 30
///
31
/// The class \ref lemon::dim2::BoundingBox "dim2::BoundingBox"
32
/// can be used to determine
31
/// The class \ref lemon::dim2::Box "dim2::Box" can be used to determine
33 32
/// the rectangular bounding box of a set of
34 33
/// \ref lemon::dim2::Point "dim2::Point"'s.
35 34

	
36 35
namespace lemon {
37 36

	
38 37
  ///Tools for handling two dimensional coordinates
... ...
@@ -41,13 +40,13 @@
41 40
  ///tools for handling two dimensional coordinates
42 41
  namespace dim2 {
43 42

	
44 43
  /// \addtogroup misc
45 44
  /// @{
46 45

	
47
  /// A simple two dimensional vector (plain vector) implementation
46
  /// Two dimensional vector (plain vector)
48 47

	
49 48
  /// A simple two dimensional vector (plain vector) implementation
50 49
  /// with the usual vector operations.
51 50
  template<typename T>
52 51
    class Point {
53 52

	
... ...
@@ -218,13 +217,13 @@
218 217
  ///Write a plain vector to a stream.
219 218
  ///\relates Point
220 219
  ///
221 220
  template<typename T>
222 221
  inline std::ostream& operator<<(std::ostream &os, const Point<T>& z)
223 222
  {
224
    os << "(" << z.x << ", " << z.y << ")";
223
    os << "(" << z.x << "," << z.y << ")";
225 224
    return os;
226 225
  }
227 226

	
228 227
  ///Rotate by 90 degrees
229 228

	
230 229
  ///Returns the parameter rotated by 90 degrees in positive direction.
... ...
@@ -257,81 +256,81 @@
257 256
  {
258 257
    return Point<T>(z.y,-z.x);
259 258
  }
260 259

	
261 260

	
262 261

	
263
    /// A class to calculate or store the bounding box of plain vectors.
262
  /// Bounding box of plain vectors (\ref Point points).
264 263

	
265
    /// A class to calculate or store the bounding box of plain vectors.
266
    ///
267
    template<typename T>
268
    class BoundingBox {
264
  /// A class to calculate or store the bounding box of plain vectors
265
  /// (\ref Point points).
266
  template<typename T>
267
  class Box {
269 268
      Point<T> _bottom_left, _top_right;
270 269
      bool _empty;
271 270
    public:
272 271

	
273
      ///Default constructor: creates an empty bounding box
274
      BoundingBox() { _empty = true; }
272
      ///Default constructor: creates an empty box
273
      Box() { _empty = true; }
275 274

	
276
      ///Construct an instance from one point
277
      BoundingBox(Point<T> a) {
275
      ///Construct a box from one point
276
      Box(Point<T> a) {
278 277
        _bottom_left = _top_right = a;
279 278
        _empty = false;
280 279
      }
281 280

	
282
      ///Construct an instance from two points
281
      ///Construct a box from two points
283 282

	
284
      ///Construct an instance from two points.
283
      ///Construct a box from two points.
285 284
      ///\param a The bottom left corner.
286 285
      ///\param b The top right corner.
287 286
      ///\warning The coordinates of the bottom left corner must be no more
288 287
      ///than those of the top right one.
289
      BoundingBox(Point<T> a,Point<T> b)
288
      Box(Point<T> a,Point<T> b)
290 289
      {
291 290
        _bottom_left = a;
292 291
        _top_right = b;
293 292
        _empty = false;
294 293
      }
295 294

	
296
      ///Construct an instance from four numbers
295
      ///Construct a box from four numbers
297 296

	
298
      ///Construct an instance from four numbers.
297
      ///Construct a box from four numbers.
299 298
      ///\param l The left side of the box.
300 299
      ///\param b The bottom of the box.
301 300
      ///\param r The right side of the box.
302 301
      ///\param t The top of the box.
303 302
      ///\warning The left side must be no more than the right side and
304 303
      ///bottom must be no more than the top.
305
      BoundingBox(T l,T b,T r,T t)
304
      Box(T l,T b,T r,T t)
306 305
      {
307 306
        _bottom_left=Point<T>(l,b);
308 307
        _top_right=Point<T>(r,t);
309 308
        _empty = false;
310 309
      }
311 310

	
312
      ///Return \c true if the bounding box is empty.
311
      ///Return \c true if the box is empty.
313 312

	
314
      ///Return \c true if the bounding box is empty (i.e. return \c false
313
      ///Return \c true if the box is empty (i.e. return \c false
315 314
      ///if at least one point was added to the box or the coordinates of
316 315
      ///the box were set).
317 316
      ///
318
      ///The coordinates of an empty bounding box are not defined.
317
      ///The coordinates of an empty box are not defined.
319 318
      bool empty() const {
320 319
        return _empty;
321 320
      }
322 321

	
323
      ///Make the BoundingBox empty
322
      ///Make the box empty
324 323
      void clear() {
325 324
        _empty = true;
326 325
      }
327 326

	
328 327
      ///Give back the bottom left corner of the box
329 328

	
330 329
      ///Give back the bottom left corner of the box.
331
      ///If the bounding box is empty, then the return value is not defined.
330
      ///If the box is empty, then the return value is not defined.
332 331
      Point<T> bottomLeft() const {
333 332
        return _bottom_left;
334 333
      }
335 334

	
336 335
      ///Set the bottom left corner of the box
337 336

	
... ...
@@ -341,13 +340,13 @@
341 340
        _bottom_left = p;
342 341
      }
343 342

	
344 343
      ///Give back the top right corner of the box
345 344

	
346 345
      ///Give back the top right corner of the box.
347
      ///If the bounding box is empty, then the return value is not defined.
346
      ///If the box is empty, then the return value is not defined.
348 347
      Point<T> topRight() const {
349 348
        return _top_right;
350 349
      }
351 350

	
352 351
      ///Set the top right corner of the box
353 352

	
... ...
@@ -357,13 +356,13 @@
357 356
        _top_right = p;
358 357
      }
359 358

	
360 359
      ///Give back the bottom right corner of the box
361 360

	
362 361
      ///Give back the bottom right corner of the box.
363
      ///If the bounding box is empty, then the return value is not defined.
362
      ///If the box is empty, then the return value is not defined.
364 363
      Point<T> bottomRight() const {
365 364
        return Point<T>(_top_right.x,_bottom_left.y);
366 365
      }
367 366

	
368 367
      ///Set the bottom right corner of the box
369 368

	
... ...
@@ -374,13 +373,13 @@
374 373
        _bottom_left.y = p.y;
375 374
      }
376 375

	
377 376
      ///Give back the top left corner of the box
378 377

	
379 378
      ///Give back the top left corner of the box.
380
      ///If the bounding box is empty, then the return value is not defined.
379
      ///If the box is empty, then the return value is not defined.
381 380
      Point<T> topLeft() const {
382 381
        return Point<T>(_bottom_left.x,_top_right.y);
383 382
      }
384 383

	
385 384
      ///Set the top left corner of the box
386 385

	
... ...
@@ -391,13 +390,13 @@
391 390
        _bottom_left.x = p.x;
392 391
      }
393 392

	
394 393
      ///Give back the bottom of the box
395 394

	
396 395
      ///Give back the bottom of the box.
397
      ///If the bounding box is empty, then the return value is not defined.
396
      ///If the box is empty, then the return value is not defined.
398 397
      T bottom() const {
399 398
        return _bottom_left.y;
400 399
      }
401 400

	
402 401
      ///Set the bottom of the box
403 402

	
... ...
@@ -407,13 +406,13 @@
407 406
        _bottom_left.y = t;
408 407
      }
409 408

	
410 409
      ///Give back the top of the box
411 410

	
412 411
      ///Give back the top of the box.
413
      ///If the bounding box is empty, then the return value is not defined.
412
      ///If the box is empty, then the return value is not defined.
414 413
      T top() const {
415 414
        return _top_right.y;
416 415
      }
417 416

	
418 417
      ///Set the top of the box
419 418

	
... ...
@@ -423,13 +422,13 @@
423 422
        _top_right.y = t;
424 423
      }
425 424

	
426 425
      ///Give back the left side of the box
427 426

	
428 427
      ///Give back the left side of the box.
429
      ///If the bounding box is empty, then the return value is not defined.
428
      ///If the box is empty, then the return value is not defined.
430 429
      T left() const {
431 430
        return _bottom_left.x;
432 431
      }
433 432

	
434 433
      ///Set the left side of the box
435 434

	
... ...
@@ -439,13 +438,13 @@
439 438
        _bottom_left.x = t;
440 439
      }
441 440

	
442 441
      /// Give back the right side of the box
443 442

	
444 443
      /// Give back the right side of the box.
445
      ///If the bounding box is empty, then the return value is not defined.
444
      ///If the box is empty, then the return value is not defined.
446 445
      T right() const {
447 446
        return _top_right.x;
448 447
      }
449 448

	
450 449
      ///Set the right side of the box
451 450

	
... ...
@@ -455,40 +454,40 @@
455 454
        _top_right.x = t;
456 455
      }
457 456

	
458 457
      ///Give back the height of the box
459 458

	
460 459
      ///Give back the height of the box.
461
      ///If the bounding box is empty, then the return value is not defined.
460
      ///If the box is empty, then the return value is not defined.
462 461
      T height() const {
463 462
        return _top_right.y-_bottom_left.y;
464 463
      }
465 464

	
466 465
      ///Give back the width of the box
467 466

	
468 467
      ///Give back the width of the box.
469
      ///If the bounding box is empty, then the return value is not defined.
468
      ///If the box is empty, then the return value is not defined.
470 469
      T width() const {
471 470
        return _top_right.x-_bottom_left.x;
472 471
      }
473 472

	
474
      ///Checks whether a point is inside a bounding box
473
      ///Checks whether a point is inside the box
475 474
      bool inside(const Point<T>& u) const {
476 475
        if (_empty)
477 476
          return false;
478 477
        else {
479 478
          return ( (u.x-_bottom_left.x)*(_top_right.x-u.x) >= 0 &&
480 479
                   (u.y-_bottom_left.y)*(_top_right.y-u.y) >= 0 );
481 480
        }
482 481
      }
483 482

	
484
      ///Increments a bounding box with a point
483
      ///Increments the box with a point
485 484

	
486
      ///Increments a bounding box with a point.
485
      ///Increments the box with a point.
487 486
      ///
488
      BoundingBox& add(const Point<T>& u){
487
      Box& add(const Point<T>& u){
489 488
        if (_empty) {
490 489
          _bottom_left = _top_right = u;
491 490
          _empty = false;
492 491
        }
493 492
        else {
494 493
          if (_bottom_left.x > u.x) _bottom_left.x = u.x;
... ...
@@ -496,30 +495,30 @@
496 495
          if (_top_right.x < u.x) _top_right.x = u.x;
497 496
          if (_top_right.y < u.y) _top_right.y = u.y;
498 497
        }
499 498
        return *this;
500 499
      }
501 500

	
502
      ///Increments a bounding box to contain another bounding box
501
      ///Increments the box to contain another box
503 502

	
504
      ///Increments a bounding box to contain another bounding box.
503
      ///Increments the box to contain another box.
505 504
      ///
506
      BoundingBox& add(const BoundingBox &u){
505
      Box& add(const Box &u){
507 506
        if ( !u.empty() ){
508 507
          add(u._bottom_left);
509 508
          add(u._top_right);
510 509
        }
511 510
        return *this;
512 511
      }
513 512

	
514
      ///Intersection of two bounding boxes
513
      ///Intersection of two boxes
515 514

	
516
      ///Intersection of two bounding boxes.
515
      ///Intersection of two boxes.
517 516
      ///
518
      BoundingBox operator&(const BoundingBox& u) const {
519
        BoundingBox b;
517
      Box operator&(const Box& u) const {
518
        Box b;
520 519
        if (_empty || u._empty) {
521 520
          b._empty = true;
522 521
        } else {
523 522
          b._bottom_left.x = std::max(_bottom_left.x, u._bottom_left.x);
524 523
          b._bottom_left.y = std::max(_bottom_left.y, u._bottom_left.y);
525 524
          b._top_right.x = std::min(_top_right.x, u._top_right.x);
... ...
@@ -527,15 +526,56 @@
527 526
          b._empty = b._bottom_left.x > b._top_right.x ||
528 527
                     b._bottom_left.y > b._top_right.y;
529 528
        }
530 529
        return b;
531 530
      }
532 531

	
533
    };//class Boundingbox
532
  };//class Box
534 533

	
535 534

	
535
  ///Read a box from a stream
536

	
537
  ///Read a box from a stream.
538
  ///\relates Box
539
  template<typename T>
540
  inline std::istream& operator>>(std::istream &is, Box<T>& b) {
541
    char c;
542
    Point<T> p;
543
    if (is >> c) {
544
      if (c != '(') is.putback(c);
545
    } else {
546
      is.clear();
547
    }
548
    if (!(is >> p)) return is;
549
    b.bottomLeft(p);
550
    if (is >> c) {
551
      if (c != ',') is.putback(c);
552
    } else {
553
      is.clear();
554
    }
555
    if (!(is >> p)) return is;
556
    b.topRight(p);
557
    if (is >> c) {
558
      if (c != ')') is.putback(c);
559
    } else {
560
      is.clear();
561
    }
562
    return is;
563
  }
564

	
565
  ///Write a box to a stream
566

	
567
  ///Write a box to a stream.
568
  ///\relates Box
569
  template<typename T>
570
  inline std::ostream& operator<<(std::ostream &os, const Box<T>& b)
571
  {
572
    os << "(" << b.bottomLeft() << "," << b.topRight() << ")";
573
    return os;
574
  }
575

	
536 576
  ///Map of x-coordinates of a \ref Point "Point"-map
537 577

	
538 578
  ///\ingroup maps
539 579
  ///Map of x-coordinates of a \ref Point "Point"-map.
540 580
  ///
541 581
  template<class M>
Ignore white space 6 line context
... ...
@@ -722,24 +722,24 @@
722 722
        _nodeScale/=max_s;
723 723
      }
724 724
    }
725 725

	
726 726
    double diag_len = 1;
727 727
    if(!(_absoluteNodeSizes&&_absoluteArcWidths)) {
728
      dim2::BoundingBox<double> bb;
728
      dim2::Box<double> bb;
729 729
      for(NodeIt n(g);n!=INVALID;++n) bb.add(mycoords[n]);
730 730
      if (bb.empty()) {
731
        bb = dim2::BoundingBox<double>(dim2::Point<double>(0,0));
731
        bb = dim2::Box<double>(dim2::Point<double>(0,0));
732 732
      }
733 733
      diag_len = std::sqrt((bb.bottomLeft()-bb.topRight()).normSquare());
734 734
      if(diag_len<EPSILON) diag_len = 1;
735 735
      if(!_absoluteNodeSizes) _nodeScale*=diag_len;
736 736
      if(!_absoluteArcWidths) _arcWidthScale*=diag_len;
737 737
    }
738 738

	
739
    dim2::BoundingBox<double> bb;
739
    dim2::Box<double> bb;
740 740
    for(NodeIt n(g);n!=INVALID;++n) {
741 741
      double ns=_nodeSizes[n]*_nodeScale;
742 742
      dim2::Point<double> p(ns,ns);
743 743
      switch(_nodeShapes[n]) {
744 744
      case CIRCLE:
745 745
      case SQUARE:
... ...
@@ -755,13 +755,13 @@
755 755
        bb.add(p+mycoords[n]);
756 756
        bb.add(dim2::Point<double>(-ns,-3.01*ns)+mycoords[n]);
757 757
        break;
758 758
      }
759 759
    }
760 760
    if (bb.empty()) {
761
      bb = dim2::BoundingBox<double>(dim2::Point<double>(0,0));
761
      bb = dim2::Box<double>(dim2::Point<double>(0,0));
762 762
    }
763 763

	
764 764
    if(_scaleToA4)
765 765
      os <<"%%BoundingBox: 0 0 596 842\n%%DocumentPaperSizes: a4\n";
766 766
    else {
767 767
      if(_preScale) {
Ignore white space 6 line context
... ...
@@ -47,41 +47,41 @@
47 47
  p = a*l;
48 48
  check(p.x==2 && p.y==4, "Wrong dim2::Point multiplication by a scalar.");
49 49

	
50 50
  p = b/l;
51 51
  check(p.x==1 && p.y==2, "Wrong dim2::Point division by a scalar.");
52 52

	
53
  typedef dim2::BoundingBox<int> BB;
54
  BB box1;
55
  check(box1.empty(), "Wrong empty() in dim2::BoundingBox.");
53
  typedef dim2::Box<int> Box;
54
  Box box1;
55
  check(box1.empty(), "Wrong empty() in dim2::Box.");
56 56

	
57 57
  box1.add(a);
58
  check(!box1.empty(), "Wrong empty() in dim2::BoundingBox.");
58
  check(!box1.empty(), "Wrong empty() in dim2::Box.");
59 59
  box1.add(b);
60 60

	
61 61
  check(box1.left()==1 && box1.bottom()==2 &&
62 62
        box1.right()==3 && box1.top()==4,
63
        "Wrong addition of points to dim2::BoundingBox.");
63
        "Wrong addition of points to dim2::Box.");
64 64

	
65
  check(box1.inside(Point(2,3)), "Wrong inside() in dim2::BoundingBox.");
66
  check(box1.inside(Point(1,3)), "Wrong inside() in dim2::BoundingBox.");
67
  check(!box1.inside(Point(0,3)), "Wrong inside() in dim2::BoundingBox.");
65
  check(box1.inside(Point(2,3)), "Wrong inside() in dim2::Box.");
66
  check(box1.inside(Point(1,3)), "Wrong inside() in dim2::Box.");
67
  check(!box1.inside(Point(0,3)), "Wrong inside() in dim2::Box.");
68 68

	
69
  BB box2(Point(2,2));
70
  check(!box2.empty(), "Wrong empty() in dim2::BoundingBox.");
71
  
69
  Box box2(Point(2,2));
70
  check(!box2.empty(), "Wrong empty() in dim2::Box.");
71

	
72 72
  box2.bottomLeft(Point(2,0));
73 73
  box2.topRight(Point(5,3));
74
  BB box3 = box1 & box2;
74
  Box box3 = box1 & box2;
75 75
  check(!box3.empty() &&
76
        box3.left()==2 && box3.bottom()==2 && 
76
        box3.left()==2 && box3.bottom()==2 &&
77 77
        box3.right()==3 && box3.top()==3,
78
        "Wrong intersection of two dim2::BoundingBox objects.");
79
  
78
        "Wrong intersection of two dim2::Box objects.");
79

	
80 80
  box1.add(box2);
81 81
  check(!box1.empty() &&
82 82
        box1.left()==1 && box1.bottom()==0 &&
83 83
        box1.right()==5 && box1.top()==4,
84
        "Wrong addition of two dim2::BoundingBox objects.");
84
        "Wrong addition of two dim2::Box objects.");
85 85

	
86 86
  return 0;
87 87
}
0 comments (0 inline)