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

215 lines
7.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#if !defined(DxfMath_h)
#define DxfMath_h
#include <math.h>
#include <afxwin.h>
#include <afxtempl.h>
#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);
//得到pdPoint1pdPoint2的中间点 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<CPoint, CPoint> &listBorder, CCurveNotchInforList &listAssistantCurve);
//找给定边线中的字符串
//[输入][输出] listAllTextData 所有字符串 输出时没有listText中的字符串
//[输入] listBorder 边线实际点链
//[输出] listText 辅助线
void FindPatternText(CTextDataList &listAllTextData, CList<CPoint, CPoint> &listBorder, CTextDataList &listText);
//找给定纸样中的点
//[输入][输出] listPointData 所有点 输出时没有在纸样中点
//[输入] listBorder边线
//[输出] listAssistantPoint 辅助点
void FindPatternPoint(CPointDataList &listPointData, CList<CPoint, CPoint> &listBorder, CCurveNotchInforList &listAssistantPoint);
#endif