|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
//文件: 三维体文件操作类
|
|
|
//主要功能:
|
|
|
//
|
|
|
//程序编写: 2011-5-3
|
|
|
//
|
|
|
//
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#pragma once
|
|
|
#include "BuilderBase.h"
|
|
|
#include "SeisLineData.h"
|
|
|
|
|
|
namespace NCube
|
|
|
{
|
|
|
|
|
|
//将三维体数据(F(X,Y)文件,一般保存速度体数据)构建成线道号与坐标对应方式
|
|
|
//线道号以索引号0开始,以网格数-1结束
|
|
|
//主要是为了解决坐标直接进行计算会超界的问题
|
|
|
class AFX_EXT_CLASS CBuilderMesh3D
|
|
|
: public CBuilderBase
|
|
|
{
|
|
|
public:
|
|
|
CBuilderMesh3D(void);
|
|
|
~CBuilderMesh3D(void);
|
|
|
|
|
|
//直接读取加载三维体数据
|
|
|
bool Read(CString strFxyPathName); //加载三维体文件
|
|
|
|
|
|
//绑定三维体文件
|
|
|
virtual bool AttachInput(void* pMesh, bool bAutoDelete = false); //参数为CDimension3D对象
|
|
|
virtual void Clear(void);
|
|
|
virtual float GetSampleInterval(); //获得采样间隔,为了写SegY剖面时使用
|
|
|
|
|
|
//获得三维体中的指定点的数据值
|
|
|
virtual double Value(double x, double y, double z) { return GetCube()->Value(x, y, z); }
|
|
|
virtual double Value(int row, int col, int k) { return GetCube()->Value(row, col, k); }
|
|
|
|
|
|
virtual CColorBase& GetColorBar() { return m_colorBar; }
|
|
|
virtual CSeisSampleInfo& GetSampleInfo() { return m_sampleInfo; }//获得采样点信息
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
//输出结果为实际坐标
|
|
|
//
|
|
|
//生成不规则切片
|
|
|
bool CreateRandMesh_XY(CMeshRand2D& md, CCurve* pCurveXY, EOrientation curOri);
|
|
|
bool CreateRandMesh_XY(CMeshRand2D& md, CCurve* pCurve, float fiexdStep, EOrientation curOri);//指定步长
|
|
|
//线道号将根据areaSnapStep状态是否进行取整
|
|
|
bool CreateLineXY(CMesh2D& md, float line, EOrientation ori, bool bReMemory=true);
|
|
|
// 读取一条主测线地震剖面
|
|
|
bool CreateInlineXY(CMesh2D& md, float row_line_num, bool bReMemory=true);
|
|
|
// 读取一条联络测线地震剖面
|
|
|
bool CreateCrosslineXY(CMesh2D& md, float col_line_num, bool bReMemory=true);
|
|
|
// 读取一条等时切片
|
|
|
bool CreateSliceUpXY(CMesh2D& md, float slice_up_num, bool bReMemory=true);
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
CDimension3D* GetCube() { return (CDimension3D*)GetInput(); }
|
|
|
virtual CSeisSurvey3D& GetSurvey() { return m_survey; }
|
|
|
|
|
|
CSeisSurvey3D m_survey; //测网等信息
|
|
|
CColorBase m_colorBar;
|
|
|
|
|
|
protected:
|
|
|
void InitSampleInfo(); //初始化体采样点信息,必须在绑定体之后
|
|
|
|
|
|
CSeisSampleInfo m_sampleInfo; //体的采样点信息,为了与地震剖面的统一
|
|
|
|
|
|
private:
|
|
|
//仅是为了使用线程定义
|
|
|
CString m_strMeshFile; //仅是为了使用线程读取数据体文件
|
|
|
|
|
|
void MeshXY2MeshRC(double* bakXY6); //将实际坐标网格体转换为线道号网格体,为了与地震数据体统一
|
|
|
void MeshRC2MeshXY(double* bakXY6); //将线道号体转换为实际坐标体
|
|
|
|
|
|
protected:
|
|
|
virtual bool CreateData(); //不使用线程方式
|
|
|
|
|
|
private:
|
|
|
//不使用线程方式
|
|
|
bool _ReadFile(LPCTSTR lpszMeshFile); //加载数据体网格
|
|
|
|
|
|
//输入参数dCurLine与line变量为线道号
|
|
|
bool _CreateLine(CSeisLineData& sd, float line, EOrientation ori, bool bReMemory);
|
|
|
//bool _CreateSeisDataAny(CSeisLineData& sd, float& dCurLine, EOrientation ori);
|
|
|
bool _CreateSeisDataSnap(CSeisLineData& sd, float& dCurLine, EOrientation ori);
|
|
|
|
|
|
//根据定义的曲线生成不规则剖面,曲线为XY平面的线道号坐标
|
|
|
bool _CreateRandLineRC(OUT CSeisLineData& sd, CCurve* pCurve);
|
|
|
//根据定义的曲线生成不规则剖面,曲线为XY平面的实际坐标
|
|
|
bool _CreateRandLineXY(OUT CSeisLineData& sd, CCurve* pCurve);
|
|
|
|
|
|
//输出结果为线道号坐标
|
|
|
bool _CreateCube(CDimension3D& cb, CCubeRange& cr, bool bReMemory=true);
|
|
|
bool _CreateRandMeshRC(CMeshRand2D& md, CCurve* pCurve, EOrientation curOri);//自动步长
|
|
|
bool _CreateRandMeshXY(CMeshRand2D& md, CCurve* pCurve, EOrientation curOri);//生成不规则切片
|
|
|
bool _CreateSliceRC(CMesh2D& md, CDimension2D* pInSuf, bool bLineValue);
|
|
|
bool _CreateSliceRC(CMesh2D& md, float& z_value, bool bLineValue);
|
|
|
|
|
|
//输出结果为实际坐标,输入参数为实际坐标
|
|
|
bool _CreateSliceXY(CMesh2D& md, CDimension2D* pInSuf, bool bLineValue);
|
|
|
bool _CreateRandMesh_XY(CMeshRand2D& md, CCurve* pCurveXY, EOrientation curOri);
|
|
|
bool _CreateRandMesh_XY(CMeshRand2D& md, CCurve* pCurve, float fiexdStep, EOrientation curOri);//指定步长
|
|
|
bool _CreateMeshData(CMesh2D& md, float& dCurLine, EOrientation ori); //生成三方向切片
|
|
|
bool _CreateMeshDataAny(CMesh2D& md, float& dCurLine, EOrientation ori); //插值生成三方向切片
|
|
|
bool _CreateMeshDataSnap(CMesh2D& md, float& dCurLine, EOrientation ori); //根据网格节点(整步长)生成三方向切片
|
|
|
};
|
|
|
|
|
|
}//namespace
|
|
|
|