////////////////////////////////////////////////////////////////////////////// //文件: 曲面文件操作类,该曲面具有三维坐标 //主要功能: // 用于保存定义的任意线网格类,该网格类的坐标为一条曲线 //程序编写: 2011-5-5 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include "DrawModel\curve.h" #include "Mesh2D.h" namespace NCube { //任意线曲面保存 class AFX_EXT_CLASS CMeshRand2D : public CMeshCoor3D { public: CMeshRand2D(void); ~CMeshRand2D(void); virtual void Empty(void); //初始化参数,包括计算所有曲面的行列数,间隔,内存申请等 //pCurve:曲线坐标 //aveStep:平均步长,将根据该步长计算每个线段间有多少道数据, // 为了保证每个坐标节点处对应一道数据,每线段间的步长会有一定的上下浮动 //startRange、endRange:当前方向的开始结束值,一般为该方向的最大最小值 bool Initial(CCurve& curve, double aveStep, double rangeStart, double rangeEnd, double rangeStep, EOrientation curOri); bool Initial(CCurve& curve, double aveStep, TIntervalStep range, EOrientation curOri); //按照固定步长生成,坐标节点将根据步长有所改变 bool InitialFixedStep(CCurve& curve, double fixedStep, TIntervalStep range, EOrientation curOri); //曲线坐标是基于xy平面的 //绑定指定的剖面,并根据剖面面的X坐标,在曲线中插值平面坐标(按照固定步长生成) bool AttachSection(CCurve& survey_xy, CGrid* pGridSection, EMeshType mtype); CMeshRand2D& operator =(CMeshRand2D& mr); //坐标曲线操作 bool GetCurveCoord(CCurve& cv, bool bIsMaxRange); //获得所定义曲线的空间坐标 int GetIndexTrace(int nCurveNodeIndex); //获得坐标曲线节点对应的数据道索引 double GetIndexTraceStep(int nCurveNodeIndex); //获得坐标曲线节点(该节点与前一节点组成的线段)对应的数据道步长 double GetPercent(int nCurveNodeIndex) //获得曲线节点所占的百分比数 { return m_pCoor->l[nCurveNodeIndex]/m_pCoor->l[m_pCoor->num-1]; } //道操作 bool GetTraceCoord(int nTraceIndex, dfPoint& pt, bool bIsMaxRange); //获得指定道的坐标 dfPoint GetCoordinate(int i, int j); bool GetCoordinate(int i, int j, dfPoint& pt); //获得网格节点的实际空间坐标 void GetOriCoord(int j, CPoint3D& pt); //获得方向坐标 int Write(LPCTSTR lpszFileName); void Write(CFile& fw, const short& ver); int Read(CFile& fr, const short& ver); virtual void Serialize(CArchive& ar, const short &ver); bool WriteSegy(LPCTSTR lpszFileName); protected: int FindCurveNodeIndex(int nTraceIndex); //利用二分法快速定位 //每个坐标点的参数 class CPointIndex { public: CPointIndex() { m_nTraceIndex = 0; m_dStep = 0; } bool operator==( const CPointIndex& cs ) const { return m_nTraceIndex == cs.m_nTraceIndex; } int m_nTraceIndex; //坐标所对应的道索引号 double m_dStep; //计算时该道的间隔,第一个点为原始间隔 }; CCurve* m_pCoor;//曲线坐标,根据方向不同所代表的坐标也不同,与范围m_range相结合形成三方向坐标 //切面沿Z值方向时=oriZslice, 在XY形成的平面上画任意线,坐标X为X,坐标Y为Y // X值方向时=oriInline, 在YZ形成的平面上画任意线,坐标X为Y,坐标Y为Z // Y值方向时=oriCrossline,在XZ形成的平面上画任意线,坐标X为X,坐标Y为Z TIntervalStep m_range; //当前方向的开始结束值 //切面沿Z值方向时,范围为Z值的最大最小 // X值方向时,范围为X值的最大最小 // Y值方向时,范围为Y值的最大最小 TTypeSet m_indexSet; //坐标对应的索引集 }; }//namespace using namespace NCube;