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.

111 lines
4.3 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.

//////////////////////////////////////////////////////////////////////////////
//文件: 三维体文件操作类
//主要功能:
//
//程序编写: 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