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.

169 lines
4.9 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.

/************************************************************
* @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 <afxtempl.h>
#include <atlimage.h>
#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<int,int> &num,CArray<double,double> &P0,CArray<double,double> &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_)