亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? contourtracer.cpp

?? 生成等值線的代碼 用VISUAL C++開發
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// ContourTracer.cpp: implementation of the CContourTracer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ContourGenerator.h"
#include "ContourTracer.h"
#include "2DMemAllocator.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CContourTracer::CContourTracer()
{
	m_ppGridData = NULL;

	m_pCurveList = NULL;
	m_currentCurveLine = NULL;

	xSide = NULL;
	ySide = NULL;

}

CContourTracer::~CContourTracer()
{
	FreeMemory();	
}



BOOL CContourTracer::ExecuteTracing(float value)
{
	ASSERT( m_gridDataInfo.cols != 0 ); //在調用該函數之前必須調用SetGridDataInfo()函數設置網格數據信息

	if( value < m_gridDataInfo.zMin && value > m_gridDataInfo.zMax )
	{
		return FALSE;
	}


	m_valueTracing = value;


	//1.為xSide和ySide分配內存空間
	AllocateMemory();

	//2.掃描網格縱橫邊,內插等值點
	//該函數之中,在計算等值點時,發現追蹤值與網格點上的數據相同時,
	//在計算前,會都數據做修正(加上一小偏移值)
	InterpolateTracingValue(); 

	//3.先追蹤開曲線
	TracingNonClosedContour();

	//4.再追蹤閉曲線
	TracingClosedContour();

	//5.釋放空間
	//FreeMemory();

	return TRUE;
	



	
}

void CContourTracer::AllocateMemory()
{// 分配xSide,ySide空間
	int cols = m_gridDataInfo.cols;
	int rows = m_gridDataInfo.rows;
	
	if( xSide == NULL )
	{
		//網格中存在rows*(cols-1)條橫邊,所有需要為xSide分配rows*(cols-1)空間就行

		C2DMemAllocator::AllocMemory2D(xSide,rows,cols-1/*not cols*/);
	}
	
	if( ySide == NULL )
	{
		//網格中存在(rows-1)*cols條縱邊,所有需要為ySide分配(rows-1)*cols空間就行

		C2DMemAllocator::AllocMemory2D(ySide,rows-1/*not rows*/,cols);
	}
	
}

void CContourTracer::FreeMemory()
{
	
	if( xSide != NULL )
	{
		C2DMemAllocator::FreeMemory2D(xSide);
		xSide = NULL;
	}
	
	if( ySide != NULL )
	{
		C2DMemAllocator::FreeMemory2D(ySide);
		ySide = NULL;
	}
	
}


//-----消除網格交點奇異Z值------
//在自動網格邊上追蹤等值點時,有時會遇到網格交點上的Z值與追蹤的等值線值相等的情況;
//如果不對這種情況進行處理,網格追蹤算法就會出現錯誤,一般的處理如下:
//將網格交點上的z值加或減一個修正值,來消除奇異點的影響

//void CContourTracer::AmendingData(BOOL  bForTracing  /*是否為追縱算法而修正數據*/, 
//							   float fValueTracing/*所要追蹤的等值線值*/)
//{
//
//	ASSERT( m_ppGridData!=NULL );
//
//	int i,j;
//
//	float shift = 0.001f;  //修正值
//
//	if(bForTracing)
//	{
//		//若把與所要追蹤的值相同的加修正值
//		for(i=0; i<m_gridDataInfo.rows; i++)
//		{
//			for(j=0; j<m_gridDataInfo.cols; j++)
//			{
//				if( m_ppGridData[i][j] == fValueTracing )  
//					m_ppGridData[i][j] += shift;    //should changing back!!
//			}
//		}
//	}
//	else
//	{
//		float shiftVal = fValueTracing + shift;
//
//		for(i=0; i<m_gridDataInfo.rows; i++)
//		{
//			for(j=0; j<m_gridDataInfo.cols; j++)
//			{
//				if( m_ppGridData[i][j] == shiftVal )  
//					m_ppGridData[i][j] -= shift;    //restore original data
//			}
//		}
//	}
//}

