237 lines
8.6 KiB
C
237 lines
8.6 KiB
C
// PDSLocate.h
|
|
|
|
#if !defined(PDSLocate_h)
|
|
#define PDSLocate_h
|
|
|
|
#include <afxwin.h>
|
|
#include <afxtempl.h>
|
|
|
|
#define PDSLOCATE_SAMEPOINTERROR 5.0; // 判断两个点相等的最大误差值,<=该值的点认为是同一个
|
|
|
|
//查找点的位置
|
|
//输入参数:
|
|
// listPoint 点链
|
|
// ptPoint 给定的点
|
|
//返回值:
|
|
// 在listPoint中与ptPoint坐标相同的点的位置,
|
|
// 如listPoint中没有与ptPoint的坐标相同的点则返回NULL.
|
|
POSITION FindPointAtPointList(CList<CPoint,CPoint>& listPoint,CPoint ptPoint);
|
|
//查找点的位置
|
|
//输入参数:
|
|
// listPoint 点链
|
|
// ptPoint 给定的点
|
|
// dMaxError 最大误差,若<0则根据CONST_SAME_POINT_ERROR进行查找
|
|
//返回值:
|
|
// 在listPoint中与ptPoint的距离小于dMaxError的最近点的位置,
|
|
// 如listPoint中没有与ptPoint的距离小于dMaxError的点则返回NULL.
|
|
POSITION FindPointAtPointList(CList<CPoint,CPoint>& listPoint,CPoint ptPoint,double dMaxError);
|
|
|
|
//判断一点在多边形中的位置
|
|
//特别说明:
|
|
// [20170830 syf]新增dSamePointError变量
|
|
//输入参数:
|
|
// listPolygon 多边形的点链
|
|
// ptPoint 给定的点
|
|
// dSamePointError 判断两个点相等的误差值,<=该值的点认为是同一个
|
|
// >0 直接使用该值做判断
|
|
// =0 坐标完全相等的点才是同一个,否则不是
|
|
// <0 本函数自动使用 CONST_SAME_POINT_ERROR 做判断
|
|
//输出参数:
|
|
// posPrev 前点的位置,若为NULL,表示pos前面的所有点都不满足dSamePointError条件
|
|
// pos ptPoint的位置(该位置的点未必等于ptPoint,满足dSamePointError条件)
|
|
// posNext 后点的位置,若为NULL,表示pos后面的所有点都不满足dSamePointError条件
|
|
//返回值:
|
|
// =true 匹配成功(此时的posPrev与posNext可能为NULL),=false 匹配失败
|
|
BOOL PointPosOfPolygon(CList<CPoint,CPoint>& listPolygon,CPoint ptPoint,POSITION& posPrev,POSITION& pos,POSITION& posNext,double dSamePointError = 0.0);
|
|
|
|
//判断一点在多边形中的位置,并输出前后点
|
|
//输入参数:
|
|
// listPolygon 多边形的点链
|
|
// ptPoint 给定的点
|
|
// dSamePointError 判断两个点相等的误差值,<=该值的点认为是同一个
|
|
// >0 直接使用该值做判断
|
|
// =0 坐标完全相等的点才是同一个,否则不是
|
|
// <0 本函数自动使用 CONST_SAME_POINT_ERROR 做判断
|
|
//输出参数:
|
|
// ptPrev 前点
|
|
// ptNext 后点
|
|
//返回值:
|
|
// =true 计算成功,=false 计算失败
|
|
BOOL PointPosOfPolygon(CList<CPoint,CPoint>& listPolygon,CPoint ptPoint,CPoint& ptPrev,CPoint& ptNext,double dSamePointError = 0.0);
|
|
|
|
//判断一点在折线中的位置
|
|
//特别说明:
|
|
// [20170830 syf]新增dSamePointError变量
|
|
//输入参数:
|
|
// listPolyline 折线的点链
|
|
// ptPoint 给定的点
|
|
// dSamePointError 判断两个点相等的误差值,<=该值的点认为是同一个
|
|
// >0 直接使用该值做判断
|
|
// =0 坐标完全相等的点才是同一个,否则不是
|
|
// <0 本函数自动使用 CONST_SAME_POINT_ERROR 做判断
|
|
//输出参数:
|
|
// posPrev 前点的位置,若为NULL,表示pos前面的所有点都不满足dSamePointError条件
|
|
// pos ptPoint的位置(该位置的点未必等于ptPoint,满足dSamePointError条件)
|
|
// posNext 后点的位置,若为NULL,表示pos后面的所有点都不满足dSamePointError条件
|
|
//返回值:
|
|
// =true 匹配成功(此时的posPrev与posNext可能为NULL),=false 匹配失败
|
|
BOOL PointPosOfPolyline(CList<CPoint,CPoint>& listPolyline,CPoint ptPoint,POSITION& posPrev,POSITION& pos,POSITION& posNext,double dSamePointError = 0.0);
|
|
|
|
//求多边形中距离ptPoint最近的位置
|
|
//输入参数:
|
|
// listPolygon 多边形的点链
|
|
// dMaxError 最大误差
|
|
// ptPoint 给定的点
|
|
//返回值:
|
|
// 如果ptPoint与多边形的最近距离 <= dMaxError,则返回true,其中:
|
|
// ptFixPoint 多边形中距离ptPoint最近的位置
|
|
// dDistance 实际距离
|
|
// pos 是ptPoint的位置,如ptPoint不是点链上的点则pos=NULL.
|
|
// posPrev,posNext 是ptPoint的前后点的位置
|
|
// 如果ptPoint与多边形的最近距离 > dMaxError,则返回false.
|
|
BOOL FixPointAtPolygon(CList<CPoint,CPoint>& listPolygon,double dMaxError,CPoint ptPoint,
|
|
CPoint& ptFixPoint,double& dDistance,
|
|
POSITION& posPrev,POSITION& pos,POSITION& posNext);
|
|
|
|
//求折线中距离ptPoint最近的位置
|
|
//输入参数:
|
|
// listPolyline 折线的点链
|
|
// ptPoint 给定的点
|
|
//返回值:
|
|
// 如果ptPoint与折线的最近距离 <= dMaxError,则返回true,其中:
|
|
// ptFixPoint 折线中距离ptPoint最近的位置
|
|
// dDistance 实际距离
|
|
// pos 是ptPoint的位置,如ptPoint不是点链上的点则pos=NULL.
|
|
// posPrev,posNext 是ptPoint的前后点的位置
|
|
// 如果ptPoint与折线的最近距离 > dMaxError,则返回false.
|
|
BOOL FixPointAtPolyline(CList<CPoint,CPoint>& listPolyline,double dMaxError,CPoint ptPoint,
|
|
CPoint& ptFixPoint,double& dDistance,
|
|
POSITION& posPrev,POSITION& pos,POSITION& posNext);
|
|
|
|
//求线段中距离ptPoint最近的位置
|
|
//输入参数:
|
|
// ptPointS,ptPointE 线段的点
|
|
// ptPoint 给定的点
|
|
//输出参数:
|
|
// ptFixPoint 线段中距离ptPoint最近的位置
|
|
// dDistance 实际距离
|
|
//返回值:
|
|
// 如果ptPoint与线段的最近距离 <= dMaxError,则返回true,其中:
|
|
// ptFixPoint 线段中距离ptPoint最近的位置
|
|
// dDistance 实际距离
|
|
// 如果ptPoint与折线的最近距离 > dMaxError,则返回false.
|
|
BOOL FixPointAtLineSegment(CPoint ptPointS,CPoint ptPointE,double dMaxError,CPoint ptPoint,
|
|
CPoint& ptFixPoint,double& dDistance);
|
|
|
|
//求点ptPoint与直线的最近距离点.
|
|
//注意:与FixPointAtLineSegment的区别是FixPointAtLineSegment求线段的最近点.
|
|
//输入参数:
|
|
// ptPointS,ptPointE 直线的点
|
|
// ptPoint 给定的点
|
|
//输出参数:
|
|
// ptFixPoint 直线中距离ptPoint最近的位置
|
|
//返回值:
|
|
// ptPoint与直线的距离
|
|
double FixPointAtLine(CPoint ptPointS,CPoint ptPointE,CPoint ptPoint,CPoint& ptFixPoint);
|
|
|
|
//计算距离点
|
|
//输入参数:
|
|
// listPolygon
|
|
// ptPointS
|
|
// dDistance >=0 计算从ptPointS开始往后距离dDistance的点,
|
|
// <0 计算从ptPointS开始往前距离-dDistance的点.
|
|
//输出参数:
|
|
// ptPoint
|
|
//返回值:
|
|
// =true 成功计算出距离点,否则false
|
|
BOOL GetDistancePointOfPolygon(CList<CPoint,CPoint>& listPolygon,CPoint ptPointS,double dDistance,CPoint& ptPoint);
|
|
|
|
//计算距离点
|
|
//输入参数:
|
|
// iDPMM 长度分辨率(一个内部单位即为1/iDPMM毫米)
|
|
// listPolyline
|
|
// ptPointS
|
|
// dDistance >=0 计算从ptPointS开始往后距离dDistance的点,
|
|
// <0 计算从ptPointS开始往前距离-dDistance的点.
|
|
//输出参数:
|
|
// ptPoint
|
|
//返回值:
|
|
// =true 成功计算出距离点,否则false
|
|
BOOL GetDistancePointOfPolyline(int iDPMM,CList<CPoint,CPoint>& listPolyline,CPoint ptPointS,double dDistance,CPoint& ptPoint);
|
|
BOOL GetDistancePointOfPolyline(CList<CPoint,CPoint>& listPolyline,POSITION pos,double dDistance,CPoint& ptPoint);
|
|
//计算距离点
|
|
//该函数与GetDistancePointOfPolyline(...)的区别在于当搜索长度不够时GetDistancePointOfPolylineEx可以延长到线外
|
|
//输入参数:
|
|
// listPolyline
|
|
// iDPMM 长度分辨率(一个内部单位即为1/iDPMM毫米)
|
|
// ptPointS
|
|
// dDistance >=0 计算从ptPointS开始往后距离dDistance的点,
|
|
// <0 计算从ptPointS开始往前距离-dDistance的点.
|
|
//输出参数:
|
|
// ptPoint
|
|
//返回值:
|
|
// =true 成功计算出距离点,否则false
|
|
BOOL GetDistancePointOfPolylineEx(int iDPMM,CList<CPoint,CPoint>& listPolyline,CPoint ptPointS,double dDistance,CPoint& ptPoint);
|
|
//计算距离点
|
|
//输入参数:
|
|
// listPolyline
|
|
// iDPMM 长度分辨率(一个内部单位即为1/iDPMM毫米)
|
|
// pos
|
|
// dDistance >=0 计算从ptPointS开始往后距离dDistance的点,
|
|
// <0 计算从ptPointS开始往前距离-dDistance的点.
|
|
//输出参数:
|
|
// ptPoint
|
|
//返回值:
|
|
// =true 成功计算出距离点,否则false
|
|
BOOL GetDistancePointOfPolylineEx(int iDPMM,CList<CPoint,CPoint>& listPolyline,POSITION pos,double dDistance,CPoint& ptPoint);
|
|
|
|
//计算距离点
|
|
//输入参数:
|
|
// listPolyline
|
|
// dDistance >=0 计算从链头开始往后距离dDistance的点,
|
|
// <0 计算从链尾开始往前距离-dDistance的点.
|
|
//输出参数:
|
|
// ptPoint
|
|
// posPrev ptPoint的前点位置
|
|
// pos ptPoint的位置,若=NULL,则ptPoint不是listPolyline中的点,否则是listPolyline中的点
|
|
// posNext ptPoint的后点位置
|
|
//返回值:
|
|
// =true 成功计算出距离点,否则false
|
|
BOOL GetDistancePointOfPolyline(CList<CPoint,CPoint>& listPolyline,double dDistance,CPoint& ptPoint,POSITION &posPrev,POSITION &pos,POSITION &posNext);
|
|
|
|
//确定一点在线上的位置.
|
|
//特别说明:该函数不检查点是否在线上!!!
|
|
//输入参数:
|
|
// listPoint 已有的点
|
|
// ptPoint 需确定的点
|
|
//输出参数:
|
|
// pos ptPoint的插入位置
|
|
//返回值:
|
|
// ptPoint的插入序号
|
|
int InsertPointAtLine(CList<CPoint,CPoint> &listPoint,CPoint ptPoint,POSITION &pos);
|
|
|
|
//计算切线点
|
|
//输入参数:
|
|
// listPolygon
|
|
// ptPointS
|
|
// dDistance >=0 计算从ptPointS开始往后最短距离dDistance的切线点,
|
|
// <0 计算从ptPointS开始往前最短距离-dDistance的切线点.
|
|
//输出参数:
|
|
// ptPoint
|
|
//返回值:
|
|
// =true 成功计算出切线点,否则false
|
|
BOOL GetTangentPointOfPolygon(CList<CPoint,CPoint>& listPolygon,CPoint ptPointS,double dDistance,CPoint& ptPoint);
|
|
//计算切线点
|
|
//输入参数:
|
|
// listPolyline
|
|
// ptPointS
|
|
// dDistance >=0 计算从ptPointS开始往后最短距离dDistance的切线点,
|
|
// <0 计算从ptPointS开始往前最短距离-dDistance的切线点.
|
|
//输出参数:
|
|
// ptPoint
|
|
//返回值:
|
|
// =true 成功计算出切线点,否则false
|
|
BOOL GetTangentPointOfPolyline(CList<CPoint,CPoint>& listPolyline,CPoint ptPointS,double dDistance,CPoint& ptPoint);
|
|
|
|
#endif
|