⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contourtracer.cpp

📁 二维规则网格数据的等值线追踪
💻 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 + -