//掃描網格的縱、橫邊,并線性插值計算等值點的情況
//將各邊上的等值點情況存儲于xSide和ySide數組中,
// xSide存儲所有橫邊上的等值線情況, ySide存儲所有縱邊上的等值點情況
//在插值計算時,對『與追蹤值相等的數據』要進行修正處理后才計算,但在做修正處理時不要改變原來的數據
void CContourTracer::InterpolateTracingValue()
{
/*      網格點標識如下:
        
            (i+1,j)·--------·(i+1,j+1)
                    |        |
                    |        |
                    |        |
	                |        |
	         (i,j) ·--------·(i,j+1)

              i:表示行號(向上增加)
			  j:表示列號(向右增加)
			  標識一個網格交點時,行號在前,列號在右,如:(i,j)
*/
/*        xSide,ySide中存儲r值,(w為追蹤值)
          對于網格橫邊,r = (w - pData[i][j]) / (pData[i][j+1]-pData[i][j]);
		  對于網格縱邊,r = (w - pData[i][j]) / (pData[i+1][j]-pData[i][j]);

		  由于浮點運算的誤差,xSide[i][j],ySide[i][j]有可能等于1.0或0.0 
		  考慮如下情況:
		  1。當追蹤值與網格點上的值很接近(但不相等)時,由于運算誤差,就會等于1.0
		     比如追蹤0值時,遇到如下邊:
			       20 ·--------·-0.00000016   此邊上有0值,但計算 (0-20)/(-0.00000016-20) == 1.0 

       
		  2。當網格邊上兩端點上的值相差很懸殊時。
		     比如追蹤2值,遇到如下邊:
		     1.70141E+038 ·--------·1   此邊上有2值,計算(2-1.70141E+038) / (1-1.70141E+038) == 1.0 

        網格邊上有等值點時,理論上比例值不會等于0或1;
		 但由于計算誤差,我們在算法中判斷時,認為0或1也是有等值點的

        所以xSide,ySide中存儲的值是[0,1]的閉區間,不是(0,1)的開區間
*/
	ASSERT( m_ppGridData!=NULL );
	ASSERT( xSide != NULL );
	ASSERT( ySide != NULL );
	
	int i,j;
	
	int   rows = m_gridDataInfo.rows;
	int   cols = m_gridDataInfo.cols;
	float  w   = m_valueTracing; 
	float** pData = m_ppGridData;
	
	float H1,H2; //分別記錄一條邊的兩個點上的數據值
	float flag; 
	float shift = 0.001f;  //修正值


	/* 掃描并計算橫邊上的等值點,有rows*(cols-1)條橫邊需要掃描*/
	for(i=0; i<rows ; i++)
	{
		for(j=0;j<cols-1;j++)
		{				
			/*考查橫邊(i,j)上的左交點(i,j)上的值pData[i][j]
			                 和右交點(i,j+1)的值pData[i][j+1]*/
//			if( pData[i][j] == pData[i][j+1] )
//			{
//				// -2表示此邊無等值點
//				xSide[i][j] = -2.0f;
//			}
//			else
//			{
//				xSide[i][j] = (w - pData[i][j]) / ( pData[i][j+1] - pData[i][j] );
//				
//				if( ( xSide[i][j] <= 0 )  || ( xSide[i][j] >= 1 ) )
//					xSide[i][j] = -2.0f;
//			}

			H1 = pData[i][j]; 			H2 = pData[i][j+1];		

			if( H1 == H2 )
			{
				xSide[i][j] = -2.0f;
			}
			else
			{
				flag = (w-H1) * (w-H2);
				if( flag > 0 )
				{
					xSide[i][j] = -2.0f;
				}
				else if( flag < 0 )
				{
					xSide[i][j] = (w-H1) / (H2-H1) ; 
					ASSERT(xSide[i][j]>=0 && xSide[i][j]<=1.0f);
				}
				else if( flag == 0)
				{//其中有一值與追蹤值w相等,則修正之(加上一小值偏移量)
					if( H1 == w )
					{
						H1 += shift;
					}
					else
					{
						H2 += shift;
					}
					
					xSide[i][j] = (w-H1) / (H2-H1) ; 
				//	ASSERT(xSide[i][j]>=0 && xSide[i][j]<=1.0f);

				}
				else
				{
					ASSERT(FALSE);
				}

			}
			
			


		}
	}

	/* 掃描并計算縱邊上等值點,有(rows-1)*cols條縱邊需要掃描*/
	for(i=0; i<rows-1;i++)
	{
		for(j=0; j<cols; j++)
		{			
			/*考查縱邊(i,j)上的下交點(i,j)上的值pData[i][j]
			                 和上交點(i+1,j)的值pData[i+1][j]*/

//			if( pData[i][j] == pData[i+1][j] )
//			{
//				/* -2表示此邊無等值點,或已追蹤過,以后不再考慮*/
//				ySide[i][j] = -2.0f;
//			}
//			else
//			{
//				ySide[i][j] = (w - pData[i][j]) / ( pData[i+1][j] - pData[i][j] );
//				
//				if( ( ySide[i][j] <= 0 )  || ( ySide[i][j] >= 1 ) )
//					ySide[i][j] = -2.0f;
//			}
                                             
			H1 = pData[i][j];            
			H2 = pData[i+1][j];		     
                                         
			if( H1 == H2 )               
			{
				ySide[i][j] = -2.0f;
			}
			else
			{
				flag = (w-H1) * (w-H2);
				if( flag > 0 )
				{
					ySide[i][j] = -2.0f;
				}
				else if( flag < 0 )
				{/*
				 網格邊上有等值點時,存儲的值∈[0,1] (閉區間)
                 */
					ySide[i][j] = (w-H1) / (H2-H1) ; 
					ASSERT(ySide[i][j]>=0 && ySide[i][j]<=1.0f);
				}
				else if( flag == 0 )
				{//如果其中有一值與追蹤值w相等,則修正之(加上一小值偏移量)
					if( H1 == w )
					{
						H1 += shift;
					}
					else
					{
						H2 += shift;
					}
					
					ySide[i][j] = (w-H1) / (H2-H1) ; 
				//	ASSERT(ySide[i][j]>=0 && ySide[i][j]<=1.0f);
				}
				else
				{
					ASSERT(FALSE);
				}


			}

		}
	}
}

