#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 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 m_crossList; POSITION FindCurve(long nNumber, CList& locList, bool* bFirst); int LinkLocationCurve(CList &locList1, CList &locList2);//结果保存在m_ptrCurveList中 void SortLocation2(CList& crossList, CCurveEx* pc2); int CrossCurve(CCurveEx* pc1, CCurveEx* pc2, CList& crossList); int GetCurveOutside(CCurveEx* pCurve, CCurveEx* pCurveRange, CList& loca); int GetCurveInside(CCurveEx* pCurve, CCurveEx* pCurveRange, CList& 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 GetStartEndIndex(const CCurveEx& curve) const noexcept; };