You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
8.3 KiB
C

1 month ago
/**************************************************************************************
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Contour2Polygon.h
<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ֵ<EFBFBD>ߺ͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ߣ<EFBFBD><EFBFBD>ϲ<EFBFBD>Լ<EFBFBD><EFBFBD>߽<EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD>ɵĶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*****************************************************************************************/
#pragma once
#ifndef AFX_EXT_CLASS
#define AFX_EXT_CLASS Q_DECL_IMPORT
#endif
#include "MyCurve.h"
#include "TBase/TMultiTree.h"
#include "curvegraph.h"
#include <set>
#include <map>
#include <functional>
namespace GObjects
{
//class CPolygonTree;
class AFX_EXT_CLASS CCon2Pgn : protected CCurveGraph
{
public:
CCon2Pgn(void);
virtual ~CCon2Pgn(void);
void ClearAll(void);
void SetContours(vector<CMyCurve*>& vec);
void SetFlts(vector<CMyCurve*>& scrFlts);
void SetBorder(CMyCurve& border);
//<2F><><EFBFBD>õ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB3A4>
void SetExtensivePara(double dext) { m_dext = dext; }
double GetExtensivePara(void) const { return m_dext; }
//<2F><><EFBFBD>˱߽<CBB1><DFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ֵ<EFBFBD>ߺͶϲ<CDB6>
void FilterOutsideContours(void);
//<2F><><EFBFBD>ɵ<EFBFBD>ֵ<EFBFBD><D6B5>
void CreatePolygons(void); //
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5>ļ<EFBFBD><C4BC><EFBFBD> ,decimalPlaces Ϊ<><CEAA><EFBFBD><EFBFBD><E0B1A3><EFBFBD><EFBFBD>λС<CEBB><D0A1>
void WritePolygons(char* strOutput, int decimalPlaces = 2);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5>ļ<EFBFBD><C4BC>У<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Χ<EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>,<2C><>','<27>ָ<EFBFBD>
void WritePurePolygons(char* strOutput);
vector<CMyCurve*>& GetPolygons() { return m_dstPolygons; }
//<2F><><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><7A><D6B5>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double GetPolygonValue(CMyCurve& curve);
//<2F><>ȡ<EFBFBD><C8A1>ɫ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ֵ<EFBFBD><D6B5>ֵ<EFBFBD><D6B5>ȡ<EFBFBD>õ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ɫ
COLORREF GetColor(double val);
//psubj<62>Ƿ<EFBFBD><C7B7><EFBFBD>prange<67><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2>򲿷<EFBFBD><F2B2BFB7><EFBFBD><EFBFBD>ڲ<EFBFBD>
static bool IsCurveInside(CMyCurve* pRange, CMyCurve* pSubj);
//override
protected:
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>߼佻<DFBC><E4BDBB> <20>ɰ<EFBFBD><C9B0>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д
virtual int GetCrossPoints(void);
//<2F><>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><E0BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ҹ<EFBFBD><D2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
virtual PT3Node* GetNextNode(PT3Node* pLastNode, PT3Node* pCurrentNode);
//<2F><><EFBFBD>ŵ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ɱպ<C9B1><D5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>λ<EFBFBD><CEBB>
class STurning
{
public:
/* SFltSec(void);*/
//<2F>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD> С<><D0A1>ǰ <20><><EFBFBD>ں<EFBFBD>
STurning(CCurveGraph::PT3Node* pLast, CCurveGraph::PT3Node* pCurrent, CCurveGraph::PT3Node* pNext, ESide eside);
/*bool operator==(const SFltSec& pd2) const;*/
bool operator<(const STurning& pt2) const;
private:
CCurveGraph::PT3Node* mp1;
CCurveGraph::PT3Node* mp2;
CCurveGraph::PT3Node* mp3;
//bool mbForw; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Ŷ<EFBFBD><C5B6>߷<EFBFBD><DFB7><EFBFBD>
CCurveGraph::ESide mSide;
};
////<2F><><EFBFBD><EFBFBD><EFBFBD>߽磬<DFBD><E7A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD> <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
//void SortBorder(void);
////<2F><>ȡ<EFBFBD>߽<EFBFBD>,<2C>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ߵĽ<DFB5><C4BD><EFBFBD><E3A3AC><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//void GetAllCrossPoints(void);
////<2F><>ȡ<EFBFBD><C8A1><EFBFBD>е<EFBFBD>ֵ<EFBFBD>߶<EFBFBD>Ӧ<EFBFBD>ı߽罻<DFBD><E7BDBB><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD>Ӧ<EFBFBD>ĵ<EFBFBD>ֵ<EFBFBD>߽<EFBFBD><DFBD><EFBFBD>
//void GetContourNodes(void);
//׷<><D7B7><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
void Trace(void);
//׷<>ٱ߽<D9B1><DFBD><EFBFBD>Ӧ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
void TraceBorderPolygons(CMyCurve* border);
//׷<>ٱ߽<D9B1>(<28><><EFBFBD>ϲ<EFBFBD>)<29><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶ζ<DFB6>Ӧ<EFBFBD>ıպ϶<D5BA><CFB6><EFBFBD><EFBFBD>ν<EFBFBD><CEBD><EFBFBD>list<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>list<73><74><EFBFBD><EFBFBD>ccurve,<2C><><EFBFBD><EFBFBD>m_outputPolygons<6E><73>
bool TraceFltSegPolygon(CMyCurve* curve, SCRPoint* startSCRPt, bool bBorder);
//׷<><D7B7>һ<EFBFBD><D2BB><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>Ӧ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
void TraceFltPolygons(CMyCurve* flt);
//׷<><D7B7>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ֵ<EFBFBD>߶<EFBFBD>Ӧ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> ww 2019
void TraceContourPolygons(CMyCurve* pContour);
//<2F>ɽ<EFBFBD><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD><EFBFBD>
CMyCurve* CreateOneOpenPolygon(list<PT3Node*>& lstNodes);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>ֵ<EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>,<2C>պϵ<D5BA>ֵ<EFBFBD><D6B5>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD> ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// m_bCheckZ<6B>ڴ˺<DAB4><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD>
void TraceOutputPolygons(void);
void EnableCheckZ(bool b) { m_bCheckZ = b; }
//members
private:
//<2F><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
double m_dext;
CMyCurve* m_pBorder;
vector<CMyCurve*> m_contours; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5> <20>ⲿָ<E2B2BF><D6B8>
vector<CMyCurve*> m_bd_faults; //<2F><><EFBFBD><EFBFBD><EFBFBD>ı߽<C4B1><DFBD><EFBFBD>ַ<EFBFBD>Ͷϲ<CDB6> <20>ⲿָ<E2B2BF><D6B8> <20><>һ<EFBFBD><D2BB>Ϊ<EFBFBD>߽<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
vector<CMyCurve*> m_dstPolygons;
//<2F><><EFBFBD><EFBFBD><EFBFBD>պ϶<D5BA><CFB6><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD>״ͼ<D7B4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ww 2019.4.16
void TraceOutputCircles(list<CMyCurve*>& closingCurves);
//<2F><><EFBFBD><EFBFBD>openpolygons<6E>İ<EFBFBD><C4B0><EFBFBD><EFBFBD><EFBFBD>ϵ
void CombineOpenPolygons(void);
bool IsFltZ(double z);
//<2F><>ȡ<EFBFBD>߽<EFBFBD><DFBD>ϵĽ<CFB5><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>ָ<EFBFBD><D6B8> <20><><EFBFBD><EFBFBD>m_borderCxNodes
void GetBorderCXNodes(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><7A><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD> m_checkZ<6B>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void FilterDstPolygons(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϸö<CFB8><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>legal
bool IsPolygonLegal(CMyCurve* pgn);
//<2F>жϽ<D0B6><CFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD>׷<EFBFBD><D7B7><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ʱʹ<CAB1><CAB9>
virtual bool IsNodeAvaliable(PT3Node* pNode) override;
//ɾ<><C9BE><EFBFBD>ϲ<EFBFBD><CFB2>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>߽߱<DFB1><DFBD>ⲿ<EFBFBD>ķǷ<C4B7><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void EraseIllegalPolygons(vector<CMyCurve*>& srcCurves);
private:
set<STurning> m_tracedTurnings; // tmp <20><>¼<EFBFBD>Ѿ<EFBFBD>׷<EFBFBD>ٵ<EFBFBD><D9B5>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
//<2F>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
private:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
vector<CMyCurve*> m_openContPolygons; //<2F><><EFBFBD>ŵ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ɵıպ϶<D5BA><CFB6><EFBFBD><EFBFBD><EFBFBD>
vector<int> m_circleIndexes; //<2F>պϵ<D5BA>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
map<int, list<int> > m_mapFltNodes; //<2F>洢ÿһ<C3BF><D2BB><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĽ<D0B5><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD> <20><><EFBFBD>ն<EFBFBD><D5B6><EFBFBD>׮<EFBFBD>Ž<EFBFBD><C5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector<GBase::CRect8> m_rectFlts; //<2F><><EFBFBD>жϲ<D0B6><CFB2><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
//set<CMyCurve*> m_fltPolygons; //<2F>ɶϲ<C9B6>׷<EFBFBD>ٳ<EFBFBD><D9B3><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Сֵ<D0A1>ͼ<EFBFBD><CDBC><EFBFBD>
double m_maxVal;
double m_minVal;
double m_conStep;
const double m_dFLTZ; //ȱʡ<C8B1><CAA1><EFBFBD>ߺͱ߽<CDB1>
bool m_bCheckZ; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><5A><D6B5><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
set<PT3Node*> m_borderCxNodes; //<2F><>¼<EFBFBD>߽<EFBFBD><DFBD>ϵĽ<CFB5><C4BD><EFBFBD><EFBFBD><EFBFBD>
set<CMyCurve*> m_borderPolygons; //<2F><EFBFBD><E6B4A2><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڱ߽<DAB1><DFBD>ϵĶ<CFB5><C4B6><EFBFBD><EFBFBD><EFBFBD>
bool m_bBorderTracing; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD>׷<EFBFBD>ٱ߽<D9B1>
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef TTreeNode<CMyCurve*> CPgnNode;
typedef TMultiTree<CMyCurve*> CPgnTree;
//<2F>պ϶<D5BA><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊһϵ<D2BB><CFB5>PolygonTreeNod<6F><64><EFBFBD>ڵ<EFBFBD> ÿ<><C3BF>nod<6F><64><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
class AFX_EXT_CLASS CPolygonTree
{
public:
CPolygonTree();
~CPolygonTree();
void Clear();
void SetRootCurve(CMyCurve* pRootCurve);
CMyCurve* GetRootCurve(void);
void SetChildCurves(vector<CMyCurve*>& childCurves);
void AddChildCurve(CMyCurve* pChild);
//<2F><><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void BuildTree(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߲㼶<DFB2><E3BCB6>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> minAreaΪ<61><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool BuildTreeWithHierarchy(vector< vector<int> >& hierarchy, double minArea = -100);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SetFilterArea(double area) { m_minArea = area; }
//<2F><><EFBFBD>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void CreatePolygons(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD>״Ȧ<D7B4><C8A6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ɾ<EFBFBD><C9BE>
vector<CMyCurve*> m_outCurves;
CPgnTree& GetTree(void) { return m_tree; }
//<2F>ݹ麯<DDB9><E9BAAF> <20><><EFBFBD>ݵ<EFBFBD>ǰ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>m_outCurves bQuickTraceΪ<65><CEAA><EFBFBD>ٲ<EFBFBD><D9B2><EFBFBD>
void TracePolygons(CPgnNode* pNode,bool bCombineAdjacent = true, bool bQuickTrace= false);
//<2F><><EFBFBD>ٲ<EFBFBD><D9B2><EFBFBD>CPgnNode* pNode<64><65><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>m_outCurves
void QuickTracePolygons(CPgnNode* pNode, bool bCombineAdjacent = false, bool bQuickTrace = true);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static CMyCurve* CreateCombinedCurve(CMyCurve* pSeed, list<CMyCurve*>& candidates);
private:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><E3B2A2><EFBFBD><EFBFBD><EBB5BD><EFBFBD><EFBFBD>
void CreateNInsertChild(CMyCurve* pCurve);
//<2F><><EFBFBD>ݲ㼶<DDB2><E3BCB6>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ㲢<DAB5><E3B2A2><EFBFBD><EFBFBD><EBB5BD>
void CreateNInsertChildrenWithHierarchy(void);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
void AddChildrenWithHierarchy(int iParent);
//ͨ<><CDA8><EFBFBD><EFBFBD><E3BCB6>ϵ<EFBFBD><CFB5>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>
int hSiblingNext(int icurrent);
int hSiblinePrev(int icurrent);
int hChild(int icurrent);
int hParent(int icurrent);
//<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD>dstcurves
int CombineAdjacentPolygons(list<CMyCurve*>& scrlst, float rootValue, vector<CMyCurve*>& dstcurves);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>,<2C><>scrVecȡ<63><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dstgroups,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>dstgroups
int SelectAdjacentPolygons(list<CMyCurve*>& scrlst, vector<vector<CMyCurve*> >& dstgroups);
//<2F><><EFBFBD><EFBFBD>scrlst<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pscr<63><72><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD>scrlst<73><74><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dstpgns,<2C><><EFBFBD>ز<EFBFBD><D8B2>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int SelectAdjacentPolygons(CMyCurve* pscr, list<CMyCurve*>& scrlst, vector<CMyCurve*>& dstpgns);
//<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>Σ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ϼ<EFBFBD>Ȧ<EFBFBD>սӽ<D5BD><D3BD><EFBFBD>
int CreateUnitedPolgons(vector< vector<CMyCurve*> >& groups, float rootValue, vector<CMyCurve*>& dstcurves);
//<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>Σ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ϼ<EFBFBD>Ȧ<EFBFBD>սӽ<D5BD><D3BD><EFBFBD>
int CreateUnitedPolgons(vector<CMyCurve*>& group, float rootValue, vector<CMyCurve*>& dstcurves);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>
CMyCurve* m_rootCurve;
vector<CMyCurve*> m_childCurves;
vector<CPgnNode*> m_nodeVec;
CPgnTree m_tree;
double m_minArea; //<2F><>СȦ<D0A1><C8A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӽڵ<D3BD><DAB5><EFBFBD><E3BCB6>ϵ <20><><EFBFBD><EFBFBD>opencv<63>ã<EFBFBD>
//vector<int><3E><><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>Ԫ<EFBFBD><D4AA> <20><>ʾ 0<><30><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector< vector<int> > m_hierarchy;
};
};
using namespace GObjects;
//<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊһ<CEAA><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غϲ<D8BA><CFB2><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> isInsideFunc<6E><63>ʾp2<70>Ƿ<EFBFBD>λ<EFBFBD><CEBB>p1<70>ڲ<EFBFBD><DAB2>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
AFX_EXT_API CMyCurve* CombinePolygons(vector<CMyCurve*>& polygons,
function<bool(CMyCurve*, CMyCurve*)> insideFunPtr = nullptr);
//ֻ<>ϲ<EFBFBD><CFB2>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD>غϲ<D8BA><CFB2><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AFX_EXT_API void CombinePolygons(vector<CMyCurve*>& polygons, vector<CMyCurve*>& polygonsOut,
function<bool(CMyCurve*, CMyCurve*)> insideFunPtr = nullptr);
//<2F>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>õĶ<C3B5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AFX_EXT_API CMyCurve* CombinePolygons(vector<CPolygonTree*>& pgnTrees);