You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

698 lines
29 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**************************************************************************************
文 件 名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 <vector>
//
#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中的为排序数据(由小到大/由大到小)
// bExtend1外推bExtend=0不外推
bool LineValue(OUT CPoint2D& pt, double *x, double *y, double *z, int num, double z0, BOOL bExtend);
//线性插值成功返回true
// 参数*y中的为排序数据(由小到大/由大到小)
// bExtend1外推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<CPoint3D>& 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<CPoint3D>& 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 &centerPoint, 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<CPoint2D>& 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升序排列dec1降序排列
void SortDouble(int num, double *x, int dec = 0); //快速排序
///>对指定的坐标对进行快速排序
///> num为数组大小
///> col列选择0按x排1按y排2按z排
///> dec=0升序排列dec1降序排列
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为多项式系数长度为5s[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数组长度为ndy[0]存放左端点的一阶导数dy[n-1]存放右端点的一阶导数返回n个节点的一阶倒数ddy为二阶导数t为要插值的节点值长度为m返回zdzddz分别为节点处插值一阶导数和二阶导数。
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的m1次方m<n,m<20,a为返回的多项式系数长度为mdt为长度为3的数组返回误差。
void hchir(double *x, double *y, int n, double *a, int m); //切比雪夫曲线拟合n为已知数据点个数m为多项式项数m<n,m<20,a为返回的多项式系数长度为m+1,a[m]返回多项式偏差的最大值。
//对xy序列数据做y=ax+b线性回归
void isqt1(double *x, double *y, int n, double *a, double *dt); //一元线性回归返回b=a[0],a=a[1]dt[0]:返回偏差平方和dt[1]平均标准偏差dt[2]回归平方和dt[3]最大偏差dt[4]最小偏差dt[5]偏差平均值;
void ilog1(int n, double *x, double *y, double t, double *a); //半对数拟合要求y[i]>0t为对数的底数t>0a数组长度为7a[0]:拟合函数y=b*pow(t,ax)中的ba[1]为拟合式中的aa[2]为偏差平方和,a[3]为平均标准偏差,a[4]为最大偏差,a[5]为最小偏差,a[6]偏差平均值
void ilog2(int n, double *x, double *y, double *a); //对数拟合要求x[i]>0;y[i]>0a数组长度为7a[0]为拟合函数y=b*pow(x,a)中的ba[1]为拟合式中的aa[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<pnum;j++)
// {
// str.Format("%lf,%lf\n",x[j],y[j]);
// fw.WriteString(str);
// }
// if(m_mode==0)//线性插值;
// {
// double y0;
// fw.WriteString("\nlayer m 线性插值 \npline\n");
// for(j=0;j<num;j++)
// {
// xx=x[0]+dx*j;
// bf.LineValue(y0,x,y,pnum,xx,TRUE,FALSE);
// str.Format("%lf,%lf\n",xx,y0);
// fw.WriteString(str);
// }
// }
// if(m_mode==1)//光滑不等距插值;
// {
// fw.WriteString("\nlayer m 光滑不等距插值 \npline\n");
// for(j=0;j<num;j++)
// {
// xx=x[0]+dx*j;
// bf.enspl(x,y,pnum,-1,xx,a);
// str.Format("%lf,%lf\n",xx,a[4]);
// fw.WriteString(str);
// }
// }
// if(m_mode==2)//三次样条插值;
// {
// fw.WriteString("\nlayer m 三次样条插值 \npline\n");
// dy[0]=(y[1]-y[0])/(x[1]-x[0]);
// dy[pnum-1]=(y[pnum-1]-y[pnum-2])/(x[pnum-1]-x[pnum-2]);
// dfcreate1(num);
// for(j=0;j<num;j++)
// {
// t[j]=x[0]+j*dx;
// }
// bf.espl1(x,y,pnum,dy,dyy,t,num,z,dz,ddz);
// for(j=0;j<num;j++)
// {
// str.Format("%lf,%lf\n",t[j],z[j]);
// fw.WriteString(str);
// }
// }
// if(m_mode==3)//最小二乘曲线拟合;
// {
// if(pnum<m_time)
// {
// str.Format("原数据点个数=%d,多项式项数只能小于 %d",pnum,pnum);
// ::AfxMessageBox(str);return;
// }
// if(m_time>=20){::AfxMessageBox("多项式项数只能小于 20");return;}
// fw.WriteString("\nlayer m 最小二乘\npline\n");
// sum=0;
// for(j=0;j<pnum;j++)
// {
// sum=sum+x[j];
// }
// sum=sum/pnum;
// bf.hpir1(x,y,pnum,a,m_time,dt);//m_time次多项式
// for(j=0;j<num;j++)
// {
// xx=x[0]+dx*j;
// zz=xx-sum;
// yy=0;
// for(int i=0;i<m_time;i++)
// {
// yy=yy+a[i]*pow(zz,i);
// }
// //yy=a[0]+a[1]*pow(zz,1)+a[2]*pow(zz,2)+a[3]*pow(zz,3)+a[4]*pow(zz,4)+a[5]*pow(zz,5)+a[6]*pow(zz,6)+a[7]*pow(zz,7);
// //yy=a[0]+a[1]*zz+a[2]*zz*zz+a[3]*zz*zz*zz+a[4]*zz*zz*zz*zz+a[5]*zz*zz*zz*zz*zz+a[6]*zz*zz*zz*zz*zz*zz+a[7]*zz*zz*zz*zz*zz*zz*zz;
// str.Format("%lf,%lf\n",xx,yy);
// fw.WriteString(str);
// }
// }
// if(m_mode==4)//切比雪夫曲线拟合;
// {
// if(pnum<m_time)
// {
// str.Format("原数据点个数=%d,多项式项数只能小于 %d",pnum,pnum);
// ::AfxMessageBox(str);return;
// }
// if(m_time>=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<num;j++)
// {
// xx=x[0]+dx*j;
// yy=0.0;
// for(int i=0;i<m_time;i++)
// {
// yy=yy+a[i]*pow(xx,i);
// }
//// yy=a[0]+a[1]*xx+a[2]*xx*xx+a[3]*xx*xx*xx+a[4]*xx*xx*xx*xx;
// str.Format("%lf,%lf\n",xx,yy);
// fw.WriteString(str);
// }
// }
// if(m_mode==5)//埃特金不等距插值;
// {
// fw.WriteString("\nlayer m 埃特金不等距插值\n");
// fw.WriteString("\npline\n");
// double eps=fabs((y[pnum-1]-y[0])/10000.0);
// for(j=0;j<num;j++)
// {
// xx=x[0]+dx*j;
// yy=bf.enatk(x,y,pnum,xx,eps);
// str.Format("%lf,%lf\n",xx,yy);
// fw.WriteString(str);
// }
// }
// if(m_mode==6)//一元全区间不等距(拉格朗日);
// {
// fw.WriteString("\nlayer m 一元全区间不等距\n");
// fw.WriteString("\npline\n");
// for(j=0;j<num;j++)
// {
// xx=x[0]+dx*j;
// yy=bf.enlgr(x,y,pnum,xx);
// str.Format("%lf,%lf\n",xx,yy);
// fw.WriteString(str);
// }
// }
// if(m_mode==7)//一元三点不等距(拉格朗日);
// {
// fw.WriteString("\nlayer m 一元三点不等距\n");
// fw.WriteString("\npline\n");
// for(j=0;j<num;j++)
// {
// xx=x[0]+dx*j;
// yy=bf.enlg3(x,y,pnum,xx);
// str.Format("%lf,%lf\n",xx,yy);
// fw.WriteString(str);
// }
// }
// if(m_mode==8)//连分式不等距;
// {
// fw.WriteString("\nlayer m 连分式不等距\n");
// fw.WriteString("\npline\n");
// for(j=0;j<num;j++)
// {
// xx=x[0]+dx*j;
// yy=bf.enpqs(x,y,pnum,xx);
// str.Format("%lf,%lf\n",xx,yy);
// fw.WriteString(str);
// }
// }
template<typename T>
void DeepEraseVector(std::vector<T>& vec)
{
for (int i = 0; i < (int)vec.size(); i++)
{
if (NULL != vec[i])
delete vec[i];
}
vec.clear();
}