/************************************************************ * @file dfDimension.h interface for the CDimensionBase class * @ * @version 1.0 * @date 2011-2012 ************************************************************/ #if !defined(AFX_DFDIMENSION_H__D81A67B5_D88D_48E3_B66E_A78E2BB1E081__INCLUDED_) #define AFX_DFDIMENSION_H__D81A67B5_D88D_48E3_B66E_A78E2BB1E081__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include #include #include "colorBase.h" #include "curve.h" // Added by ClassView #include "plane.h" // Added by ClassView #include ".\grid.h" /************************************************************************ CDimensionBase 基础网格类 基本结构: |---|---|- |---|---|- |---|---|- ① 每一个网格节点上都有一个CLink连接对象指针m_link[i],表示该点与周围相邻点的连接关系; ② 所有结点的属性值都存储在变量*u中. ************************************************************************/ namespace NContour { /** @brief CLink类,用来记录某结点与周围结点的连接关系*/ class CLink { public: CLink(); virtual ~CLink(); int Create(int n); void Reverse(int n); void Read(char *&fr, int n); void Read(int &fr, int n); void Write(int &fw,int n); void Read(CFile &fr, int n); void Write(CFile &fw,int n); void Serialize(CArchive& ar, int n); void operator=(CLink& lk); int n; ///< w数组的长度 double *w; ///< 与周围点的连接关系 }; class AFX_EXT_CLASS CDimensionBase : public CGrid { public: CDimensionBase(); virtual ~CDimensionBase(); /** @brief 读取网格数据,bBinary表示是否对数据进行内存映射,若是则不能再本类中删除*u */ int Read(char *pData, bool bMapping = false); int ReadHead(CString m_input); int WriteHead(int &fw); void WriteText2D(CString m_output); void WriteText(CString m_output); virtual CGrid* CloneObject(void); //克隆自己 virtual void Serialize(CArchive& ar, const short& ver); //F(x,y) /** @brief 读写网格文件 */ int Read(CString m_input); //F(x,y) int Write(CString m_output); //F(X,Y) int Read(int& fr); //F(x,y) int Write(int& fw); //F(X,Y) virtual void Write(CFile& fw); //F(x,y) virtual int Read(CFile& fr); //F(X,Y) virtual int CreateDimension(int dn); //指定维数,设置link_offset个数(dn+dn)和ip个数(dn) /** @brief 从父类继承的函数,实现对网格进行平滑, 平滑后k点的值为(u[k]+valuelink[k] * smooth_coe)/(1+smooth_coe) smooth_coe 为周围结点的权重*/ virtual void Smooth(double smooth_coef = 1.0); /** @brief 得到各维度偏移量*/ void GetLinkOffset(); /** @brief 得到网格结点*ip(各维度序号为ip[0],ip[1]...)所处的位置序号*/ int GetLocation(int *ip); /** @brief ip[m_dim] 增加1*/ void AddLocation(int *&ip,int m_dim); void Empty(); //清空 /** @brief 判断u值是否为内存映射*/ bool IsDataMapping(); int CreateFromTransfer(CDimensionBase &m_dim); /** @brief 生成指定维数为n的网格,各方向网格个数num[i],起始位置P0[i],步长delt[i] */ int Create(int n,CArray &num,CArray &P0,CArray &delt); /** @brief 由设置好的参数生成网格,确定成员变量total, link_offset[i]的值,初始化m_link */ int Create(); int Create1(); int Create(int n,int *num); /** @brief 生成m_link[k] m_link[k].w = new double[n+n] */ void CreateLink(int k); /** @brief 删除所有结点CLink*/ void EmptyLink(void); void operator=(CDimensionBase& db); double operator =(double *m_dim); /** @brief 插值得到曲面上任意坐标点的值 */ double Value(double *m_dim, bool bIsXY = TRUE); /** @brief 方向计算k点值,即有效点为无效点,无效点为有效点*/ double ValueReverse(int k); /** @brief 通过连接关系得到第k个结点在八个方向上的加权平均值,并考虑第二层数据点影响*/ double ValueLink(int k); /** @brief 不通过连接关系得到第k个结点的插值,即由周围相邻点加权平均*/ double ValueUnlink(int k ); /** @brief 迭代计算j维网格上任意点的插值*/ double Value(double *m_dim,/*int *ip,*/int j); double Differential(double* m_dim, int d); void Extrenum(double &min,double &max); /* | w[1] T(i,j) w[2] | -------o------w[0] K| | w[3] */ /** @brief 判断是否中心点K是否与i,j点和对角点(i,j)相连*/ int IsLink(int k, int i, int j); /** @brief 得到属性值范围,返回值为有效值的个数 */ int GetRange(double minValidValue=-1e100, double maxValidValue=1e100); void _Write(FILE *&fw, dfPoint &t); double *u; ///< 结点属性数组,共total个 CLink **m_link; ///< 共total个,记录每个网格结点与周围结点的连接关系,m_link[i]中*w长度n+n,先i行后j行 ,与CFunction2D相反 int *link_offset; ///< 为各维度的偏移量,第二维偏移量为link_offset[0]*num[0],依次类推;共n+n个,n+1到2n为前n个的负值 int total; ///< 网格结点总数 double m_mininum; void InitMininum(bool bGetRange = true); ///< 为了老格式中的m_mininum变量 double z; int* ip; ///< 辅助变量,某一点所处位置的各维度网格序号 private: bool m_IsUMapping; ///< 判断数据指针是否为内存映射,若是,不可以在empty()中删除 }; }; using namespace NContour; #endif // !defined(AFX_DFDIMENSION_H__D81A67B5_D88D_48E3_B66E_A78E2BB1E081__INCLUDED_)