inline void CContourTracer::CalcAndSaveOnePointCoord(int i, int j, BOOL bHorizon,float &x, float &y)
{
	/*static*/ float deltX = (m_gridDataInfo.xMax - m_gridDataInfo.xMin) / ( m_gridDataInfo.cols - 1 );
	/*static*/ float deltY = (m_gridDataInfo.yMax - m_gridDataInfo.yMin) / ( m_gridDataInfo.rows - 1 );
	// should not be static, because diffirent input data has diffirent xyMin Max
	
	
	if( bHorizon )
	{//在橫邊上
		x = m_gridDataInfo.xMin + ( j + xSide[i][j] ) * deltX;
		y = m_gridDataInfo.yMin + i * deltY;		
	}
	else
	{//在縱邊上
		x = m_gridDataInfo.xMin + j * deltX;
		y = m_gridDataInfo.yMin + ( i + ySide[i][j] ) * deltY;
	}

	//Saving Coord
	CGeoPoint point(x,y);
	m_currentCurveLine->Add(point);

}

//當下一個等值點找到后做相應的處理
void CContourTracer::HandlingAfterNextPointFounded(int i, int j, BOOL bHorizon)
{//參數說明:i,j分別是等值點所在邊的編號,bHorizon指明所在邊是橫邊還是縱邊

	//當下一個等值點找到后做相應的處理,如下:
	//1.記錄該等值點的i,j
	//2.計算并保存該等值點的坐標
	//3.標志該等值點所在邊的已經搜索過

	//驗證i∈[0,rows-1], j∈[0,cols-1]
	ASSERT( i>=0 && i<=m_gridDataInfo.rows-1 && j>=0 && j<=m_gridDataInfo.cols-1 );

	//1.
	NextPoint.i = i;
	NextPoint.j = j;
    NextPoint.bHorV = bHorizon;

	//2.
	CalcAndSaveOnePointCoord(i,j,bHorizon,NextPoint.x,NextPoint.y);

	//3.
	if( NextPoint.bHorV )
	{
		xSide[i][j] = -2.0f; //已經追蹤過
	}
	else
	{	
		ySide[i][j] = -2.0f; //已經追蹤過
	}

}

