|
|
#pragma once
|
|
|
#include "curveex.h"
|
|
|
#include "One.h"
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
//功能: 计算两条曲线相与
|
|
|
//编程:
|
|
|
//日期: 2006-3-6
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
class AFX_EXT_CLASS CCurveAnd
|
|
|
{
|
|
|
public:
|
|
|
CCurveAnd(void);
|
|
|
virtual ~CCurveAnd(void);
|
|
|
|
|
|
//void SetCurve(COne* pOne1, COne* pOne2); //为COne对象, 为了考虑光滑情况而设
|
|
|
void SetCurve(CCurveEx* pCurve1, CCurveEx* pCurve2);
|
|
|
CList<CCurveEx,CCurveEx> m_selectList;
|
|
|
CCurveEx* m_pCurve1;
|
|
|
CCurveEx* m_pCurve2; //一般情况下,指定为范围线
|
|
|
int m_bSmooth1;
|
|
|
int m_bSmooth2;
|
|
|
|
|
|
//结果保存列表////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
CCrossList m_resultList; //不按充填方式计算后在范围内的线段
|
|
|
CPtrList m_ptrCurveList; //两条曲线相与后的结果,在内部并不删除,仅是移空
|
|
|
|
|
|
void RemoveAll(void); //释放相与后的内存,将相与后的结果删除
|
|
|
|
|
|
int GetResultCurve(CCurveEx& curve, POSITION pos); //获得m_resultList中的结果
|
|
|
|
|
|
//获得范围内曲线///////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
int GetCurve1InCurve2(void); //获得Curve1在Curve2中的曲线个数,结果保存在m_resultList中
|
|
|
int GetCurve2InCurve1(void); //获得Curve2在Curve1中的曲线个数,结果保存在m_resultList中
|
|
|
|
|
|
//获得范围外曲线///////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
int GetCurve1OutCurve2(void); //获得Curve1不在Curve2中的曲线个数,结果保存在m_resultList中
|
|
|
int GetCurve2OutCurve1(void); //获得Curve2不在Curve1中的曲线个数,结果保存在m_resultList中
|
|
|
|
|
|
//曲线与、或、非、相交函数////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
int GetAndCurve(); //获得两条曲线相与的结果,结果保存在m_ptrCurveList中,为CCurveEx对象
|
|
|
int GetXorCurve(); //获得两条曲线相的异或结果,结果保存在m_ptrCurveList中,为CCurveEx对象
|
|
|
int GetOrCurve(); //获得两条曲线相的异或结果
|
|
|
int GetCrossCurve(); //曲线相交
|
|
|
int GetCurveOR(CCurveEx* curve1, CCurveEx* curve2);
|
|
|
int GetCurve1XorCurve2(void); //获得Curve1不在Curve2中的异或曲线,结果保存在m_ptrCurveList中,为CCurveEx对象
|
|
|
int GetCurve2XorCurve1(void); //获得Curve2不在Curve1中的异或曲线,结果保存在m_ptrCurveList中,为CCurveEx对象
|
|
|
|
|
|
public:
|
|
|
|
|
|
int GetCurveXOR(CCurveEx* pCurve, CCurveEx* pCurveRange); //获得pCurve在pCurveRange外面的异或曲线边界
|
|
|
|
|
|
//不按充填方式计算
|
|
|
int GetCurveInside(CCurveEx* pCurve, CCurveEx* pCurveRange); //获得pCurve在pCurveRange中的曲线
|
|
|
int GetCurveOutside(CCurveEx* pCurve, CCurveEx* pCurveRange); //获得pCurve不在pCurveRange中的曲线
|
|
|
|
|
|
////判断给定的桩号内的曲线是否在指定曲线范围内
|
|
|
int IsInsideLine(double l1, double l2, CCurveEx* pCurve, CCurveEx* pCurveRange);
|
|
|
////判断给定的桩号内的两端组成的曲线是否在指定曲线范围内
|
|
|
int IsInsideOtherLine(double l1, double l2, CCurveEx* pCurve, CCurveEx* pCurveRange);
|
|
|
|
|
|
//按充填方式计算///////////////////////////////////////////////////////////////////////////////////////////
|
|
|
//在类中的两个桩号表示曲线的开始结束
|
|
|
class CLocationCurve : public CCrossPoint
|
|
|
{
|
|
|
public:
|
|
|
CLocationCurve(void);
|
|
|
void Clone(CCrossPoint& cp);
|
|
|
void GetCurve(CPointList& pd, bool bFirst);
|
|
|
|
|
|
long num[2]; //首尾节点号,当为交点时,两个号是交点序号
|
|
|
bool m_bOther; //是否是两端连起来的线
|
|
|
};
|
|
|
CList<CLocationCurve, CLocationCurve> m_crossList;
|
|
|
POSITION FindCurve(long nNumber, CList<CLocationCurve, CLocationCurve>& locList, bool* bFirst);
|
|
|
int LinkLocationCurve(CList<CLocationCurve, CLocationCurve> &locList1, CList<CLocationCurve, CLocationCurve> &locList2);//结果保存在m_ptrCurveList中
|
|
|
void SortLocation2(CList<CLocationCurve, CLocationCurve>& crossList, CCurveEx* pc2);
|
|
|
int CrossCurve(CCurveEx* pc1, CCurveEx* pc2, CList<CLocationCurve, CLocationCurve>& crossList);
|
|
|
int GetCurveOutside(CCurveEx* pCurve, CCurveEx* pCurveRange, CList<CLocationCurve, CLocationCurve>& loca);
|
|
|
int GetCurveInside(CCurveEx* pCurve, CCurveEx* pCurveRange, CList<CLocationCurve, CLocationCurve>& loca);
|
|
|
|
|
|
private:
|
|
|
bool IsCurveReversed(const CCurveEx& curve) const noexcept;
|
|
|
int GetCurveOutsideWithIntersections(CCurveEx* pCurve, CCurveEx* pCurveRange, CCrossList& crossList) noexcept;
|
|
|
static CCrossPoint CreateCrossPoint(double x1, double x2, CCurveEx* pCurve) noexcept;
|
|
|
std::pair<int, int> GetStartEndIndex(const CCurveEx& curve) const noexcept;
|
|
|
};
|