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.

151 lines
4.4 KiB
C

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD>: SegY<67>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
// <09><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><E5A3AC><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>໥ת<E0BBA5><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д: 2011-4-1
//
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RowColRange.h"
#include "CoorTransform.h"
#include "SeisSampleInfo.h"
#include "SeisSurvey2D.h"
namespace NSeis
{
enum EOrientation
{
oriInline = 0,
oriCrossline = 1,
oriZslice = 2,
oriRandline = 3 //<2F><><EFBFBD><EFBFBD>CSeisLineData<74><61>ʹ<EFBFBD><CAB9>
};
//! Defines policy for 2D and 3D Data type
enum EPolicy2D3D
{
polOnly3D = 0,
polBoth2DAnd3D = 1,
polOnly2D = 2
};
enum EAreaStyle
{
areaWork = 0x00000001, //ʹ<>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD>
areaSnapStep = 0x00000002, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
areaAutoDelete = 0x00000004, //<2F>Ƿ<EFBFBD><C7B7>Զ<EFBFBD>ɾ<EFBFBD><C9BE>
};
//<2F><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>ģ<EFBFBD>
// 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>ŵ<EFBFBD><C5B5>໥ת<E0BBA5><D7AA>
// 2<><32><EFBFBD><EFBFBD>γ<EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD>Ϣ
// 3<><33><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ߵ<EFBFBD><DFB5>ż<EFBFBD>Z<EFBFBD><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class AFX_EXT_CLASS CSeisSurvey3D
{
public:
CSeisSurvey3D(void);
~CSeisSurvey3D(void);
public:
CPoint2D toXY(int row, int col) { return m_b2c.toXY(row, col); }
CPoint2D toXY( const CRowCol& rc ) { return m_b2c.toXY(rc); }
CPoint2D toXY( const CPoint2D& rc ) { return m_b2c.toXY(rc.x0, rc.y0); }
CRowCol toRC( const CPoint2D& pt );
CRowCol toRC( double x, double y );
CPoint2D toRCF( const CPoint2D& pt );
CPoint2D toRCF( double x, double y );
void toRCF( CCurve& cv, bool bAutoLocation = true ); //<2F><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void toXY( CCurve& cv, bool bAutoLocation = true ); //<2F><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CRowCol RCF2RC( const CPoint2D& pt );
/*!<\note CRowCol will be snapped using work step. */
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//Start Work
bool IsWork() { return (m_nFlags & areaWork) ? true:false; }
void EnableWork(bool bWork);
//<2F><><EFBFBD><EFBFBD>EnableWork<72><EFBFBD><E8B6A8>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
TIntervalStep<int> inlRange();
TIntervalStep<int> crlRange();
TIntervalStep<float>& zRange();
CCubeRange& GetCubeRange() { return IsWork() ? m_workCube : m_surveyCube; }
void GetRange(CPoint3D& minpt, CPoint3D& maxpt);
CPoint3D minCoord();
CPoint3D maxCoord();
bool isInside(const CRowCol&) const;
void WriteSurvey(LPCTSTR lpszFileName);
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʶ<EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
bool GetSurvey2D(CSeisSurvey2D& sd, LPCTSTR lpszInlHead = NULL, LPCTSTR lpszCrlHead = NULL);
//End Work
////////////////////////////////////////////////////////////////////////////////////////
int inlSnap(double row);
int crlSnap(double col);
float zSnap(double z);
int inlStep() const;
int crlStep() const;
float zStep() const;
double inlDistance(); //!< <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ס<EFBFBD><D7A1><EFBFBD>
double crlDistance(); //!< <20><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ס<EFBFBD><D7A1><EFBFBD>
void Write(CFile& fw, const short& ver);
int Read(CFile& fr, const short& ver);
void Serialize(CArchive& ar, const short &ver);
public:
void setWorkRange(const CCubeRange& cr);
//!< <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD>Χ
//!< <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bGetSnapPoint <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD>
void setWorkRangeXY(CPoint3D& ptMin, CPoint3D& ptMax, bool bGetSnapPoint=false);
void setWorkRangeRC(CPoint3D& ptMin, CPoint3D& ptMax, bool bGetSnapPoint=false);
bool IsSnapStep() { return (m_nFlags & areaSnapStep) ? true:false; }
void EnableSnapStep(bool bSnap);
/*!< Orientation is determined by rotating the inline axis to the crossline axis. */
bool isClockWise() const;
/*!< It's the angle (0 to pi/2) between the X-axis and the Inline-axis (not an inline) */
double computeAngleXInl();
/*!<Gives a ballpark figure of how to scale XY to make it comparable to Z. */
static double defaultXYtoZScale( CUnit::EType unit_z, CUnit::EType unit_xy );
/*!<Gives a ballpark figure of how to scale Z to make it comparable to XY. */
double zScale() const;
void InitZRange(CSeisSampleInfo& si);
bool InitCoorTransform(CDimension3D* pMesh3D); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
CCubeRange m_surveyCube; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>ȱʡ<C8B1><CAA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>ͬ
CCubeRange m_workCube; //<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ʾ<EFBFBD><CABE>Χ
CUnit::EType m_unit_xy; //xy<78><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>굥λ
CUnit::EType m_unit_z; //z<><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>굥λ
CCoorTransform m_b2c; //<2F>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>໥ת<E0BBA5><D7AA>
//CProjection m_l2c; //<2F><>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>໥ת<E0BBA5><D7AA>
//<2F>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD m_nFlags; //һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
}//namespace
using namespace NSeis;