215 lines
7.3 KiB
C
215 lines
7.3 KiB
C
#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);
|
||
|
||
//得到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<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 |