// PDSLocate.h #if !defined(PDSLocate_h) #define PDSLocate_h #include #include #define PDSLOCATE_SAMEPOINTERROR 5.0; // 判断两个点相等的最大误差值,<=该值的点认为是同一个 //查找点的位置 //输入参数: // listPoint 点链 // ptPoint 给定的点 //返回值: // 在listPoint中与ptPoint坐标相同的点的位置, // 如listPoint中没有与ptPoint的坐标相同的点则返回NULL. POSITION FindPointAtPointList(CList& listPoint,CPoint ptPoint); //查找点的位置 //输入参数: // listPoint 点链 // ptPoint 给定的点 // dMaxError 最大误差,若<0则根据CONST_SAME_POINT_ERROR进行查找 //返回值: // 在listPoint中与ptPoint的距离小于dMaxError的最近点的位置, // 如listPoint中没有与ptPoint的距离小于dMaxError的点则返回NULL. POSITION FindPointAtPointList(CList& 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& 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& 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& 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& 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& 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& 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& listPolyline,CPoint ptPointS,double dDistance,CPoint& ptPoint); BOOL GetDistancePointOfPolyline(CList& 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& 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& 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& listPolyline,double dDistance,CPoint& ptPoint,POSITION &posPrev,POSITION &pos,POSITION &posNext); //确定一点在线上的位置. //特别说明:该函数不检查点是否在线上!!! //输入参数: // listPoint 已有的点 // ptPoint 需确定的点 //输出参数: // pos ptPoint的插入位置 //返回值: // ptPoint的插入序号 int InsertPointAtLine(CList &listPoint,CPoint ptPoint,POSITION &pos); //计算切线点 //输入参数: // listPolygon // ptPointS // dDistance >=0 计算从ptPointS开始往后最短距离dDistance的切线点, // <0 计算从ptPointS开始往前最短距离-dDistance的切线点. //输出参数: // ptPoint //返回值: // =true 成功计算出切线点,否则false BOOL GetTangentPointOfPolygon(CList& listPolygon,CPoint ptPointS,double dDistance,CPoint& ptPoint); //计算切线点 //输入参数: // listPolyline // ptPointS // dDistance >=0 计算从ptPointS开始往后最短距离dDistance的切线点, // <0 计算从ptPointS开始往前最短距离-dDistance的切线点. //输出参数: // ptPoint //返回值: // =true 成功计算出切线点,否则false BOOL GetTangentPointOfPolyline(CList& listPolyline,CPoint ptPointS,double dDistance,CPoint& ptPoint); #endif