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.

137 lines
3.2 KiB
C

1 month ago
/**************************************************************************************
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Contour2Polygon.h
*****************************************************************************************/
#pragma once
#include "mycurve.h"
#include "TBase/TMultiTree.h"
#include "curvegraph.h"
#include <set>
#include <map>
template<typename T>
void DeepEraseVector(std::vector<T>& vec)
{
for(int i = 0; i < (int)vec.size(); i ++ )
{
if(NULL != vec[i])
delete vec[i];
}
vec.clear();
}
namespace GObjects
{
//class CPolygonTree;
class CC2P : protected CCurveGraph
{
public:
CC2P(void);
virtual ~CC2P(void);
void ClearAll(void);
void SetLines(vector<CMyCurve*>& vec);
void SetHoles(vector<CMyCurve*>& scrFlts);
void SetBorder(CMyCurve& border);
void SetExtensivePara(double dext) { m_dext = dext; }
double GetExtensivePara(void) const { return m_dext; }
void CreatePolygons(void); //
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);
static bool IsCurveInside(CMyCurve* pRange, CMyCurve* pSubj);
//override
protected:
virtual int GetCrossPoints(void);
virtual PT3Node* GetNextNode(PT3Node* pLastNode, PT3Node* pCurrentNode);
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;
};
void Trace(void);
void TraceBorderPolygons(CMyCurve* border);
bool TraceFltSegPolygon(CMyCurve* curve, SCRPoint* startSCRPt, bool bBorder);
void TraceFltPolygons(CMyCurve* flt);
void TraceContourPolygons(CMyCurve* pContour);
CMyCurve* CreateOneOpenPolygon(list<PT3Node*>& lstNodes);
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_lines;
vector<CMyCurve*> m_bd_faults;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
vector<CMyCurve*> m_dstPolygons;
void TraceOutputCircles(list<CMyCurve*>& closingCurves);
void CombineOpenPolygons(void);
bool IsFltZ(double z);
void GetBorderCXNodes(void);
void FilterDstPolygons(void);
bool IsPolygonLegal(CMyCurve* pgn);
virtual bool IsNodeAvaliable(PT3Node* pNode) override;
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;
vector<int> m_circleIndexes;
map<int, list<int> > m_mapFltNodes;
vector<CRect8> m_rectFlts;
double m_maxVal;
double m_minVal;
double m_conStep;
const double m_dFLTZ;
bool m_bCheckZ;
set<PT3Node*> m_borderCxNodes;
set<CMyCurve*> m_borderPolygons;
bool m_bBorderTracing;
};
};
using namespace GObjects;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef TTreeNode<CMyCurve*> CPgnNode;
typedef TMultiTree<CMyCurve*> CPgnTree;