00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00046 #ifndef GIRLTOGER_HPP
00047 #define GIRLTOGER_HPP
00048
00049 #include <girl/girlCommon.hpp>
00050
00051 #include <deque>
00052 #include <vector>
00053 #include <string>
00054
00055 #include <girl/girlSharedPtr.hpp>
00056
00057 #include <girl/girlFlags.hpp>
00058 #include <girl/girlPoint.hpp>
00059 #include <girl/girlDirection.hpp>
00060 #include <girl/girlIO.hpp>
00061 #include <girl/girlContour.hpp>
00062 #include <girl/girlPath.hpp>
00063
00064 namespace girl {
00065
00066 typedef int dart;
00067 typedef int face;
00068 typedef int region;
00069
00070 typedef std::deque<girl::region> regionDeque;
00071 typedef std::vector<girl::region> regionVector;
00072 typedef std::deque<girl::path> pathDeque;
00073 typedef std::deque<girl::contour> contourDeque;
00074
00075
00076 class togerImpl;
00077
00085 class GIRL_API toger
00086 {
00087
00088 public:
00089
00102 typedef enum neighbouringMode {
00103 NEIGHBOUR_NONE = 0,
00104 NEIGHBOUR_DIRECT = 1,
00105 NEIGHBOUR_INNER = 2,
00106 NEIGHBOUR_OUTER = 4,
00107 NEIGHBOUR_ANY = 7
00108 } neighbouringMode;
00109
00110
00117 typedef enum markFlag {
00118 MARK_NONE = 0,
00119 MARK_0 = 1,
00120 MARK_1 = 2,
00121 MARK_2 = 4,
00122 MARK_3 = 8,
00123 MARK_4 = 16,
00124 MARK_5 = 32,
00125 MARK_6 = 64,
00126 MARK_7 = 128,
00127 MARK_ANY = 255
00128 } markFlag;
00129
00130 GIRL_DECLARE_FLAGS(neighbouringModes, neighbouringMode)
00131 GIRL_DECLARE_FLAGS(markFlags, markFlag)
00132
00133
00134
00135
00136
00145 toger(POINT_TYPE width=1, POINT_TYPE height=1);
00146
00150 POINT_TYPE width() const;
00151
00155 POINT_TYPE height() const;
00156
00157
00165 class sameRegion
00166 {
00167 public:
00171 virtual ~sameRegion() {}
00172
00177 virtual bool same(const girl::point &p, girl::direction dir) = 0;
00178 };
00179
00197 void splitRegion(girl::region r,
00198 girl::toger::sameRegion &same_r,
00199 girl::regionDeque ®s);
00200
00219 girl::region mergeRegions(girl::region r1, girl::region r2);
00220
00221
00227 bool insertPaths(const girl::pathDeque &paths,
00228 girl::regionDeque &out_q);
00229
00230
00234 typedef void (*f1RegionHook) (girl::region r, void *userData);
00235
00239 typedef void (*f2RegionsHook) (girl::region r1, girl::region r2,
00240 void *userData);
00241
00242
00246 void setNewRegionHook(girl::toger::f1RegionHook hook, void *userData);
00247
00251 void setDeleteRegionHook(girl::toger::f1RegionHook hook, void *userData);
00252
00253
00263 void setMergeRegionsHook(girl::toger::f2RegionsHook hook, void *userData);
00264
00275 void setRenameRegionHook(girl::toger::f2RegionsHook hook, void *userData);
00276
00277
00278
00283 bool belongsTo(const girl::point &p, girl::region r) const;
00284
00285
00294 girl::region findRegion(const girl::point &p) const;
00295
00311 void findRegions(const girl::point &p1, const girl::point &p2,
00312 girl::regionDeque ®ions) const;
00313
00314
00325 girl::dart findDart(const girl::point &p) const;
00326
00327
00334 girl::point anyPoint(girl::region r) const;
00335
00336
00337
00338
00339
00350 void regionDomain(girl::region r, std::vector<girl::point> &scan) const;
00351
00352
00360 void regionBoundary(girl::region r, girl::contourDeque &b) const;
00361
00362
00369 void regionOuterBoundary(girl::region r, girl::contour &c) const;
00370
00371
00378 void regionsCommonBoundary(girl::region r1, girl::region r2,
00379 pathDeque &commonSegments) const;
00380
00381
00388 void segment(girl::dart d, girl::path &p) const;
00389
00396 size_t segmentLength(girl::dart d) const;
00397
00398
00399
00400
00401
00405 girl::face lambda(girl::dart d) const;
00406
00410 girl::dart beta(girl::face f) const;
00411
00412
00416 girl::dart alpha(girl::dart d) const;
00417
00421 girl::dart sigma(girl::dart d) const;
00422
00426 girl::dart phi(girl::dart d) const;
00427
00428
00429
00433 bool isFaceInfinite(girl::face f) const;
00434
00440 girl::face parent(girl::face f) const;
00441
00442
00448 girl::face firstChild(girl::face f) const;
00449
00450
00459 girl::face nextSibling(girl::face fi) const;
00460
00461
00469 girl::dart getDart(const girl::point &pt, girl::direction dir) const;
00470
00471
00472
00487 bool areNeighbours(girl::region r1,
00488 girl::region r2,
00489 girl::toger::neighbouringModes mode,
00490 girl::toger::markFlags m) const;
00491
00492
00506 void regionNeighbourhood(girl::region r,
00507 girl::toger::neighbouringModes mode,
00508 girl::toger::markFlags m,
00509 regionDeque ®s) const;
00510
00511
00525 girl::region anyRegionNeighbour(girl::region r,
00526 girl::toger::neighbouringModes mode,
00527 girl::toger::markFlags m) const;
00528
00529
00538 void allRegions(regionDeque ®s) const;
00539
00548 size_t numRegions() const;
00549
00557 void innerRegions(girl::region r, regionDeque ®s) const;
00558
00559
00565 class pointIterator
00566 {
00567 public:
00571 virtual ~pointIterator() {}
00572
00576 virtual void processPoint(const girl::point &) = 0;
00577
00578 };
00579
00585 class directionIterator
00586 {
00587 public:
00591 virtual ~directionIterator() {}
00592
00596 virtual void processFirstPoint(const girl::point &) {}
00597
00601 virtual void processDirection(girl::direction) {}
00602
00606 virtual void processLastPoint(const girl::point &) {}
00607 };
00608
00609
00625 void iterateOnRegionDomain(girl::region r,
00626 girl::toger::pointIterator &fct) const;
00627
00646 void iterateOnFaceBoundary(girl::face f,
00647 girl::toger::directionIterator &fct) const;
00648
00649
00670 void iterateOnSegment(girl::dart d,
00671 girl::toger::directionIterator &fct) const;
00672
00673
00674
00675
00686 void xMarkRegionBoundary(girl::region r, girl::toger::markFlags m);
00687
00696 void unmarkRegionBoundary(girl::region r, girl::toger::markFlags m);
00697
00706 void xMarkOuterBoundary(girl::region r, girl::toger::markFlags m);
00707
00716 void unmarkOuterBoundary(girl::region r, girl::toger::markFlags m);
00717
00718
00719
00729 bool isRegionMarked(girl::region r, girl::toger::markFlags m) const;
00730
00731
00742 bool isRegionOuterBoundaryMarked(girl::region r,
00743 girl::toger::markFlags m) const;
00744
00745
00758 bool isFaceMarked(girl::face f, girl::toger::markFlags m) const;
00759
00765 void markAllDarts(girl::toger::markFlags m);
00766
00767
00768
00774 void unmarkAllDarts(girl::toger::markFlags m);
00775
00782 bool isDartMarked(girl::dart d, girl::toger::markFlags m) const;
00783
00794 void markCommonBoundary(girl::region r1, girl::region r2,
00795 girl::toger::markFlags m);
00796
00807 void unmarkCommonBoundary(girl::region r1, girl::region r2,
00808 girl::toger::markFlags m);
00809
00810
00815 void saveBitmap(const std::string &f) const;
00816
00817
00818
00825 bool checkConsistency() const;
00826
00827
00834 void shrink();
00835
00836
00837
00838
00839
00840
00848 void write(girl::io::Writer &w, girl::io::Type ioType) const;
00849
00850
00861 bool read(girl::io::Reader &r, girl::io::Type ioType);
00862
00863
00864
00865
00866
00867
00872 bool swapable(const girl::point &p) const;
00873
00874
00881 void swap(const girl::point &p);
00882
00883 private:
00884
00885 void copy();
00886
00887 private:
00888
00889 girl::shared_ptr<girl::togerImpl> m_pimpl;
00890
00891 };
00892
00893 }
00894
00895 GIRL_DECLARE_OPERATORS_FOR_FLAGS(girl::toger::neighbouringModes)
00896 GIRL_DECLARE_OPERATORS_FOR_FLAGS(girl::toger::markFlags)
00897
00898
00899 #endif // GIRLTOGER_HPP