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.

89 lines
4.4 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
};