void CContourTracer::TracingNextPoint()
{
/*  
  1.先確定出等值線的前進方向(自下向上、由左向右、自上向下、由右向左,其中之一)
  2.再追蹤下一個等值點

  前進方向可以如下判定:
    if( 當前點.行號 > 前一點.行號 )
    {
	    下---->上
	}
	else if( 當前點.列號 > 前一點.列號 )
    {
		左---->右
	}
    else if( 當前點在橫邊上 )
	{
		上---->下
	}
	else
	{
	     右---->左

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美va在线播放| 亚洲第一电影网| 久久国产日韩欧美精品| 欧美日韩精品一区视频| 亚洲精品一二三区| 欧美在线观看一二区| 亚洲影视在线播放| 欧美区视频在线观看| 久久激情综合网| 国产亚洲精品久| www.综合网.com| 亚洲成av人片| 久久影音资源网| 99久久精品国产一区二区三区| 亚洲美女精品一区| 日韩欧美你懂的| www.色精品| 日韩精品一区第一页| 久久久久久久综合色一本| 成人av电影在线网| 精品一区二区在线视频| 亚洲人妖av一区二区| 日韩一级免费观看| 色综合网站在线| 日本女优在线视频一区二区 | 国产高清一区日本| 天堂一区二区在线| 中文字幕制服丝袜一区二区三区| 欧美日韩三级在线| 成人小视频在线| 伦理电影国产精品| 亚洲国产精品人人做人人爽| 欧美国产日韩a欧美在线观看| 欧美精品国产精品| 精品视频在线视频| 91精品福利视频| 91在线云播放| 99精品国产一区二区三区不卡| 韩国精品久久久| 老司机免费视频一区二区三区| 国产精品国产三级国产aⅴ原创| 欧美日韩电影一区| 欧美主播一区二区三区| av毛片久久久久**hd| 99精品国产热久久91蜜凸| 国产精品一色哟哟哟| 韩国在线一区二区| 国产精品性做久久久久久| 精品一区二区三区的国产在线播放| 日韩精品一二区| 麻豆精品久久精品色综合| 精品在线观看免费| 大陆成人av片| 欧美三级在线播放| 日韩欧美色综合网站| 欧美精品一区视频| 日本一区二区不卡视频| 亚洲精品一二三| 免费观看在线综合| 福利91精品一区二区三区| 色综合久久久久综合| 欧美日韩国产首页| 国产欧美一区二区三区在线看蜜臀| 国产精品嫩草久久久久| 亚洲综合在线五月| 国内不卡的二区三区中文字幕 | 日韩一卡二卡三卡| 国产精品美女久久久久久| 亚洲午夜久久久久久久久电影网 | 成人美女视频在线观看| 91国产免费观看| 久久午夜电影网| 亚洲免费观看在线观看| 日本视频中文字幕一区二区三区| 国产一区二区三区| 欧美三级在线视频| 亚洲美女偷拍久久| 成人毛片在线观看| 久久久久久99久久久精品网站| 亚洲成人午夜电影| 91碰在线视频| 国产亚洲女人久久久久毛片| 亚洲bt欧美bt精品777| 99久久久免费精品国产一区二区| 日韩欧美国产一区二区三区| 午夜精品一区二区三区免费视频| 91美女视频网站| 亚洲欧洲国产日韩| 色综合久久精品| 亚洲精品国产视频| 色欧美日韩亚洲| 夜夜揉揉日日人人青青一国产精品| 97精品超碰一区二区三区| 国产精品丝袜黑色高跟| 成人午夜免费视频| 亚洲欧洲一区二区在线播放| 国产成人精品1024| 亚洲欧美国产毛片在线| 在线日韩一区二区| 首页国产丝袜综合| 欧美一区二区三区免费视频| 蜜乳av一区二区| 国产日韩欧美综合一区| 99久久综合99久久综合网站| 一区二区三区高清| 91精品国产91久久久久久最新毛片 | 成人激情图片网| 国产精品白丝在线| 欧美在线看片a免费观看| 七七婷婷婷婷精品国产| 亚洲国产成人私人影院tom| 在线观看视频一区| 另类中文字幕网| 亚洲欧美日韩人成在线播放| 欧美日韩精品一区视频| 国产麻豆9l精品三级站| 亚洲综合一二三区| 亚洲精品一线二线三线| 91视频www| 国产999精品久久| 免费不卡在线视频| 亚洲欧洲日产国码二区| 久久夜色精品一区| 欧美日韩国产大片| av亚洲精华国产精华| 日日噜噜夜夜狠狠视频欧美人| 中文欧美字幕免费| 日韩欧美成人一区| 欧美欧美欧美欧美| 一本到一区二区三区| 成人一区二区三区视频在线观看 | 成人激情免费电影网址| 国产真实精品久久二三区| 性久久久久久久久久久久| 国产精品美女久久久久av爽李琼| 欧美日韩大陆在线| 91国产免费观看| 欧美综合一区二区| 91影院在线免费观看| av爱爱亚洲一区| www.日韩在线| 在线亚洲一区二区| 色婷婷香蕉在线一区二区| 99国内精品久久| 91麻豆swag| 欧美精品欧美精品系列| 欧美精品乱码久久久久久| 制服丝袜亚洲精品中文字幕| 欧美日韩国产大片| 日韩三级精品电影久久久| 日韩午夜三级在线| 精品国产91九色蝌蚪| 国产精品水嫩水嫩| 亚洲资源在线观看| 久久精品国产99久久6| 高清不卡在线观看| 欧美性大战xxxxx久久久| 日韩一区二区在线免费观看| 欧美成人a视频| 日韩一区中文字幕| 婷婷亚洲久悠悠色悠在线播放| 蜜臀国产一区二区三区在线播放| 国产精品1024| 欧美中文字幕久久| 欧美mv和日韩mv国产网站| 亚洲卡通欧美制服中文| 亚洲视频网在线直播| 美女视频黄久久| 91在线国产观看| 91精品国产色综合久久不卡蜜臀| 久久看人人爽人人| 日韩国产欧美在线观看| 91蜜桃传媒精品久久久一区二区| 欧美草草影院在线视频| 欧美久久婷婷综合色| 久久久久久久久久久久电影| 一区二区三区日韩在线观看| 蜜桃精品视频在线| 欧美视频在线一区二区三区 | 日韩高清在线一区| 欧洲一区在线电影| 亚洲男女毛片无遮挡| 国产麻豆一精品一av一免费| 欧美日韩午夜精品| 一区二区三区在线免费观看| 顶级嫩模精品视频在线看| 日韩视频在线永久播放| 日韩制服丝袜先锋影音| 在线精品视频一区二区三四| 中文字幕不卡的av| 丁香另类激情小说| 久久蜜桃一区二区| 成人做爰69片免费看网站| 久久蜜桃一区二区| 国产成人精品影视| 日本一区二区视频在线观看| 韩国av一区二区三区四区| 欧美大黄免费观看| 国产精品中文有码| 国产精品久久久久久久久久久免费看 |