|
|
|
|
|
#pragma once
|
|
|
|
|
|
#ifndef AFX_EXT_CLASS
|
|
|
|
|
|
#define AFX_EXT_CLASS Q_DECL_IMPORT
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#include "TBase/TGraph.h"
|
|
|
|
|
|
#include "mycurve.h"
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
#include <map>
|
|
|
|
|
|
#include <set>
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
|
|
namespace GObjects
|
|
|
|
|
|
{
|
|
|
|
|
|
class CCurveGraph
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
CCurveGraph(void);
|
|
|
|
|
|
virtual ~CCurveGraph(void);
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
virtual void ReadCurves(CCurveList& curList);
|
|
|
|
|
|
virtual void ReadCurves(vector<CMyCurve*>& curVec);
|
|
|
|
|
|
//<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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
|
|
|
|
|
|
int ConstructNodeGraph(void);
|
|
|
|
|
|
void Clear(void); //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
enum ESide
|
|
|
|
|
|
{
|
|
|
|
|
|
eRight = 0, //<2F>Ҳ<EFBFBD>
|
|
|
|
|
|
eLeft = 1, //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
|
eCollineation = 2 //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
typedef TGraphNode<GBase::CPoint3D> PT3Node;
|
|
|
|
|
|
typedef list<PT3Node* >::iterator PT3ITER;
|
|
|
|
|
|
typedef TGraph<GBase::CPoint3D> PT3Graph;
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief <20><><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9>*/
|
|
|
|
|
|
class SCRPoint/*:public PT3Node*/
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
SCRPoint() :m_pNode(0) {}
|
|
|
|
|
|
PT3Node* m_pNode; //<2F><><EFBFBD>㴦<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
|
|
|
|
|
|
std::map<CMyCurve*, double> curLMap; //<2F>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<D3A6><D7AE>
|
|
|
|
|
|
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Ժϲ<D4BA>
|
|
|
|
|
|
inline bool canSplice(const SCRPoint& cr) const
|
|
|
|
|
|
{
|
|
|
|
|
|
if (0 == m_pNode || 0 == cr.m_pNode)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
if (fabs(m_pNode->GetValue().x0 - cr.m_pNode->GetValue().x0) < 1e-6 &&
|
|
|
|
|
|
fabs(m_pNode->GetValue().y0 - cr.m_pNode->GetValue().y0) < 1e-6)
|
|
|
|
|
|
return true;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD>
|
|
|
|
|
|
inline void Splice(SCRPoint& crpt)
|
|
|
|
|
|
{
|
|
|
|
|
|
curLMap.insert(crpt.curLMap.begin(), crpt.curLMap.end());
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lstClosedNodes<65>еĺ<D0B5><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>պ<EFBFBD><D5BA><EFBFBD>·,<2C><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>µ<EFBFBD>==pStartʱ<74><CAB1><EFBFBD><EFBFBD><EFBFBD>ҳɹ<D2B3> bLeftSide = <20><>·<EFBFBD><C2B7><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
|
|
|
|
|
|
virtual bool TraceClosedLinks(PT3Node* pStart, list<PT3Node*>& foundNodes, ESide side, bool bForward);
|
|
|
|
|
|
//<2F>жϽ<D0B6><CFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
virtual bool IsNodeAvaliable(PT3Node* pNode) { return true; }
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡ2<C8A1><32>1<EFBFBD><31><EFBFBD>IJ<EFBFBD>
|
|
|
|
|
|
static CCurveGraph::ESide GetV2Side(double x1, double y1, double x2, double y2);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
protected:
|
|
|
|
|
|
void SetSide(ESide side) { m_nSide = side; } //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><D2B7><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַһ<D6B7>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ཻ
|
|
|
|
|
|
int GetCrossPoints(vector<CMyCurve*>& clipCurves, vector<CMyCurve*>& subjCurves);
|
|
|
|
|
|
//<2F><>ȡvector<CCurve*><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD>
|
|
|
|
|
|
int GetCurveRects(vector<CMyCurve*>& scrCurves, vector<GBase::CRect8>& dstRects);
|
|
|
|
|
|
bool IsIntersect(const GBase::CRect8& rt1, const GBase::CRect8& rt2);
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ߵĽ<DFB5><C4BD><EFBFBD>ͼ lst<73><74>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵĽ<CFB5><C4BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
int ConstructNodeGraph(CMyCurve* pc, list<SCRPoint* >& lst);
|
|
|
|
|
|
//<2F><><EFBFBD>ɽ<EFBFBD><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
|
|
|
|
|
|
int CreateNormalNodes(CMyCurve* pc, double lstart, double lend, list<PT3Node*>& nodeList);
|
|
|
|
|
|
//<2F><>nodelist<73>е<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_graph
|
|
|
|
|
|
void InsertNodes(list<PT3Node*>& nodeList);
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
|
|
|
|
|
virtual PT3Node* GetNextNode(PT3Node* pLastNode, PT3Node* pCurrentNode);
|
|
|
|
|
|
//<2F>Ӻ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ѡȡ<D1A1><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
PT3Node* SelectNextFromCandidate(PT3Node* pLastNode, PT3Node* pCurrentNode, vector<PT3Node*>& candidate);
|
|
|
|
|
|
vector<CMyCurve*> m_curVec;
|
|
|
|
|
|
vector<SCRPoint*> m_crossPoints;///<<3C><><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
map<CMyCurve*, list<SCRPoint* > > m_curScx_map; // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>Ӧ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>ָ<EFBFBD><D6B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cur<75>е<EFBFBD><EFBFBD><D7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
PT3Graph m_graph; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
|
|
|
|
|
|
|
|
|
|
|
|
std::set<PT3Node*> m_storedMNodes; //temporary InsertNodes<65><73><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>
|
|
|
|
|
|
int m_startIndex; //temporary <20><><EFBFBD>ɽ<EFBFBD><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ʱ<EFBFBD>õ<EFBFBD>CreateNormalNodes
|
|
|
|
|
|
|
|
|
|
|
|
bool m_bForward; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
ESide m_nSide; // 0 Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA> 1Ϊ<31><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA> 2Ϊ<32><CEAA><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
using namespace GObjects;
|