#if !defined(DxfMath_h) #define DxfMath_h #include #include #include #include "GroupCode.h" #define CONST_PI 3.14159265359 //样点旋转 //输入参数: // (dX,dY)被旋转点,(dXO,dYO)旋转原点,dSinBeta,dCosBeta逆时针旋转角度的正余弦 //输出参数: // (dXNew,dYNew)旋转后的值 void PointRotate_D(double dX,double dY,double dXO,double dYO,double dSinBeta,double dCosBeta,double& dXNew,double& dYNew); //样点旋转 //输入参数: // pdPoint被旋转点,pdPointO旋转原点,dSinBeta,dCosBeta逆时针旋转角度的正余弦 //输出参数: // pdPoint旋转后的值 void PointRotate(CPointData &pdPoint,CPointData pdPointO,double dSinBeta,double dCosBeta); //求两点距离 //返回值 // dLength 两点间距离的双精度值 double TwoPointLength(CPointData pdPoint1,CPointData pdPoint2); //求矢量pdPointS1→pdPointE1逆时针方向旋转到矢量pdPointS2→pdPointE2的方向所经过的夹角,在[0,2pi)之间 //输入参数: // pdPointS1,pdPointE1 矢量pdPointS1→pdPointE1 // pdPointS2,pdPointE2 矢量pdPointS2→pdPointE2 //返回值: // 夹角 double angle_2(CPointData pdPointS1,CPointData pdPointE1,CPointData pdPointS2,CPointData pdPointE2); //得到pdPoint1,pdPoint2的中间点 pdMiddle void GetMiddlePoint(CPointData pdPoint1, CPointData pdPoint2, CPointData &pdMiddle); //获得沿直线 pdPoint0, pdPoint1方向,到pdPoint0距离为 dDistance 的点 CPointData GetPointOnLine(CPointData pdPoint0, CPointData pdPoint1, double dLength); int IntTrans(double x); //计算一条链表的有向面积 //输入: // listPoint 点链. //输出: // 无. //返回值: // 面积. //说明: // 此面积为有向面积. // 在世界坐标系下. double Area(CPointDataList& listPoint); //计算point在线段ptS→ptE上的参数值 //输入: // point 点. // (ptS,ptE) 线段. //输出: // 无. //返回值: // [0,1]点在线段上,并且就在两点之间;否则,点在线段的延长线上. //说明: // 线段的两个端点不应该相等. // 这三个点应共线,此函数不作判断. double PointToParam(CPointData& point, CPointData& ptS, CPointData& ptE); //求点一点到一条线段的垂足. //输入: // 线段(ptS,ptE) // ptRes 点. //输出: // ptDes 垂足点. //返回值: // 无. //说明: // 输入线段的两个端点不应该相同,否则输出点和输入点赋值相同. // 垂足未必落在线段上. void GetVerticalPoint(CPointData& ptS, CPointData& ptE, CPointData& ptRes, CPointData& ptDes); //判断两条线段是否平行 //输入: // 线段(ptS0,ptE0),(ptS1,ptE1) //输出: // 无. //返回值: // =TRUE,两线平行;=FALSE,两线不平行. //说明: // 每条线段的两端点都不应相同,如果发生些种情况,则认为两线平行. BOOL IsParallel(CPointData& ptS0, CPointData& ptE0, CPointData& ptS1, CPointData& ptE1); //计算一个点到一条链表的距离. //输入: // point 点. // listPoint 链表. //输出: // 无. //返回值: // 距离.点到各线段距离中的最小值. //说明: double DistanceFromPointToList(CPointData& point, CPointDataList& listPoint); //计算圆弧控制点 //输入参数: // dAngleS 圆弧开始角度 参考水平 // dAngleE 圆弧结束角度 参考水平 // PDCenter 圆心 // dRadius 半径 //输出参数: // listCtrlPoint 圆的控制点 void CalculateArcPoint(double dAngleS, double dAngleE, CPointData PDCenter, double dRadius, CPointDataList &listCtrlPoint); //计算圆控制点 //输入参数: // PDCenter 圆心 // dRadius 半径 //输出参数: // listCtrlPoint 圆的控制点 void CalculateCirclePoint(CPointData PDCenter, double dRadius, CPointDataList &listCtrlPoint); //计算椭圆控制点 //输入参数: // dAngleS, dAngleE 开始结束角度 如果dAngleS到dAngleE为360度,表示为整个椭圆 dAngleE > dAngleS 顺序针,反之为逆时针 // PDCenter 椭圆中心点 // PDAxis 椭圆长轴的一个端点(坐标相对中心点) // dProportion //长轴和短轴比例 //输出参数: // listCtrlPoint 控制点 //返回值: // 只有在输出参数个数大于2有效;=true 整个椭圆;=false 部分椭圆 BOOL CaculateEllipse(double dAngleS, double dAngleE, CPointData PDCenter, CPointData PDAxis, double dProportion, CPointDataList &listCtrlPoint); //删除重合曲线 //[输入][输出] listAllCurveInfor 曲线, 要求曲线中没有闭合曲线 void DeleteSameCurve(CCurveNotchInforList &listAllCurveInfor); //删除与CurveInfor重合(完全重合)的曲线 //[输入][输出] CurveInfor 曲线 //[输入][输出] listAllCurveInfor 所有曲线,输出参数:重合的曲线被删除 void FindSameCurveAndDelete(CCurveNotchInfor &CurveInfor, CCurveNotchInforList &listAllCurveInfor); //在给定的曲线中寻找所有闭合曲线 //[输入][输出] listAllCurveInfor 所有曲线 输出时没有listAllCloseCurve中的曲线 //[输出] listAllCloseCurve 所有的闭合曲线 //[输入] iFileType 文件类型 =0 AutoCAD文件 ;=1 AAMA/ASTM/TIIP void GetAllCloseCurve(CCurveNotchInforList &listAllCurveInfor, CCloseCurveInforList &listAllCloseCurve, int iFileType); //在给定的曲线中寻找闭合点链 //[输入][输出] listAllCurveInfor 所有曲线 输出时没有CloseCurveInfo中的曲线 //[输出] CloseCurveInfo 闭合点链 返回值为true有效 //[输出] CurveInforFirst 内有找到闭合曲线的开始点链,返回值为false有效 //返回值: // =true 找到;=false没有找到 BOOL GetCloseCurve(CCurveNotchInforList &listAllCurveInfor, CCloseCurveInfor &CloseCurveInfo, CCurveNotchInfor &CurveInforFirst); //找控制点最多的点链 //[输入][输出] listAllCurveInfor 所有点链 输出中不包含MaxCtrlCurveInfor //[输出] MaxCtrlCurveInfor 控制点最多的点链 void FindCtrlMaxCount(CCurveNotchInforList &listAllCurveInfor, CCurveNotchInfor &MaxCtrlCurveInfor); //寻找开始曲线,得到最左边的曲线 void FindStartCurve(CCurveNotchInforList &listAllCurveInfor, CCurveNotchInfor &StartCtrlCurveInfor); //寻找对接的下一段 //[输入][输出] listAllCurveInfor 所有点链 输出中不包含CurveInforNext //[输入] listRefCurveInfor 参考点链,已经形成的链 //[输入] JointPointData 对接点 //[输入] dSamePointDistance 两个相同点最大距离 //[输出] CurveInforNext 找到的对接线 //[输出] bHead=true表示CurveInforNext的头点与给定点相同 //返回值: // =true 找到;=false 没有找到 BOOL FindJointPoint(CCurveNotchInforList &listAllCurveInfor, CCurveNotchInforList &listRefCurveInfor, CPointData JointPointData, double dSamePointDistance, CCurveNotchInfor &CurveInforNext, BOOL &bHead); //20200226 判断CurveInfor与listRefCurveInfor是否重叠 //输入参数: // listRefCurveInfor 参考线段 // CurveInfor 判断线段 //返回值: // =true 重叠; =false 不重叠 BOOL OverlapList(CCurveNotchInforList &listRefCurveInfor, CCurveNotchInfor CurveInfor); //在给定的点链中寻找头/尾点与给定点相同的曲线 //[输入][输出] listAllCurveInfor 所有点链 输出中不包含listSamCurveInfor //[输入] RefPointData 参考点 //[输入] dSamePointDistance 两个相同点最大距离 //[输出] listSameCurveInfor相同点点链, 并且链头都是与参考点相同的 void FindSamePoint(CCurveNotchInforList &listAllCurveInfor, CPointData &RefPointData, double dSamePointDistance, CCurveNotchInforList &listSameCurveInfor); //找给定边线中的辅助线 //[输入][输出] listAllCurveInfor 所有曲线 输出时没有listAssistantCurve中的曲线 //[输入][输出] listCloseCurveInfor 所有曲线 输出时没有listAssistantCurve中的曲线 //[输入] listBorder 边线实际点链 //[输出] listAssistantCurve 辅助线 void FindPatternAssistanceCurve(CCurveNotchInforList &listAllCurveInfor, CCloseCurveInforList &listCloseCurveInfor, CList &listBorder, CCurveNotchInforList &listAssistantCurve); //找给定边线中的字符串 //[输入][输出] listAllTextData 所有字符串 输出时没有listText中的字符串 //[输入] listBorder 边线实际点链 //[输出] listText 辅助线 void FindPatternText(CTextDataList &listAllTextData, CList &listBorder, CTextDataList &listText); //找给定纸样中的点 //[输入][输出] listPointData 所有点 输出时没有在纸样中点 //[输入] listBorder边线 //[输出] listAssistantPoint 辅助点 void FindPatternPoint(CPointDataList &listPointData, CList &listBorder, CCurveNotchInforList &listAssistantPoint); #endif