lsrmGraph.h 2.08 KiB
#ifndef __LSRM_GRAPH_H
#define __LSRM_GRAPH_H
#include "lsrmDataStructures.h"
#include "lpContour.h"
namespace lsrm
	struct BaseNode
		/* Node already merged. */
		bool m_Valid;
		/* Node has to be removed from the graph. */
		bool m_Expired;
		/* Does the node merge at the previous iteration */
		bool m_IsMerged;
		/* Perimeter of the region */
		unsigned int m_Perimeter;
		/* Area (number of inner pixels) of the region */
		unsigned int m_Area;
		  Node is identified by the location
		  of the first pixel of the region.
		long unsigned int m_Id;
		  Bounding box of the region
		  in the image.
		lp::BoundingBox m_Bbox;
		/* Contour of the shape */
		lp::Contour m_Contour;
	template<class DerivedNode>
		struct NeighborType
			typedef std::weak_ptr<DerivedNode> WeakDerived;
			typedef std::shared_ptr<DerivedNode> SharedDerived;
			WeakDerived m_Target;
			float  m_Cost;
			unsigned int m_Boundary;
			bool m_CostUpdated;
		    NeighborType(WeakDerived ptr, double w, unsigned int c) :
			m_Target(ptr), m_Cost(w), m_Boundary(c), m_CostUpdated(false) {}
			inline SharedDerived GetRegion()
					SharedDerived ptr(m_Target.lock());
					if(!ptr)
						throw std::runtime_error("lsrmGraph.h - NeighborType::GetRegion - Region pointer is not valid");
					return ptr;
	template<class DerivedNode>
		struct Node : BaseNode
		typedef NeighborType<DerivedNode> CRPTNeighborType;
		std::vector<CRPTNeighborType> m_Edges;
71727374757677787980818283848586878889909192
template<class TNode> struct Graph { typedef TNode NodeType; typedef std::shared_ptr<NodeType> NodePointerType; typedef typename NodeType::CRPTNeighborType EdgeType; typedef std::vector<NodePointerType> NodeListType; typedef typename NodeListType::iterator NodeIteratorType; typedef typename NodeListType::const_iterator NodeConstIteratorType; typedef std::vector<EdgeType> EdgeListType; typedef typename EdgeListType::iterator EdgeIteratorType; typedef typename EdgeListType::const_iterator EdgeConstIteratorType; std::vector< NodePointerType > m_Nodes; }; } // end of namespace lsrm #endif