#pragma once #include "ClosedFinder_Data.h" struct ltstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; } }; class ClosedFinder { public: ClosedFinder(void); virtual ~ClosedFinder(void); public: // tool //获取边的端点 static bool getArcHalfEdgeBeginEnd(const std::list& lstEdge, const sPoint* & ptFist, const sPoint* & ptEnd); public: //set data bool addPoint(Point_Key key, sPoint* pPoint, bool bCheck = true); //输入点 bool addArc (Arc_Key key , sArc* pArc , bool bCheck = true); //输入弧线 public: //get data // const std::map& getPoints()const {return mPointsSrc;} const std::map& getArcs ()const {return mArcsSrc;} // std::map& getPoints(){return mPointsSrc;} std::map& getArcs () {return mArcsSrc;} public: //result const std::map& getPolygons ()const {return mPolygons;} const std::map > > >& getPolygonsCombin ()const {return mPolygonsCombin;} public: //interface //生成多边形,返回值为多边形的个数 int GeneralPolygon(void); private: //搜索多边形,找到返回true bool __GeneralPolygon(sPolygon polygon, std::map& linkDatas ); //搜索多边形, 返回多边形边数,没有 返回-1 int SearchGeneralPolygon(sPolygon polygon, std::map& linkDatas ); //获取多边形的最大边数 int GetMaxEdgeSet(); private: //多边形整合 bool __CombinPolygon(); //删除外边框的多边形 bool ClearMaxEdgePolygon(); //判断多边形是否包含 bool IsIncludeClosedPolygon(vector& keySet1, vector keySet2); //添加一条边 void AddEdge( sPolygon &polygonCur, const sArcHalfEdge& halEdgeT ); // //添加找到的多边形 bool _AddPolygon(sPolygon &polygonCur) ; //缓存所有两变形面 void _PostPolygon2edge(const sPolygon &polygonCur ); // //判断是否为孤岛 void PostIsland( sPolygon &polygonCur, sArcHalfEdge& halfEdge ) ; // //得到一个多边形的最大查询次数 TimeofSearch _GetMaxTimeOfSearch( sPolygon &polygonCur) ; private: //多边形是否已经存在 bool ExistPolygon(const sPolygon &polygonCur); private: //添加一个半边数据 void AddHaldEdge(const sArcHalfEdge &halfEdge ) ; //对连接到一点的所有线段按照已经被搜索的次数排序 //结果存储在tmapHalfEdgebyTime中 std::multimap SortPointLinkEdge( std::map &linkDatas); private: //in std::map mPointsSrc ; //原始的点数据 std::map mArcsSrc ; //原始的点数据 std::map > mPointLinkData; //过点的所有弧线段 private: //out // Polygon_Key mCurPolygon_Key;//当前多边形的id std::map mPolygons; //输出的多边形 private: std::map > > > mPolygonsCombin;//合并的多边形 private: //tmapHalfEdgebyTime; //按照已经被引用过的次数排序 int tCurMaxSize; //当前搜索多边形的边数 std::map tmapGen; //已经被生成过的点, // std::map tmapExistPolygon; //已经被生成过的多边形, private: //2边形的特殊处理 std::map > mmapLinkArcs; //弧段所属的等同段 // std::map > > mmapLinkArcs2; //弧段所属的等同段 public: std::vector border; // 边界 多边形的边不能都在该边界中 };