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.

198 lines
5.9 KiB
C

1 month ago
/**
* @file CCurveClosure.h
* @brief <EFBFBD><EFBFBD><EFBFBD>߱պ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
* @author <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ
* @time 2010-11-30 2012-9-4<EFBFBD>޸<EFBFBD>
*/
#pragma once
#include "stdafx.h"
#include <vector>
#include <iostream>
#include "CurveEx.h"
using namespace std;
#define CPVEC vector<CCrossPointW>
/** @brief <20><><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9>*/
struct AFX_EXT_CLASS CCrossPointW
{
int number[2]; //<2F><><EFBFBD>ɽ<EFBFBD><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷ֱ<DFB7>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĵڼ<C4B5><DABC><EFBFBD><EFBFBD><EFBFBD>
double x;
double y;
double z;
double l[2]; //<2F><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>׮<EFBFBD><D7AE>
CCurveEx* cur[2]; //<2F><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>curve
bool operator ==(const CCrossPointW &cp) const
{
return number[0] == cp.number[0] && number[1] == cp.number[1] &&
fabs(x - cp.x) < 1e-5&&fabs(y - cp.y) < 1e-5&&fabs(z - cp.z) < 1e-5;
}
bool operator <(const CCrossPointW &cp) const
{
if (number[0] < cp.number[0]) return true;
if (number[0] == cp.number[0] && number[1] < cp.number[1])
return true;
else return false;
}
};
/**
* @brief <EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*/
struct AFX_EXT_CLASS NearbyCurveItem
{
CCurveEx* cur; //<2F><><EFBFBD><EFBFBD>
double ls0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><CCBD><EFBFBD><EFBFBD>˳ʱ<CBB3><EFBFBD><EBB7BD><EFBFBD><EFBFBD><EFBFBD>߶ε<DFB6><CEB5><EFBFBD><EFBFBD><EFBFBD>
double ll0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><CCBD><EFBFBD><EFBFBD>˳ʱ<CBB3><EFBFBD><EBB7BD><EFBFBD><EFBFBD><EFBFBD>߶ε<DFB6><CEB5>յ<EFBFBD>
double ls1; //<2F><><EFBFBD>߶ε<DFB6>˳ʱ<CBB3><EFBFBD><EBB7BD><EFBFBD><EFBFBD>ʼ<EFBFBD>˵<EFBFBD>
double ll1; //<2F><><EFBFBD>߶ε<DFB6>˳ʱ<CBB3><EFBFBD><EBB7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>
int ils1Clockwise;//<2F><><EFBFBD>߶ε<DFB6>˳ʱ<CBB3><EFBFBD><EBB7BD><EFBFBD><EFBFBD>ʼ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ill1Clockwise;//<2F><><EFBFBD>߶ε<DFB6>˳ʱ<CBB3><EFBFBD><EBB7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double angle0; //<2F><><EFBFBD>߶ε<DFB6>˳ʱ<CBB3><EFBFBD><EBB7BD><EFBFBD><EFBFBD>ʼ<EFBFBD>˵㻡<CBB5><E3BBA1>, <20><><EFBFBD>ĵ㴹ֱ<E3B4B9><D6B1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʼ<EFBFBD><CABC><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>ʼΪ0
double angle1; //<2F><><EFBFBD>߶ε<DFB6>˳ʱ<CBB3><EFBFBD><EBB7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵㻡<CBB5><E3BBA1>, <20><><EFBFBD>ĵ㴹ֱ<E3B4B9><D6B1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ʼ<EFBFBD><CABC><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>ʼΪ0
bool isBorder;
NearbyCurveItem() {
ls0 = -1;
ll0 = -1;
ls1 = -1;
ll1 = -1;
ils1Clockwise = -1;
ill1Clockwise = -1;
angle0 = -1;
angle1 = -1;
isBorder = TRUE;
}
};
/* @brief <20><><EFBFBD>߱պ<DFB1><D5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
class AFX_EXT_CLASS CCurveClosure
{
public:
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
* @param curveList <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
* @param dMaxExtend <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param dRadius ɨ<EFBFBD><EFBFBD><EFBFBD>
*/
CCurveClosure(CPtrList *curveList = NULL, double dMaxExtend = 0, double dRadius = 1e10);
~CCurveClosure();
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><D5BA><EFBFBD><EFBFBD><EFBFBD>*/
CCurveEx* CreateClosedCurve(dfPoint& dfp);
/** @brief <20><><EFBFBD>ĵ<EFBFBD>*/
void SetCenterPoint(dfPoint& fpt);
/** @brief ɨ<><C9A8><EFBFBD>뾶 */
void SetRadius(double radius);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB3A4> */
void SetMaxExtend(double dMaxExtend);
/** @brief <20><><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Create(CPtrList *CurveList = NULL, double dMaxExtend = 0 , double dRadius = 1e10);//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void ClearAll();
private:
//*************************************************ԭʼ<D4AD>㷨ʵ<E3B7A8><CAB5>********************************************//
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void CurveExtend(CPtrList *CurveList, double dMaxExtend);
/** @brief CurveList<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD><EFBFBD>*/
int GetAllCrossPoints(CPtrList *CurveList, double dMaxExtend = 0);
/** @brief <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,i1->i2Ϊ˳ʱ<CBB3><EFBFBD><EBB7BD>
* ml1 <EFBFBD><EFBFBD>ml2 Ϊnod<EFBFBD><EFBFBD>i1,i2<EFBFBD><EFBFBD>icurve<EFBFBD>϶<EFBFBD>Ӧ׮<EFBFBD><EFBFBD> auxAngle Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ߵļн<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>˳ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int GetInitPoint(CCurveEx* &icurve, double& ml1, double& ml2, int& i1, int& i2, double auxAngletan = 0);
/** @brief <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ijһ׮<D2BB><D7AE>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׮<EFBFBD><D7AE>*/
int GetNearbyLocation(CCurveEx* curve, double l0, double& ls, double& ll);
/** @brief <20>ҵ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>׮<EFBFBD><D7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CrossNod<6F><64><EFBFBD>ţ<EFBFBD><C5A3>õ<EFBFBD><C3B5><EFBFBD>Ӧ׮<D3A6><D7AE>,1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2>غϣ<D8BA>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>nod<6F><64>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nod<6F>غ<EFBFBD>*/
int GetNearbyCrossNods(CCurveEx* curve, double l0, double& lsmaller, double& llarger, int& ismaller, int& ilarger);
/** @brief <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>׮<EFBFBD><D7AE>*/
double GetNextPoint(CCurveEx* curve, double l1, double l2, dfPoint& fpt);
/** @brief ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3BCAF><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD>߶Σ<DFB6><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD> <20><><EFBFBD><EFBFBD>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD>׮<EFBFBD><D7AE><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><E0BDBB><EFBFBD>߶<EFBFBD>,
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_BorderPoints<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nodNum<EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false*/
bool FindNextCurve(CCurveEx* &curve, int& nodNum, double& lahead);
/** @brief
*ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>жϸý<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* cpoint<EFBFBD><EFBFBD>˳ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>,iClockWise = 1Ϊ˳ʱ<EFBFBD> 0Ϊ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>޷<EFBFBD><EFBFBD>жϳ<EFBFBD>
*/
bool GetAuxCrossPoint(dfPoint& auxpt, CCurveEx* &tarCurve, double& tarl0, int& bClockWise);
/** @brief ֱ<>ӵõ<D3B5><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Χ<EFBFBD>ıպ<C4B1><D5BA><EFBFBD><EFBFBD>򣬲<EFBFBD><F2A3ACB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CCurve<76><65><EFBFBD><EFBFBD>*/
bool GetClosurePoints(dfPoint &dfp);
//*************************************************ԭʼ<D4AD>㷨ʵ<E3B7A8><CAB5>********************************************//
//*************************************************<2A>Ľ<EFBFBD><C4BD>㷨ʵ<E3B7A8><CAB5>********************************************//
/** @brief
*ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>жϸý<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* cpoint<EFBFBD><EFBFBD>˳ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>,iClockWise = 1Ϊ˳ʱ<EFBFBD> 0Ϊ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>޷<EFBFBD><EFBFBD>жϳ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD><EFBFBD>
*/
bool GetAuxCrossCurve(dfPoint& auxpt, CCurveEx* &tarCurve, double& tarl0);
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
*/
void ClearNearbyData();
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>.
*
* @param dfp <EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int GetNearbyCurves();
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>.
*
* @return
*/
int SetNearbyCurveCrossNods();
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
* @return
*/
CCurveEx* CreateRegionCurve();
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
* @param pCur
* @param pl
* @param ls
* @param ll
* @param bClockwise
* @return
*/
int ExtractCurveSegment(CCurveEx *pCur, CPointList &pl, double ls, double ll, int bClockwise);
//*************************************************<2A>Ľ<EFBFBD><C4BD>㷨ʵ<E3B7A8><CAB5>********************************************//
public:
CPointList m_BorderPoints; ///< <20>պ<EFBFBD><D5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>
dfPoint m_cpoint; ///<<3C><><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>
CPVEC m_CrossNods; ///<<3C><><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
set<int> m_FoundNodNumSet; ///< <20>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ҹ<EFBFBD><D2B9>Ľ<EFBFBD><C4BD><EFBFBD>
CPtrList *m_pCurveList; ///<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>list
double m_dMaxExtend; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB3A4>
double m_dRadius;
CPtrList *m_pNearbyCurveList; ///<2F><><EFBFBD>ĵ<EFBFBD><C4B5>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD>ŵ<EFBFBD>NearbyCurveItemָ<6D><D6B8>
CPtrList *m_pSelctedCurveList; // <20><><EFBFBD>ŵ<EFBFBD>CCurveExָ<78><D6B8>
};
/** @brief <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>pt1,pt2 <20><>pt2, pt3֮<33><D6AE><EFBFBD>ļн<C4BC>cosֵ*/
double GetCosVal(CPoint2D& pt1, CPoint2D& pt2, CPoint2D& pt3);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double CrossProduct(double x1, double y1, double x2, double y2);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double DotProduct(double x1, double y1, double x2, double y2);