PlotterHMI/datafile/dxf/dxflib/PDSMath/PDSLocate.h
huahaiyan 9f74511e69 20240315
1、增加数据分割功能(完成)
2、更换dxf库(进行中)
2024-03-15 16:49:50 +08:00

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