?? contourtracer.cpp
?? 等值線追蹤與繪制(源代碼)(1.0).rar
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
??
}
*/
#define _CALL_TRACINGFUN_VERSION2
if(CurrentPoint.i > PreviousPoint.i )
{
//TRACE0("下--->上\n");
#ifdef _CALL_TRACINGFUN_VERSION2
FromBottom2TopTracingV2();
#else
FromBottom2TopTracing();
#endif
}
else if(CurrentPoint.j > PreviousPoint.j )
{
//TRACE0("左--->右\n");
#ifdef _CALL_TRACINGFUN_VERSION2
FromLeft2RightTracingV2();
#else
FromLeft2RightTracing();
#endif
}
else if( CurrentPoint.bHorV == TRUE /*curPt_Col_X < CurrentPoint.x*/ )
{//在橫邊上。CurrentPoint.bHorizon == TRUE 和 curPt_Col_X < CurrentPoint.x ,這兩個條件等價
ASSERT( CurrentPoint.i <= PreviousPoint.i &&
CurrentPoint.j <= PreviousPoint.j );
//TRACE0("上--->下\n");
#ifdef _CALL_TRACINGFUN_VERSION2
FromTop2BottomTracingV2();
#else
FromTop2BottomTracing();
#endif
}
else
{
ASSERT(CurrentPoint.bHorV==FALSE);//在縱邊上
ASSERT( CurrentPoint.i <= PreviousPoint.i &&
CurrentPoint.j <= PreviousPoint.j );
//TRACE0("右--->左\n");
#ifdef _CALL_TRACINGFUN_VERSION2
FromRight2LeftTracingV2();
#else
FromRight2LeftTracing();
#endif
}
}
//自下向上追蹤下一等值點
void CContourTracer::FromBottom2TopTracing()
{
/*
橫邊(i+1,j)
xSide[i+1][j]
↑
(i+1,j) ∣ (i+1,j+1)
|-----------|
| |
縱邊(i,j)---→| |←----縱邊(i,j+1)
ySide[i][j] | | ySide[i][j+1]
| |
|-----·----|
(i,j) ↖ (i,j+1)
\
等前等值點(P2)
等值線自下向上前進時,網格單元的情況如上:
當前等值點(用P2表示)在網格單元的底邊上,那么下一等值點(用P3表示)所在的位置有三種情況:
1.在縱邊(i,j)上
2.在縱邊(i,j+1)上
3.在橫邊(i+1,j)上
但實際追蹤時只能選擇其中之一
程序判斷的依據即是:ySide[i][j] 、 ySide[i][j+1] 、xSide[i+1][j]
假設縱邊(i,j)上存在等值點P31, 縱邊(i,j+1)上存在等值點P33, 橫邊(i+1,j)上存在等值點P32
選擇的次序如下:
1.當P31,P33都存在時,選擇靠近網格底邊者為P3(比較ySide[i][j]、ySide[i][j+1])
2.若P31,P33靠近底邊的距離相同,則選擇與P2點距離近者為P3
3.當P31,P33中只有一個存在時,則存在點即為P3
4.當無P31,P33存在時,對邊必定存在P32作為P3
*/
ASSERT( CurrentPoint.i > PreviousPoint.i ); //當前點的行號 > 前一點的行號
ASSERT( CurrentPoint.bHorV == TRUE );
int i = CurrentPoint.i;
int j = CurrentPoint.j;
if( IsHavingPoint(ySide[i][j]) && IsHavingPoint(ySide[i][j+1]) )
{
if( ySide[i][j] < ySide[i][j+1] )
{
HandlingAfterNextPointFounded(i,j,FALSE);//在縱邊(i,j)上
}
else if( ySide[i][j] == ySide[i][j+1] )
{
//注意:這里需要重新計算xSide[i][j],不能直接用xSide[i][j],因為在上一次已經被置為-2.0
float xSideIJ = (m_valueTracing - m_ppGridData[i][j]) / ( m_ppGridData[i][j+1] - m_ppGridData[i][j] );
if( xSideIJ <= 0.5f )
//if( xSide[i][j] <= 0.5f )
{
TRACE3("xSide[%d][%d]=%f,左-->右----遇到兩邊r值相等\n",i,j,xSide[i][j]);
HandlingAfterNextPointFounded(i,j,FALSE);//在縱邊(i,j)上
}
else
{
HandlingAfterNextPointFounded(i,j+1,FALSE);//在縱邊(i,j+1)上
}
}
else
{
HandlingAfterNextPointFounded(i,j+1,FALSE);//在縱邊(i,j+1)上
}
}
else
{
if( IsHavingPoint(ySide[i][j]) )
{
HandlingAfterNextPointFounded(i,j,FALSE);//在縱邊(i,j)上
}
else if( IsHavingPoint(ySide[i][j+1]) )
{
HandlingAfterNextPointFounded(i,j+1,FALSE);//在縱邊(i,j+1)上
}
else if( IsHavingPoint(xSide[i+1][j]) )
{//兩縱邊上都沒有
HandlingAfterNextPointFounded(i+1,j,TRUE);//在橫邊(i+1,j)上
}
else
{//三邊上都沒有,數據插值出現錯誤
ASSERT(FALSE);
}
}
}
//自下向上追蹤函數(第二版本)
void CContourTracer::FromBottom2TopTracingV2()
{
/* 橫邊(i+1,j)
xSide[i+1][j]
↑
(i+1,j) ∣ (i+1,j+1)
|-----------|
| |
縱邊(i,j)---→| |←----縱邊(i,j+1)
ySide[i][j] | | ySide[i][j+1]
| |
|-----·----|
(i,j) ↖ (i,j+1)
\
等前等值點
*/
ASSERT( CurrentPoint.i > PreviousPoint.i ); //當前點的行號 > 前一點的行號
ASSERT( CurrentPoint.bHorV == TRUE );
int i = CurrentPoint.i;
int j = CurrentPoint.j;
if( ySide[i][j] < ySide[i][j+1] )
{
if( ySide[i][j] > 0 )
HandlingAfterNextPointFounded(i,j,FALSE);
else
HandlingAfterNextPointFounded(i,j+1,FALSE);
}
else if( ySide[i][j] == ySide[i][j+1] )
{
if( ySide[i][j] < 0 /*namely, ySide[i][j] == ySide[i][j+1] == -2.0*/)
{
HandlingAfterNextPointFounded(i+1,j,TRUE);
}
else
{
float xSideIJ = (m_valueTracing - m_ppGridData[i][j]) / ( m_ppGridData[i][j+1] - m_ppGridData[i][j] );
if( xSideIJ <=0.5f )
{
HandlingAfterNextPointFounded(i,j,FALSE);
}
else
{
HandlingAfterNextPointFounded(i,j+1,FALSE);
}
}
}
else if( ySide[i][j] > ySide[i][j+1] )
{
if( ySide[i][j+1] > 0 )
HandlingAfterNextPointFounded(i,j+1,FALSE);
else
HandlingAfterNextPointFounded(i,j,FALSE);
}
}
//由左向右追蹤
void CContourTracer::FromLeft2RightTracing()
{
/*
橫邊(i+1,j)
xSide[i+1][j]
∣
∣
(i+1,j) ↓ (i+1,j+1)
|-----------|
| |
等前等值點(P2)--→· |←----縱邊(i,j+1)
| | ySide[i][j+1]
| |
|-----------|
(i,j) ↑ (i,j+1)
∣
橫邊(i,j)
xSide[i][j]
*/
ASSERT( CurrentPoint.j > PreviousPoint.j );
ASSERT( CurrentPoint.bHorV == FALSE );
int i = CurrentPoint.i;
int j = CurrentPoint.j;
if( IsHavingPoint(xSide[i][j]) && IsHavingPoint(xSide[i+1][j]) )
{
if( xSide[i][j] < xSide[i+1][j] )
{
HandlingAfterNextPointFounded(i,j,TRUE);//在橫邊(i,j)上
}
else if( xSide[i][j] == xSide[i+1][j] )
{
//注意:這里需要重新計算ySide[i][j],因為在上一次已經被置為-2.0
float ySideIJ = ( m_valueTracing - m_ppGridData[i][j]) / ( m_ppGridData[i+1][j] - m_ppGridData[i][j] );
if( ySideIJ <= 0.5f )
//if( ySide[i][j] <= 0.5f )
{
TRACE3("ySide[%d][%d]=%f,左-->右----遇到兩邊r值相等\n",i,j,ySide[i][j]);
HandlingAfterNextPointFounded(i,j,TRUE);//在橫邊(i,j)上
}
else
{
HandlingAfterNextPointFounded(i+1,j,TRUE);//在橫邊(i+1,j)上
}
}
else
{
HandlingAfterNextPointFounded(i+1,j,TRUE);//在橫邊(i+1,j)上
}
}
else
{
if( IsHavingPoint(xSide[i][j]) )
{
HandlingAfterNextPointFounded(i,j,TRUE);//在橫邊(i,j)上
}
else if( IsHavingPoint(xSide[i+1][j]) )
{
HandlingAfterNextPointFounded(i+1,j,TRUE);//在橫邊(i+1,j)上
}
else if( IsHavingPoint(ySide[i][j+1]) )
{//兩橫邊上都沒有
HandlingAfterNextPointFounded(i,j+1,FALSE);//在縱邊(i,j+1)上
}
else
{//三邊上都沒有
ASSERT(FALSE);
}
}
}
//由左向右追蹤函數(第二版本)
void CContourTracer::FromLeft2RightTracingV2()
{
ASSERT( CurrentPoint.j > PreviousPoint.j );
ASSERT( CurrentPoint.bHorV == FALSE );
int i = CurrentPoint.i;
int j = CurrentPoint.j;
if( xSide[i][j] < xSide[i+1][j] )
{
if( xSide[i][j] > 0 )
HandlingAfterNextPointFounded(i,j,TRUE);
else
HandlingAfterNextPointFounded(i+1,j,TRUE);
}
else if( xSide[i][j] == xSide[i+1][j] )
{
if( xSide[i][j] < 0 /*namely, xSide[i][j] == xSide[i+1][j] == -2.0*/)
{
HandlingAfterNextPointFounded(i,j+1,FALSE);
}
else
{
float ySideIJ = ( m_valueTracing - m_ppGridData[i][j]) / ( m_ppGridData[i+1][j] - m_ppGridData[i][j] );
if( ySideIJ <= 0.5f )
HandlingAfterNextPointFounded(i,j,TRUE);
else
HandlingAfterNextPointFounded(i+1,j,TRUE);
}
}
else if( xSide[i][j] > xSide[i+1][j] )
{
if( xSide[i+1][j] > 0 )
HandlingAfterNextPointFounded(i+1,j,TRUE);
else
HandlingAfterNextPointFounded(i,j,TRUE);
}
}
//由上向下
void CContourTracer::FromTop2BottomTracing()
{
/*
等前等值點(P2)
∣
∣
(i,j) ↓ (i,j+1)
|-----·----|
| |
縱邊(i-1,j)---→| |←----縱邊(i-1,j+1)
ySide[i-1][j] | | ySide[i-1][j+1]
| |
|-----------|
(i-1,j) ↑ (i-1,j+1)
∣
橫邊(i-1,j)
xSide[i-1][j]
*/
ASSERT( CurrentPoint.bHorV == TRUE );
int i = CurrentPoint.i;
int j = CurrentPoint.j;
if( IsHavingPoint(ySide[i-1][j]) && IsHavingPoint(ySide[i-1][j+1]) )
{
if( ySide[i-1][j] < ySide[i-1][j+1] )
{
HandlingAfterNextPointFounded(i-1,j,FALSE);//在縱邊(i-1,j)上
}
else if( ySide[i-1][j] == ySide[i-1][j+1] )
{
//注意:這里需要重新計算xSide[i][j],因為在上一次已經被置為-2.0
float xSideIJ = ( m_valueTracing - m_ppGridData[i][j]) / ( m_ppGridData[i][j+1] - m_ppGridData[i][j] );
if( /*xSide[i][j]*/ xSideIJ <= 0.5f )
{
TRACE0("xSide[i][j] <= 0.5f\n");
HandlingAfterNextPointFounded(i-1,j,FALSE);//在縱邊(i-,j)上
}
else
{
HandlingAfterNextPointFounded(i-1,j+1,FALSE);//在縱邊(i-1,j+1)上
}
}
else
{
HandlingAfterNextPointFounded(i-1,j+1,FALSE);//在縱邊(i-1,j+1)上
}
}
else
{
if( IsHavingPoint(ySide[i-1][j]) )
{
HandlingAfterNextPointFounded(i-1,j,FALSE);//在縱邊(i-1,j)上
}
else if( IsHavingPoint(ySide[i-1][j+1]) )
{
HandlingAfterNextPointFounded(i-1,j+1,FALSE);//在縱邊(i-1,j+1)上
}
else if( IsHavingPoint(xSide[i-1][j]) )
{//兩縱邊上都沒有
HandlingAfterNextPointFounded(i-1,j,TRUE);//在橫邊(i-1,j)上
}
else
{//三邊上都沒有
ASSERT(FALSE);
}
}
}
//從上到下追蹤子函數的第二版本
void CContourTracer::FromTop2BottomTracingV2()
{
int i = CurrentPoint.i;
int j = CurrentPoint.j;
//比較:ySide[i-1][j] ySide[i-1][j+1]
//
// xSide[i-1][j]
if( ySide[i-1][j] < ySide[i-1][j+1] )
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -