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.

178 lines
5.4 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.

//////////////////////////////////////////////////////////////////////////////
//文件 SeismicDraw.h
//主要功能:
// 双狐基础类库,显示地震剖面数据
//
//程序编写: 2007-3-18
/////////////////////////////////////////////////////////////////////////////
// CSeismicDraw.h: interface for the CSeismicDraw class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SEISMICDRAW_H__911C2B83_8C23_4B79_9C4E_453FD9753F18__INCLUDED_)
#define AFX_SEISMICDRAW_H__911C2B83_8C23_4B79_9C4E_453FD9753F18__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/*///////////////////////////////////////////////////////////////////////////
文件 SeismicDraw.h
主要功能:
绘制地震剖面的类
///////////////////////////////////////////////////////////////////////////*/
#include <vfw.h>
class AFX_EXT_CLASS CSeismicDrawBase
{
public:
CSeismicDrawBase();
virtual ~CSeismicDrawBase();
public:
enum EDrawType
{
typeVDL = 0, //变密度显示
typeVAL = 1, //波形曲线显示
typeVALL = 2, //左变面积
typeVALR = 3, //右变面积
typeVDLVAL = 4, //变密度+波形曲线
typeVDLVALL = 5, //变密度+左变面积
//变密度+透明左变面积
typeVDLVALR = 6 //变密度+右变面积
//变密度+透明右变面积
};
////////////////////////////////////////////////////////////////////////
//调色板使用256色调色板 前252为变密度的颜色 后三个为变面积颜色
RGBQUAD* m_pQuad; //当前调色板
void SetVALColor(COLORREF crBkg, COLORREF crFnt, COLORREF crBas);
void GetVALColor(COLORREF& crBkg,COLORREF& crFnt,COLORREF& crBas);
BYTE GetVdlIndex(float sv); //获得变密度显示时的颜色索引号
int m_nNormalizeMode; //归一化模式
public:
/*///////////////////////////////////////////////////////////////////////////
//初始化地震剖面必要信息
//rtScreen 为剖面的窗口位置
//rtDraw为待显示的行列索引号
////rtDraw.left CDP矩阵的左列
////rtDraw.right CDP矩阵的右列
////rtDraw.top CDP矩阵的上行
////rtDraw.bottom CDP矩阵的下行
////绘制的CDP道数为[left,right] 合计right-left+1 道
//facTimes 波形叠加参数为一道宽度的倍数
//cdpStep 抽道显示参数
//showType 显示类型
/////////////////////////////////////////////////////////////////////////////*/
BOOL InitShowParameter(CRect rtScreen, CRect rtDrawIndex, float facTimes, int cdpStep, int showType); //double方式用,不规则绘制
//生成显示内存图片
void CreateShowMemoryDC();
/*///////////////////////////////////////////////////////////////////////////
绘制参数
///////////////////////////////////////////////////////////////////////////*/
void DrawSec(CDC* pDC, BOOL bStreth);
void DrawSec(CDC* pDC, CPoint ptTopLeft);
//打印预览模式下,获得最少一次能显示的道数,为了防止内存不够
int GetMinCanDrawTraceNum(CRect rtScreen, int nTraceNum);
//在进行绘制过程中首先使用该接口确定绘制参数 返回屏幕的矩形区域和绘制的剖面区域
void COM_INIT_EX(CRect& rtScreen,CRect& rtDraw,int nx,int ny);
protected:
virtual float GetData(int cdp,int sam) = 0; //返回指定道cdp的第sam个采样点
virtual int GetNX() = 0; //获得总道数
virtual int GetNY() = 0; //获得总采样点数
virtual float GetMin(int cdpIndex) = 0; //获得归一化时的最小值
virtual float GetMax(int cdpIndex) = 0; //获得归一化时的最大值,通常两个值相同
protected:
//绘图模式区参数
EDrawType m_nDrawType; //绘图模式 0变密度 1波形 2波形左填充
// 3波形右填充 4变密度+波形
// 5变密度+波形左填充 6变密度+波形右填充
float m_factorTimes; //波形叠加参数为一道宽度的倍数,振幅缩放倍数
int m_cdpStep; //抽道显示参数隔几道显示缺省为1
/////////////////////////////////////////////////////////////////////////////////////
BITMAPINFOHEADER* m_pInfoHeader; //绘图时调色板包含在m_pHeader中
BYTE* m_pHeader; //绘图时的DIB数据位外信息
BYTE* m_pBit; //图形数据
//创建色表
BOOL CreateSeisQuad();
int m_nWide;
int m_nHeight;
int m_nWideD;
int m_nCdpFirstIndex; //需要显示的第一道的CDP索引号
int m_nSamFirstIndex; //需要显示的第一个采样点索引号
int m_nCdpCount; //需要显示的道数
int m_nSamCount; //需要显示的采样点数
//double基础的完全适应显示//////////////////////////////////////////////////////////////////////
double m_dPexilWidth; //每个采样点绘制宽度
double m_dPexilHeight; //每个采样点绘制高度
CRect m_rtScreen; //屏幕显示范围
void InitVALBkg();
int FloatToLong(double val);
int CreateBitmap(int nWidth, int nHeight);
int GetCdpPosition(double colIndex);
int GetSamPosition(double rowIndex);
int GetDataIndex(int row,int col);
//显示函数
void CreateVDLEx_Old();
void CreateVDLEx();
void CreateVALEx();
void CreateVALFLEx();
void CreateVALFREx();
};
class AFX_EXT_CLASS CSeismicDraw : public CSeismicDrawBase
{
public:
CSeismicDraw();
~CSeismicDraw();
virtual float GetData(int cdp, int sam);
virtual int GetNX() { return numx; }
virtual int GetNY() { return numy; }
virtual float GetMin(int cdpIndex) { return m_pMin[cdpIndex]; } //获得归一化时的最小值
virtual float GetMax(int cdpIndex) { return m_pMax[cdpIndex]; } //获得归一化时的最大值,通常两个值相同
/*///////////////////////////////////////////////////////////////////////////
//生成显示内存图片
//pData 待显示的地震剖面矩阵 数据按CDP顺序存储 即1维数组CDP向量连续存储
//nx,ny pData矩阵的维数
///////////////////////////////////////////////////////////////////////////////*/
void CreateShowMemoryDC(float* pData,int nx,int ny);
public:
float* m_pMin;
float* m_pMax;
float* m_pData;
int numx;
int numy;
};
#endif // !defined(AFX_SEISMICDRAW_H__911C2B83_8C23_4B79_9C4E_453FD9753F18__INCLUDED_)