?? contourtracer.h
字號:
// ContourTracer.h: interface for the CContourTracer class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(CONTOURTRACER_H_INCLUDED_)
#define CONTOURTRACER_H_INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/*========================================================================
* CContourTracer
* 二維規則網格數據的『等值線追蹤』類
* 實現對給定值的等值線追蹤
* 追蹤算法為:網格方法
* ----------------------------------------------
* 鄭元滿 jeny_man 中國地質大學(北京)地信學院
* jeny_man@163.com jeny_man@126.com
* 2004/02/14
*
* 輸入:二維規則網格數據,網格數據信息,所要追蹤的值,輸出的存放位置
*
* 輸出:一個指定值的等值線坐標鏈表,輸出結果放在由外部指定的m_pCurveList中
* 注:該追蹤類約定輸出的數據結構如下組織:
*
* //一條等值線曲線的坐標
* typedef CArray<CGeoPoint,CGeoPoint&> CCurve;
* //等值線曲線鏈表(給定某值的等值線不限于一條)
* typedef CTypedPtrList<CPtrList, CCurve*> CCurveList;
* 使用該類時,外部需按該約定的數據結構來保存追蹤的輸出
*
* 用法:在調用ExecuteTracing()前必須調用
* SetGridDataInfo、SetInput、SetInput
* 這三個函數設置網格數據信息和輸入、輸出
=========================================================================*/
typedef CArray<CGeoPoint,CGeoPoint&> CCurve; //一條等值線曲線的點集的坐標
typedef CTypedPtrList<CPtrList, CCurve*> CCurveList; //等值線曲線鏈表(給定某值的等值線不限于一條)
class CContourTracer
{
public:
CContourTracer();
~CContourTracer();
void SetGridDataInfo(CGridDataInfo& dataInfo);
void SetInput(float** ppGridData);
void SetOutput(CCurveList* pCurveList);
BOOL ExecuteTracing(float value);
private:
//追蹤過程中需要利用如下三個輔助等值點完成追蹤:
//PreviousPoint點-->前一個等值點
//CurrentPoint 點-->當前等值點
// NextPoint 點-->要追蹤的下一個等值點
/* 網格單元橫向、縱向邊的序號(編號)
首先說明的是:該算法實現中,對應于C/C++語言中二維數值用i表示行號,用j表示列號的情況,
我們這里也用i表示網格數據的行號(向上增加),j表示網格數據的列號(向右增加)
而且i,j都是從0開始計數
標識一個網格交點時,行號在前,列號在右,如:(i,j)
(i+1,j) (i+1,j+1)
____________
| |
| |
縱邊(i,j)----→| (網格單元) |←----縱邊(i,j+1)
| |
|____________|
(i,j) ∣ (i,j+1)
∣
↓
橫邊(i,j)
注意:當標識一條邊時,說某一條邊(i,j),它即可以表示橫邊(i,j),也可以表示縱邊(i,j)
所以當標識一條邊時,需要用三個量來表示(i,j,HorV)-->(行號,列號,橫邊還是縱邊)
*/
// 三個輔助等值點所在的橫向、縱向網格邊的序號,以及坐標
struct IsoPoint
{
int i; //該等值點所在邊的行號
int j; //該等值點所在邊的列號
BOOL bHorV; //在橫邊還是列邊上 1-->橫邊;0-->縱邊
float x; //坐標
float y;
IsoPoint(){ memset(this,0,sizeof(IsoPoint));}
}PreviousPoint,CurrentPoint,NextPoint;
//xSide(i,j)---->標識網格橫邊上是否有當前等值點
//ySide(i,j)---->標識網格縱邊上是否有當前等值點
//xSide(i,j),ySide(i,j)中存儲的值為-2.0(說明該邊上無等值點) 或者是 r(r∈[0,1],說明該邊上有等值點)
float **xSide;
float **ySide;
private:
BOOL IsHavingPoint(float r);
void AllocateMemory();
void FreeMemory();
void InterpolateTracingValue(); //掃描并計算縱、橫邊上等值點的情況
void TracingNextPoint(); //追蹤下一個等值點
//{{
//-----Version1---------------
void FromBottom2TopTracing();
void FromLeft2RightTracing();
void FromTop2BottomTracing();
void FromRight2LeftTracing();
//-----Version2---------------
void FromBottom2TopTracingV2();
void FromLeft2RightTracingV2();
void FromTop2BottomTracingV2();
void FromRight2LeftTracingV2();
//}}
void HandlingAfterNextPointFounded(int i, int j, BOOL bHorizon); //當下一個等值點找到后做相應的處理
void CalcAndSaveOnePointCoord(int i, int j, BOOL bHorizon,float &x, float &y);//計算一個等值點的坐標并保存
void TracingOneNonClosedContour();
void TracingNonClosedContour();
void TracingOneClosedContour(int i, int j);
void TracingClosedContour();
private:
//輸入數據
CGridDataInfo m_gridDataInfo; //網格數據信息
float** m_ppGridData; //網格數據
float m_valueTracing; //當前要追蹤的值
//輸出數據的存放位置(需由外部在執行追蹤前設定)
CCurveList* m_pCurveList; //存儲追蹤出來的等值線鏈的坐標
//保存輸出數據時的幫助變量
CCurve* m_currentCurveLine; //指向當前的等值線曲線
private:
CContourTracer(const CContourTracer& rhs); //not implimented
CContourTracer& operator=(const CContourTracer& rhs);//not implimented
};
inline void CContourTracer::SetInput(float** ppGridData)
{
ASSERT( ppGridData != NULL );
m_ppGridData = ppGridData;
}
inline void CContourTracer::SetOutput(CCurveList* pCurveList)
{//指定輸出位置
ASSERT( pCurveList != NULL );
m_pCurveList = pCurveList;
}
inline void CContourTracer::SetGridDataInfo(CGridDataInfo& dataInfo)
{
m_gridDataInfo = dataInfo;
}
inline BOOL CContourTracer::IsHavingPoint(float r)
{
//邊上是否有等值點存在
if( r == -2.0f )
{
return FALSE;
}
else
{
/*r∈[0,1] (閉區間)*/
if( r>1 || r<0)
return FALSE;
else
return TRUE;
}
}
#endif // !defined(CONTOURTRACER_H_INCLUDED_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -