#pragma once #include "rect8.h" #include ".\curve.h" namespace NContour { struct SGridParamEx; class AFX_EXT_CLASS CGrid { public: CGrid(void); ~CGrid(void); void operator=(CGrid& grid); virtual CGrid* CloneObject(void); //克隆自己 virtual int CreateDimension(int dn); //生成指定维数 virtual void Empty(); //清空 virtual int Create(int numx, int numy, double x0, double y0, double dx, double dy); virtual void SetValue(int i, int j, double v){} virtual double Value(double x0, double y0) { return 1e301; } virtual double Value(int i, int j) { return 1e301; } virtual bool IsInRangeZ(double z0); //写DFG格式网格文件 virtual int WriteDfg(LPCTSTR m_output) { return 0; } virtual void Write(CFile& fw); virtual int Read(CFile& fr); virtual void Serialize(CArchive& ar, const short& ver) { } /** @brief 网格平滑函数 smooth_coef为平滑系数,当前数据不可信度,值越大,平滑效果越强*/ virtual void Smooth(double smooth_coef = 1.0 ); // NVI 子类需重写Smooth函数 double xGrid(double x); double yGrid(double x); double x(int i); double y(int j); CRect8 GetRect(void); //获得最大最小矩形范围 double xmin(void) { return P0[0]; } double ymin(void) { return P0[1]; } double xmax(void); double ymax(void); long& xnum(void) { return num[0]; } long& ynum(void) { return num[1]; } double& dx(void) { return delt[0];} double& dy(void) { return delt[1];} double vmin(void) { return range[0]; } double vmax(void) { return range[1]; } void SetRange(double vmin, double vmax) { range[0]=vmin; range[1]=vmax; } // virtual int GetRange(double minValidValue = -1e100, double maxValidValue = 1e100) { return 0; }; //将网格剖面保存为SegY文件,参数pCoorCurve是为了根据曲面中的X值在曲线中插值平面坐标 bool WriteSegY(LPCTSTR strOutput, CCurve* pCoorCurve = NULL); public: long n; ///< n表示维数,曲面为2,体网格为3 long * num; ///< 各方向网络个数 double *P0; ///< 原点坐标 double *delt; ///< 间隔 double range[2]; ///< z值范围,范围外的值认为无效 ///< 生成该网格时的初始化参数(24B) struct SGridParam { short times; ///<2 加密次数 short timesFlt; ///<2 第几次考虑断层 double smooth; ///<8 平滑度 double precision; ///<8 误差精度 }; //网格文件的文件头定义,固定长度为100字节,内部变量可变 struct SGridHead { char fileType[16]; ///<16 网格类型, ///< 新网格格式中:逆断层=GDF-FGrid,正断层=GDF-DGrid,扩展名称为.f(x,y) char fileVer[8]; ///<8 网格版本,如V2.0 SGridParam gridParam; ///<20 生成该网格时的初始化参数 char strExtend[56]; ///<56 }; SGridHead m_fileHead; ///< 文件头定义,也可以直接定义为: char version[100]; SGridParam& GetGridParam() { return m_fileHead.gridParam; } virtual bool CreateGridParam(SGridParamEx& gp); ///< 根据网格参数生成参数对象 bool IsValueInRange(double z); ///< 判断值是否在范围内 }; struct SGridParamEx : public CGrid::SGridParam { double coord[6]; ///<48 坐标范围[0=xmin,1=ymin,2=zmin,3=xmax,4=ymax,5=zmax] int num[3]; ///<6 初始化网格参数[0=numx,1=numy,2=numz] }; }; using namespace NContour;