triskele/include/ArrayTree/GraphWalker.hpp
Git Merciol 8149f1353b modifié : MakefileNoOTB
modifié :         include/ArrayTree/ArrayTreeBuilder.hpp
	modifié :         include/ArrayTree/ArrayTreeBuilder.tpp
	modifié :         include/ArrayTree/Border.hpp
	modifié :         include/ArrayTree/Border.tpp
	modifié :         include/ArrayTree/GraphWalker.hpp
	modifié :         include/ArrayTree/GraphWalker.tpp
	modifié :         include/ArrayTree/Leader.tpp
	modifié :         include/ArrayTree/triskeleArrayTreeBase.hpp
	modifié :         include/ArrayTree/triskeleArrayTreeBase.tpp
	modifié :         include/AttributeProfiles.hpp
	modifié :         include/AttributeProfiles.tpp
	modifié :         include/Attributes/AreaAttributes.hpp
	modifié :         include/Attributes/AverageAttributes.hpp
	modifié :         include/Attributes/MoIAttributes.hpp
	modifié :         include/Attributes/SDAttributes.hpp
	modifié :         include/Attributes/WeightAttributes.hpp
	modifié :         include/Attributes/XYAttributes.hpp
	modifié :         include/CompAttribute.hpp
	modifié :         include/CompAttribute.tpp
	modifié :         include/Tree.hpp
	modifié :         include/Tree.tpp
	modifié :         include/TreeStats.hpp
	modifié :         include/triskeleBase.hpp
	modifié :         include/triskeleBase.tpp
	modifié :         include/triskeleDebug.hpp
	modifié :         src/Tree.cpp
	modifié :         src/TreeStats.cpp
	modifié :         src/apGenerator.cpp
2018-03-06 19:56:25 +01:00

80 lines
3.2 KiB
C++

#ifndef _OTB_TRISKELE_ARRAY_TREE_GRAPHWALKER_HPP
#define _OTB_TRISKELE_ARRAY_TREE_GRAPHWALKER_HPP
#include <boost/assert.hpp>
#include <algorithm>
#include <numeric>
#include <vector>
#include "triskeleDebug.hpp"
#include "triskeleBase.hpp"
#include "triskeleArrayTreeBase.hpp"
#include "Border.hpp"
#ifdef GRAPHWALKER_NO_BORDER
#define GRAPHWALKER_CALL_LAMBDA_IDX(idx, count, lambda) lambda, count++
#define GRAPHWALKER_CALL_LAMBDA_PTS(p1, p2, count, lambda) lambda, count++
#else
#define GRAPHWALKER_CALL_LAMBDA_IDX(idx, count, lambda) if (!border.isBorder (idx)) lambda, count++
#define GRAPHWALKER_CALL_LAMBDA_PTS(p1, p2, count, lambda) if (!(border.isBorder (p1) || border.isBorder (p2))) lambda, count++
#endif
namespace otb {
namespace triskele {
namespace arrayTree {
using namespace ::triskele;
using namespace std;
/** GraphWalker */
class GraphWalker {
public:
const Size size;
const Border &border;
const Connectivity connectivity;
inline GraphWalker (const Size &size, const Border &border, const Connectivity &connectivity = Connectivity::C4);
inline DimImg vertexMaxCount () const;
inline DimImg vertexMaxCount (const Size &tileSize) const;
inline DimEdge edgeMaxCount () const;
inline DimEdge edgeMaxCount (const Size &tileSize) const;
inline DimEdge edgeBoundaryMaxCount (const DimSideImg &side) const;
inline void setTiles (const unsigned int &coreCount, const Rect &tile,
vector<Rect> &tiles, vector<Rect> &boundaries, vector<bool> &verticalBoundaries) const;
inline void setMaxBounds (const vector<Rect> &tiles, vector<DimImg> &vertexMaxBounds, vector<DimImg> &edgesMaxBounds) const;
template<typename Funct>
inline DimImg forEachVertexIdx (const Funct &lambda /*lambda (idx)*/) const;
template<typename Funct>
DimImg forEachVertexPt (const Funct &lambda /*lambda (p)*/) const {
return forEachVertexIdx ([this, &lambda] (const Point &p) { lambda (point2idx (size, p)); });
}
template<typename Funct>
inline DimImg forEachVertexIdx (const Rect &rect, const Funct &lambda /*lambda (idx)*/) const;
template<typename Funct>
inline DimImg forEachVertexPt (const Rect &rect, const Funct &lambda /*lambda (p)*/) const;
template<typename Funct>
inline DimEdge forEachEdgePt (const Rect &rect, TileItem tileItem, const Funct &lambda /*lambda (p0, p1)*/) const;
template <typename WeightT, typename EdgeWeightFunction>
inline WeightT getMedian (const EdgeWeightFunction &ef /*ef.getValue (idx)*/) const;
template<typename WeightT, typename EdgeWeightFunction>
inline DimEdge getEdges (const Rect &rect, TileItem tileItem, Edge<WeightT> *edges, const EdgeWeightFunction &ef /*ef.getWeight (p0, p1)*/) const;
template<typename WeightT, typename EdgeWeightFunction>
inline DimEdge getSortedEdges (const Rect &rect, TileItem tileItem, Edge<WeightT> *edges, const EdgeWeightFunction &ef /*ef.getWeight (p0, p1) ef.sort ()*/) const;
template<typename WeightT, typename EdgeWeightFunction>
inline DimEdge getCountingSortedEdges (const Rect &rect, TileItem tileItem, Edge<WeightT> *edges, const EdgeWeightFunction &ef /*ef.getWeight (p0, p1)*/) const;
};
#include "GraphWalker.tpp"
} // arrayTree
} // triskele
} // otb
#endif // _OTB_TRISKELE_ARRAY_TREE_GRAPHWALKER_HPP