|
|
#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;
|