📄 contourtracer.cpp
字号:
}
*/
#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 + -