/************************************************************************************** 文 件 名:BaseFunction.h 主要功能: 基础函数类,包括基础算术运算,几何运算等 主要函数列表: 简述: 增加函数 //空间点到空间线段的最短距离 double PointSegmentDistance3D(double x0, double y0, double z0, double x1, double y1,double z1, double x2, double y2, double z2); //两向量A(x1,y1),B(x2,y2)的点积(内积) double DotProduct(double x1,double y1,double x2,double y2); //两向量A(x1,y1),B(x2,y2)的叉积(外积) double CrossProduct(double x1, double y1, double x2, double y2); //由三边边长得到三角形的面积 double TriArea(double a, double b, double c); //计算三角形A(x1,y1) B(x2,y2) C(x3,y3),顶点B的角平分线与AC边交点(x0,y0)如果ABC共线,求角平分线上距离为1任意一点 bool GetAngularBisector(double x1, double y1, double x2, double y2, double x3, double y3, double& x0, double& y0); //判断两条线段(x1,y1)-(x2,y2) ,(x3,y3)-(x4,y4)是否相交,返回1 交叉相交,返回0 不相交, 返回2 共线相交 int IsSegmentCross(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); //两条直线的交点,k1,k2为两条直线的斜率,若k值 > 1e10 表示垂直于x轴 返回0表示无交点,返回1表示存在唯一交点,返回2表示两直线重合 int LineCrossPoint(double x1,double y1, double k1, double x2,double y2, double k2, double& x0, double& y0 ); //五点三次平滑 --- wangcw bool Smooth53(double* val, int n, int stimes = 100); //对散点数据,获得其外轮廓曲线,返回为轮廓点个数,坐标保存在参数x、y中 int GetOutline(int num, double *x, double *y); // 得到散点的凸包,传入原始点集p大小为n,返回值为凸包大小,凸包点在convex上 int GetConvexHull(int n, CPoint2D* s_points,CPoint2D* convex, int maxsize = 1, int dir = 1 ); //x1,y1,x2,y2,x3,y3为三角形的三个顶点坐标,x,y,r中返回的是三角形外接圆的圆心坐标及半径 BOOL GetCircumcenter(double &x, double &y, double &r, double x1, double y1, double x2, double y2, double x3, double y3); **************************************************************************************/ #pragma once #ifndef AFX_EXT_CLASS #define AFX_EXT_CLASS Q_DECL_IMPORT #endif #include "math.h" #include "Point2D.h" #include // #ifndef PI #define PI 3.1415926535897932384626433832795 #endif #ifndef RHO #define RHO 57.295779513082320876798154814114 //(180.0/PI) #endif #ifdef _QT_VERSION // // Code Page Default Values. // #define CP_ACP 0 // default to ANSI code page #define CP_OEMCP 1 // default to OEM code page #define CP_MACCP 2 // default to MAC code page #define CP_THREAD_ACP 3 // current thread's ANSI code page #define CP_SYMBOL 42 // SYMBOL translations #define CP_UTF7 65000 // UTF-7 translation #define CP_UTF8 65001 // UTF-8 translation #endif //_QT_VERSION namespace GBase { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //编码类型定义 #define CODE_GB2312 0x00000000 //gb2312编码 #define CODE_UTF8 0x00000001 //utf-8编码 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class AFX_EXT_CLASS CBaseFunction { public: CBaseFunction(void); virtual ~CBaseFunction(void); //双精度数转换为字符串 void FloatToString(CString& result, double dValue); void FloatToString(CString& result, double dValue, int n); void FloatToString(char* result, double dValue); void FloatToString(char *result, double dValue, int n); CString FloatToString(double dValue); //将结果输出到m_tempLine中,可以用GetTempString()获得 CString FloatToString(double dValue, int n); CString ToString(double dValue, int n = 6); CString Bool2Str(bool boolVal); CString Bool2Str(BOOL boolVal); long FloatToLong(double value); ////输出数组到字符串中,用户可以自定义间隔符号(缺省是‘,’) void PrintXYZ(char* string, double *v, int num, int digits, char split = ','); //void PrintXYZ(CString& result, double *v, int num, int digits, char split=','); void PrintXYZ(char* result, double *v, int num, char split = ','); //void PrintXYZ(CString& result, double *v, int num, char split=','); public: //获得/设置小数位保留位数 void SetDecimalDigits(int digits); int GetDecimalDigits(void); int IsDigit(CString &line); int IsDigit(char* line); bool IsKey(const CString& key, LPCTSTR lpszKeyString); bool IsZero(const double& val); //判断val是否是零 bool IsZero(const double& val, double deps); //判断val是否是零 bool IsEqual(const double& x, const double& y, double deps = 1e-8); //判断两个值是否相等 bool IsEqual(const CPoint2D& pt1, const CPoint2D& pt2, double deps = 1e-6); //判断两个点是否重合 //获取最高位和整数位数 位数存入plen int GetTopDigit(int scrV, int* plen); //保留最高位,其余替换为0 int ReplaceDigitWithZero(int scrV); public: int GetArgument(CString cmd, CStringList &list); //获得以关键字(空格、逗号、TAB键)间隔的串,引号内部的关键字不起作用 int ScanfString(CStringArray &m_type, char* cmd); //获得split间隔的串,引号内部的split不起作用 int ScanfString1(CStringArray &m_type, char* cmd, int n, char split); //获得split间隔的串,引号内部的split不起作用 int ScanfString1(CStringArray &m_type, CString cmd, char split); int ScanfString(CStringArray &m_type, CString cmd, char split, bool bWithQuotation = false); //获得split间隔的串,bWithQuotation==true表示引号内部的关键字不起作用 int ScanfString(CStringArray &m_type, char* cmd, int nCmdNum, char* splitChar, int nSplitNum, bool bWithQuotation = true); int ScanDouble(char *line, double *x, int n, int m); int ScanDouble1(char *line, double *x, int n, int m); //得到文件的行数 added ww 2015-1-26 int GetFileLineNum(const char* strFile); public: //二分法搜索及插值,*x中的为排序数据(由小到大/由大到小) int BinarySearch(double key, int num, double *x); double LineValue(double x0, double *x, double *y); double LineValue(double x0, double x1, double x2, double y1, double y2); double LineValue(double m, double n, double z1, double z2, double z3, double z4); /////< 对应Pline.h中的DflineValue函数 //先二分法搜索,然后再线性插值 //参数*x中的为排序数据(由小到大/由大到小) double LineValue(double *x, double *y, int num, double x0); //根据Z值线性插值XY,成功返回true // 参数*z中的为排序数据(由小到大/由大到小) // bExtend=1外推,bExtend=0不外推 bool LineValue(OUT CPoint2D& pt, double *x, double *y, double *z, int num, double z0, BOOL bExtend); //线性插值,成功返回true, // 参数*y中的为排序数据(由小到大/由大到小) // bExtend=1外推,bExtend=0不外推, // 当bExtend=0时,bSetValue=1在范围外等于两头的值,bSetValue=0在范围外无值 bool LineValue(OUT double &y0, double *x, double *y, int num, double x0, BOOL bExtend, BOOL bSetValue); //坐标旋转 void Rotate(double &x0, double &y0, double radians); void Rotate(double &x, double &y, double cosa, double sina); void Rotate(double &x0, double &y0, double &z0, double alfa, double beta); //算术运算,参数mode=0代表+ ,1为减,2为乘,3为除 void Arithmetic(double& val, double factor, int mode); void SortCoordinate(double* x, double* y, int n); //根据坐标按照最小距离排序, 曲线拟合 int GetMinValueIndex(double* a, int n); //获得数组中最小值的索引号 double TotalDistance(double *a, double *b, int n); //获得总的距离和 double Distance2(double x1, double y1, double x2, double y2); double Distance(double x1, double y1, double x2, double y2); double Distance3D(double x1, double y1, double z1, double x2, double y2, double z2); //点(x0,y0)到直线kx+b的距离 double PointLineDistance(double x0, double y0, double k, double b); // 点(x0,y0)到线段的最短距离 double PointLineDistance(double x0, double y0, double x1, double y1, double x2, double y2); // 点(x0,y0)到线段的最短距离 a- 0到1 的距离, b 0到2 的距离, c 1到2的距离 double PointLineDistance(double x0, double y0, double x1, double y1, double x2, double y2, double a, double b, double c); //空间点(x0,y0,z0)到空间线段的最短距离 --Wangcw double PointLineDistance3D(double x0, double y0, double z0, double x1, double y1, double z1, double x2, double y2, double z2); /////////////////////////////////////////////////////////////////////// // // 1 上侧 // p1--------------------p2 // 2 下侧 // // // p2 // | // | // 1 左侧 | 2 右侧 // | // | // p1 // // 判断点在直线的哪侧 1-- 左侧 0--线上 2---右侧 int PointInLine(double x0, double y0, double x1, double y1, double x2, double y2); //判断点是否在线段上 bool IsPointOnSegment(double x0, double y0, double x1, double y1, double x2, double y2); //判断两条线段(x1,y1)-(x2,y2) ,(x3,y3)-(x4,y4)是否相交,返回1 交叉相交,返回0 不相交, 返回2 共线相交 int IsSegmentCross(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); //两条直线的交点,k1,k2为两条直线的斜率,若k值 > 1e10 表示垂直于x轴 返回0表示无交点,返回1表示存在唯一交点,返回2表示两直线重合 int LineCrossPoint(double x1, double y1, double k1, double x2, double y2, double k2, double& x0, double& y0); int LineCrossPoint(const CPoint2D& pt1, const CPoint2D& pt2, const CPoint2D& pt3, const CPoint2D& pt4, double& x0, double& y0); //判断点是否在多边形内部 1为内部 0为外部, x,y为多边形数组,m为点个数 ww 2016-11-01 int IsPtInPolygon(double x0, double y0, double* x, double* y, int m); //两向量A(x1,y1),B(x2,y2)的点积(内积) double DotProduct(double x1, double y1, double x2, double y2); //两向量A(x1,y1),B(x2,y2)的叉积(外积) double CrossProduct(double x1, double y1, double x2, double y2); int Offset(double k, double z, double &delt, double &h, BOOL bOffset); //曲线上的点偏移或反偏移,k为斜率 // dx = -z*dx; dy = -z*dy; z = -z*sqrt(1 - (dx^2 + dy^2) ) int Offset(double &dx, double &dy, double &z, BOOL bOffset); //曲面上的点偏移或反偏移,dx、dx为偏导 //bOffset==TRUE时调用Offset2D,为FALSE时调用UnOffset2D int Offset2D(double k, double z, double &delt, double &h); //曲面上的点偏移 int UnOffset2D(double k, double h, double &delt, double &z); //曲面上的点反偏移 public: double GetAngle(double x1, double y1, double x2, double y2, double x3, double y3); //获得两直线之间的夹角 double GetAngle(double x1, double y1, double x2, double y2); //获得直线与正X轴之间的夹角 double GetAngle(double x, double y); double GetAzimuth(double x1, double y1, double x2, double y2); //计算方位角 double ToDegree(double dms); //将度分秒转换为度 double ToDMS(double degree); //将度转换为度分秒 void GetKB(double x1, double y1, double x2, double y2, double &k, double &b);//获得直线方程参数 BOOL GetKB(int num, double *x, double *y, double &k, double &b); //最小二乘法直线拟合, num>2, 拟合直线方程(Y=kX+b) //最小二乘法平面插值,返回高程 ww 2021.4.22 double LeastSquareFit(std::vector& points, double x0, double y0); //最小二乘法平面fitting by a plane h(x,y) = barH + barA0*(x-barX) + barA1*(y-barY) -- ww 2021.4.22 bool LeastSquarePlane(std::vector& points, double& barX, double& barY, double& barH, double& barA0, double& barA1); int Gauss(int n, double *a, double *c); double GetAreaTrue(int num, double* x, double* y); //求闭合区域面积,面积可能是正值也可能是负值 double GetArea(int num, double *x, double *y); //求闭合区域面积(绝对值),GetArea()=fabs(GetAreaTrue()) //得到向量pt1,pt2 与pt2, pt3之间的夹角cos值 double GetCosinValue(CPoint2D& pt1, CPoint2D& pt2, CPoint2D& pt3); //由三边边长得到三角形的面积 double TriArea(double a, double b, double c); //计算三角形A(x1,y1) B(x2,y2) C(x3,y3),顶点B的角平分线与AC边交点(x0,y0)如果ABC共线,求角平分线上距离为1任意一点 ww bool GetAngularBisector(double x1, double y1, double x2, double y2, double x3, double y3, double& x0, double& y0); //x1,y1,x2,y2,x3,y3为三角形的三个顶点坐标,x,y,r中返回的是三角形外接圆的圆心坐标及半径 BOOL GetCircumcenter(double &x, double &y, double &r, double x1, double y1, double x2, double y2, double x3, double y3); double GetFirstValue(double x, double step); double GetCanonicalStep(double step); //获得规范化的步长,如参数为12返回10、0.13=0.1 double ContourStep(double m_step); int GetCycValue(int i, int T); //获取多边形重心(内部中心位置) (x0,y0)为重心坐标 ww 2019.7.3 void GetGravityCenter(double* xx, double* yy, int num, double& x0, double& y0); //获得等边多边形的顶点坐标 // centerPoint 中心点坐标 // endPoint 结束点坐标,该点为多边形的起点 // polyNum 等边多边形的边数 void GetEquilateralPolyPoints(CPointList& pl, dfPoint ¢erPoint, dfPoint &endPoint, int polyNum); //根据角度获得圆上的点的坐标 dfPoint GetPointOnCircle(dfPoint& centerPoint, double r, double angle); //获取线段S(x1,y1)(x2,y2)的中垂线 r为中垂线端点到线段S的距离 ww dstPts[0] = left dstPts[1] = right bool GetMidPerpendicular(const CPoint2D& pt1, const CPoint2D& pt2, double r, std::vector& dstPts); //根据角度获得椭圆上的点坐标 bool GetPointOnEllipse(double &x, double& y, const CSize8& szRadius, double angle); bool GetPointOnEllipse(double &x, double& y, const CPoint2D& centerPoint, const CSize8& szRadius, double angle); //获取椭圆上点的切线斜率 centerpoint = 中心点坐标 ,szRadius = 长短轴长度 (x0,y0) = 中心点坐标 若为垂线,返回值大于1e20 double GetKOnEllipse(double x0, double y0, const CPoint2D& centerPoint, const CSize8& szRadius); //五点三次平滑 --- wangcw bool Smooth53(double* val, int n, int stimes = 1); //h0 为输入,m点个数,h1输出,n=几点平滑,time=平滑次数 多点滑动取平均 double PointSmooth(double *h0, int m, double *h1, int n, int time); //反距离加权校正公式。输入x,y,z,m为数组元素个数,x0,y0为所求点坐标,k通常为2 double Weight2D(double x0, double y0, int m, double *x, double *y, double *z, double k); //三维反距离加权校正公式 double Weight3D(double x0, double y0, double t0, int m, double *x, double *y, double *t, double *z, int k); //判断多边形是否为顺时钟方向 bool IsClockWise(double* x, double* y, int num); //判断一组坐标是否共线 如果是 返回true 否 返回false ww bool IsCollinear(double*x, double* y, int num, double prec = 1e-10); //自动调整坐标轴范围和刻标个数 ww 2019.7.9 void AdjustAxis(double& minV, double& maxV, int& numTicks); //根据p1、p2指定的直线获得组合为箭头的三个坐标点(szLength.cy是箭头长度,cx是箭头宽度) BOOL GetArrowPoint3(CPoint2D p1, CPoint2D p2, CPoint2D* pOutPoint3, CSize8 szLength); //根据ptStart、ptEnd定义的直线,获得curPoint与该直线形成angle的坐标点 void GetAnglePoint(CPoint2D& curPoint, CPoint2D ptStart, CPoint2D ptEnd, double angle); public: ///> dec=0升序排列,dec=1降序排列 void SortDouble(int num, double *x, int dec = 0); //快速排序 ///>对指定的坐标对进行快速排序 ///> num为数组大小 ///> col列选择,0按x排,1按y排,2按z排 ///> dec=0升序排列,dec=1降序排列 void SortXYZ(double *x, double *y, double *z, int num, int colSort, int dec); void SortXY(double *x, double *y, int num, int colSort, int dec); public: //ASCII码文件的读写 //int ReadString(CFile& fr, CString& str); //int GetString(CFile& fr, CString& str); BOOL IsLineEnd_GetString(int result); //判断GetString返回的值是否表示一行的结束 //int ReadString(CFile & fr, char* str); //读取一行字符串 //int GetString(CFile& fr, char* str); //读取一段字符串(以空格或回车为终止符) //int ReadString(CFile & fr); //读取一行字符串到临时数组中 //int GetString(CFile& fr); //读取一段字符串(以空格或回车为终止符)到临时数组中 //char* GetTempString(void); //获得临时数组 //int GetTempStringLength(void); //获得临时数组长度 //void ZeroTempString(void); //清空临时数组 void ReverseString(char *string, int n); int ReplaceChar(char* pString, char old_char, char new_char); int FindString(char* pString, char* pSearchString, int nStartPos = 0); int ReverseFind(const char* pString, char cFind); //反向查找指定的字符 //void SerializeString(CArchive& ar, CString& str, const short& ver); //void WriteChar(CFile &fw, LPCTSTR lpstr, int nTimes=1); //写入nTimes次字符串进文件 //void WriteLine(CFile &fw, LPCTSTR lpstr, int nTabNum); //进行nTabNum次tab操作,再写一行字符串 //void WriteLine(CFile &fw, CString str); //写一行数据(包括回车),是WriteString与WriteReturn的组合 //void WriteString(CFile &fw, CString str, int nTabNum=0); //写一串数据 //void WriteString(CFile &fw, double value, int n=6); //写一个双精度数据 //void WriteString(CFile &fw, long value); //写一个长整形数据 //void WriteReturn(CFile& fw); //写一个回车 //void WriteXY(CFile& fw, double x, double y, char cSplit=','); //写X,Y数据 //void WriteXY(CFile& fw, double& x, double& y, double& z, char cSplit); //BOOL WriteFile(LPCTSTR lpSaveFileName, void* pBuffer, DWORD nBufferSize); //快速保存指定内容 ////获得设置临时错误信息 //void SetErrorInfo(LPCTSTR lpszErrorInfo); //CString GetErrorInfo(void); public: void ExchangeXY(double& x, double& y); //x,y交换位置 void Swap(double& x, double& y); //x,y交换位置 void Swap(float& x, float& y); //x,y交换位置 ////为了写元素类型(int 或 short)型 //void WriteElementType(CArchive& ar, int nType, const short& ver); //void ReadElementType(CArchive& ar, int &nType, const short& ver); // //Progress // void SetProgress(CProgressCtrl* pProgress); // CProgressCtrl* GetProgress(void); // void SetProgressPos(int nPos); //Convert a string to uppercase static char* StrUpr(char* str); CString GetSplitPath(/*const*/ CString sFullPathName, CString context = _T("ext")); //split the path into given strings #ifdef _QT_VERSION static bool SplitPath(const char* fullPath, char* drive, char* dir, char* fname, char* ext); static bool SplitPath(const wchar_t* fullPath, wchar_t* drive, wchar_t* dir, wchar_t* fname, wchar_t* ext); // static QColor ulongToQColor(unsigned long color); #endif //对散点数据,获得其外轮廓曲线,返回为轮廓点个数,坐标保存在参数x、y中 int GetOutline(int num, double *x, double *y); // 得到散点的凸包,传入原始点集p大小为n,返回值为凸包大小,凸包点在convex上 int GetConvexHull(int n, CPoint2D* s_points, CPoint2D* convex, int maxsize = 1, int dir = 1); //计算直线与线段的交点,成功返回1,若无,返回0,若重合,返回2. ww 2015-10-27 //参数 a,b为直线向量,lx0,ly0为直线上一点坐标,(sx1,sy1)(sx2,sy2)为线段两端点,若存在交点(cx,cy)为交点坐标 int SegLineCrossPoint(double a, double b, double lx0, double ly0, double sx1, double sy1, double sx2, double sy2, double& cx, double& cy); ////xml格式版本号 //void SetXmlVersion(double dVer); //double GetXmlVersion(); //编码方式 //void ConvertGBKToUTF8(CString& strGBK, bool checkCodec = true); //void SetCodeType(DWORD nType); //DWORD GetCodeType(); //打印旋转 void SetPrintRotatePt(CPoint pt); CPoint GetPrintRotatePt(); void SetPrintRotateAngle(double angle); double GetPrintRotateAngle(); //空符号显示样式 void SetInsertDrawMode(DWORD mode); DWORD GetInsertDrawMode(); //点字小数位数,-1为不控制位数 void SetTxtDecimalDgts(int i); int GetTxtDecimalDgts(); //保存缩略图 void EnableSaveThumbImage(BOOL bSave); BOOL IsSaveThumbImage(); //反走样开关 void EnalbeAntialias(BOOL bAntialias); BOOL IsAntialias(); //执行指定命令 HANDLE ExecuteCommand(LPCTSTR lpFileCommand, LPCTSTR lpFileParameters, LPCTSTR lpFileDirectory, int nWinShow = SW_SHOW); //获取模块路径 CString GetModulePath(); int GetDPIX(int x); int GetDPIY(int y); CPoint GetDPIPoint(CPoint pt); CRect GetDPIRect(CRect rt); CSize GetDPISize(CSize sz); public: ///move from Pline.h void enspl(double *x, double *y, int n, int k, double t, double *s); //光滑不等距插值;k=-1,t插值点的x坐标,s为多项式系数长度为5,s[0],s[1],s[2],s[3]为插值点所在子区间多项式系数,s[4]为返回的y值 (最优) double enlgr(double *x, double *y, int n, double t); //一元全区间不等距(拉格朗日)(少用) double enlg3(double *x, double *y, int n, double t); //一元三点不等距(拉格朗日)(少用) double enpqs(double *x, double *y, int n, double t); //连分式不等距(少用) double enhmt(double *x, double *y, double *dy, int n, double t); //埃尔米特不等距插值,dy为n个不等距节点上的一阶导数值 double enatk(double *x, double *y, int n, double t, double dEps); //埃特金不等距插值 dEps插值精度,(少用) double espl1(double *x, double *y, int n, double *dy, double *ddy, double *t, int m, double *z, double *dz, double *ddz);//第一种边界条件的三次样条插值 //三次样条插值说明:x,y,dy,ddy数组长度为n,dy[0]存放左端点的一阶导数,dy[n-1]存放右端点的一阶导数,返回n个节点的一阶倒数,ddy为二阶导数,t为要插值的节点值,长度为m,返回z,dz,ddz分别为节点处插值,一阶导数和二阶导数。 double espl2(double *x, double *y, int n, double *dy, double *ddy, double *t, int m, double *z, double *dz, double *ddz);//第二种边界条件的三次样条插值,ddy[0]存放左端点的一阶导数,ddy[n-1]存放右端点的二阶导数 double espl3(double *x, double *y, int n, double *dy, double *ddy, double *t, int m, double *z, double *dz, double *ddz);//第三种边界条件的三次样条插值,条件满足y[0]=y[n-1]; ///////////////////////////////////////曲线拟合 //拟合出的曲线计算:yy=a[0]+a[1]*xx+a[2]*xx*xx+a[3]*xx*xx*xx+a[4]*xx*xx*xx*xx; void hpir1(double *x, double *y, int n, double *a, int m, double *dt);//最小二乘法曲线拟合,n为已知数据点个数,m为多项式项数,即最高x的(m-1)次方,m0,t为对数的底数t>0,a数组长度为7,a[0]:拟合函数y=b*pow(t,ax)中的b,a[1]为拟合式中的a,a[2]为偏差平方和,a[3]为平均标准偏差,a[4]为最大偏差,a[5]为最小偏差,a[6]偏差平均值 void ilog2(int n, double *x, double *y, double *a); //对数拟合,要求x[i]>0;y[i]>0,a数组长度为7,a[0]为拟合函数y=b*pow(x,a)中的b,a[1]为拟合式中的a,a[2]为偏差平方和,a[3]为平均标准偏差,a[4]为最大偏差,a[5]为最小偏差,a[6]偏差平均值 __int64 IntegerTransfer(__int64 vv); protected: static int _compare_double_asc(const void *d1, const void *d2); //升序排列 static int _compare_double_dec(const void *d1, const void *d2); //降序排列 //二维指针数组排序函数 ww 2017-6-29 static int _compare_double_pointer_asc(const void *d1, const void *d2); //指针数组升序排列 static int _compare_double_pointer_dec(const void *d1, const void *d2); //指针数组降序排列 }; }; using namespace GBase; extern GBase::CBaseFunction Gbf; extern "C" AFX_EXT_API GBase::CBaseFunction* WINAPI GGetBaseFunction(); extern "C" AFX_EXT_API GBase::CBaseFunction* GGetPublicFunction(); extern "C" AFX_EXT_API BOOL* WINAPI AfxGetNo_Trim_Zero(); extern "C" AFX_EXT_API void WINAPI SetVert(TRIVERTEX &v, int x, int y, COLORREF cr); //extern CString m_strPathModule; //当前模块路径 //extern HWND m_hWndModule; //当前模块主窗口句柄 extern "C" AFX_EXT_API void WINAPI AfxSetModulePath(CString strPath); extern "C" AFX_EXT_API HWND WINAPI AfxGetModuleHwnd(); extern "C" AFX_EXT_API void WINAPI AfxSetModuleHwnd(HWND hWnd); #ifdef _QT_VERSION extern "C" AFX_EXT_API void WINAPI DeleteFile(CString strFile); #endif //_QT_VERSION //extern "C" TRIVERTEX AFX_EXT_DATA vert[5]; //extern "C" GRADIENT_TRIANGLE AFX_EXT_DATA gTRi[4]; //extern "C" double AFX_EXT_DATA __z[4]; #ifdef _QT_VERSION //Qt's similiar functions as WINAPI --ww 2017.12.28 // read or write ini file extern "C" AFX_EXT_API DWORD GetPrivateProfileString(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize, LPCSTR lpFileName); extern "C" AFX_EXT_API DWORD GetPrivateProfileSection(LPCTSTR lpAppName, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName); extern "C" AFX_EXT_API BOOL WritePrivateProfileString(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpString, LPCSTR lpFileName); //retrieves the path for the file that contains the specified module that the current process owns extern "C" AFX_EXT_API DWORD GetModuleFileName(void* hModule, LPTSTR lpFilename, DWORD nSize); extern "C" AFX_EXT_API void GetLocalTime(SYSTEMTIME* t); extern "C" AFX_EXT_API int MultiByteToWideChar( UINT CodePage, // code page DWORD dwFlags, // character-type options LPCSTR lpMultiByteStr, // string to map int cbMultiByte, // number of bytes in string LPWSTR lpWideCharStr, // wide-character buffer int cchWideChar // size of buffer); ); extern "C" AFX_EXT_API int WideCharToMultiByte( UINT CodePage, // code page DWORD dwFlags, // performance and mapping flags LPCWSTR lpWideCharStr, // wide-character string int cchWideChar, // number of chars in string. LPSTR lpMultiByteStr, // buffer for new string int cbMultiByte, // size of buffer LPCSTR lpDefaultChar, // default for unmappable chars LPBOOL lpUsedDefaultChar // set when default char used); ); #endif #define AfxGetDPIX(x) AfxGetBaseFunction()->GetDPIX(x) #define AfxGetDPIY(y) AfxGetBaseFunction()->GetDPIY(y) #define AfxGetDPIPoint(pt) AfxGetBaseFunction()->GetDPIPoint(pt) #define AfxGetDPIRect(rt) AfxGetBaseFunction()->GetDPIRect(rt) #define AfxGetDPISize(sz) AfxGetBaseFunction()->GetDPISize(sz) //extern "C" //{ // AFX_EXT_API TRIVERTEX* WINAPI AfxGetvert(); // AFX_EXT_API GRADIENT_TRIANGLE* WINAPI AfxGetgTRi(); // AFX_EXT_API double* WINAPI AfxGet__z(); //}; /////////////////////////////////////////////////////////////////// //////插值函数用法 // dx=(x[pnum-1]-x[0])/num; // fw.WriteString("\nlayer m 原始线 \npline\n"); // for(j=0;j=20){::AfxMessageBox("多项式项数只能小于 20!");return;} // fw.WriteString("\nlayer m 最小二乘\npline\n"); // sum=0; // for(j=0;j=20){::AfxMessageBox("多项式项数只能小于 20!");return;} // fw.WriteString("\nlayer m 切比雪夫曲线拟合\n"); // bf.hchir(x,y,pnum,a,m_time); //m_time次多项式 // fw.WriteString("\npline\n"); // for(j=0;j void DeepEraseVector(std::vector& vec) { for (int i = 0; i < (int)vec.size(); i++) { if (NULL != vec[i]) delete vec[i]; } vec.clear(); }