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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? contourtracer.cpp

?? 等值線追蹤與繪制(源代碼)(1.0).rar
?? CPP
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
// 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 ); //在調(diào)用該函數(shù)之前必須調(diào)用SetGridDataInfo()函數(shù)設(shè)置網(wǎng)格數(shù)據(jù)信息

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


	m_valueTracing = value;


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

	//2.掃描網(wǎng)格縱橫邊,內(nèi)插等值點(diǎn)
	//該函數(shù)之中,在計(jì)算等值點(diǎn)時(shí),發(fā)現(xiàn)追蹤值與網(wǎng)格點(diǎn)上的數(shù)據(jù)相同時(shí),
	//在計(jì)算前,會(huì)都數(shù)據(jù)做修正(加上一小偏移值)
	InterpolateTracingValue(); 

	//3.先追蹤開(kāi)曲線
	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 )
	{
		//網(wǎng)格中存在rows*(cols-1)條橫邊,所有需要為xSide分配rows*(cols-1)空間就行

		C2DMemAllocator::AllocMemory2D(xSide,rows,cols-1/*not cols*/);
	}
	
	if( ySide == NULL )
	{
		//網(wǎng)格中存在(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;
	}
	
}


//-----消除網(wǎng)格交點(diǎn)奇異Z值------
//在自動(dòng)網(wǎng)格邊上追蹤等值點(diǎn)時(shí),有時(shí)會(huì)遇到網(wǎng)格交點(diǎn)上的Z值與追蹤的等值線值相等的情況;
//如果不對(duì)這種情況進(jìn)行處理,網(wǎng)格追蹤算法就會(huì)出現(xiàn)錯(cuò)誤,一般的處理如下:
//將網(wǎng)格交點(diǎn)上的z值加或減一個(gè)修正值,來(lái)消除奇異點(diǎn)的影響

//void CContourTracer::AmendingData(BOOL  bForTracing  /*是否為追縱算法而修正數(shù)據(jù)*/, 
//							   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
//			}
//		}
//	}
//}

//掃描網(wǎng)格的縱、橫邊,并線性插值計(jì)算等值點(diǎn)的情況
//將各邊上的等值點(diǎn)情況存儲(chǔ)于xSide和ySide數(shù)組中,
// xSide存儲(chǔ)所有橫邊上的等值線情況, ySide存儲(chǔ)所有縱邊上的等值點(diǎn)情況
//在插值計(jì)算時(shí),對(duì)『與追蹤值相等的數(shù)據(jù)』要進(jìn)行修正處理后才計(jì)算,但在做修正處理時(shí)不要改變?cè)瓉?lái)的數(shù)據(jù)
void CContourTracer::InterpolateTracingValue()
{
/*      網(wǎng)格點(diǎn)標(biāo)識(shí)如下:
        
            (i+1,j)·--------·(i+1,j+1)
                    |        |
                    |        |
                    |        |
	                |        |
	         (i,j) ·--------·(i,j+1)

              i:表示行號(hào)(向上增加)
			  j:表示列號(hào)(向右增加)
			  標(biāo)識(shí)一個(gè)網(wǎng)格交點(diǎn)時(shí),行號(hào)在前,列號(hào)在右,如:(i,j)
*/
/*        xSide,ySide中存儲(chǔ)r值,(w為追蹤值)
          對(duì)于網(wǎng)格橫邊,r = (w - pData[i][j]) / (pData[i][j+1]-pData[i][j]);
		  對(duì)于網(wǎng)格縱邊,r = (w - pData[i][j]) / (pData[i+1][j]-pData[i][j]);

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

       
		  2。當(dāng)網(wǎng)格邊上兩端點(diǎn)上的值相差很懸殊時(shí)。
		     比如追蹤2值,遇到如下邊:
		     1.70141E+038 ·--------·1   此邊上有2值,計(jì)算(2-1.70141E+038) / (1-1.70141E+038) == 1.0 

        網(wǎng)格邊上有等值點(diǎn)時(shí),理論上比例值不會(huì)等于0或1;
		 但由于計(jì)算誤差,我們?cè)谒惴ㄖ信袛鄷r(shí),認(rèn)為0或1也是有等值點(diǎn)的

        所以xSide,ySide中存儲(chǔ)的值是[0,1]的閉區(qū)間,不是(0,1)的開(kāi)區(qū)間
*/
	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; //分別記錄一條邊的兩個(gè)點(diǎn)上的數(shù)據(jù)值
	float flag; 
	float shift = 0.001f;  //修正值


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

			}
			
			


		}
	}

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

//			if( pData[i][j] == pData[i+1][j] )
//			{
//				/* -2表示此邊無(wú)等值點(diǎn),或已追蹤過(guò),以后不再考慮*/
//				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 )
				{/*
				 網(wǎng)格邊上有等值點(diǎn)時(shí),存儲(chǔ)的值∈[0,1] (閉區(qū)間)
                 */
					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);

}

//當(dāng)下一個(gè)等值點(diǎn)找到后做相應(yīng)的處理
void CContourTracer::HandlingAfterNextPointFounded(int i, int j, BOOL bHorizon)
{//參數(shù)說(shuō)明:i,j分別是等值點(diǎn)所在邊的編號(hào),bHorizon指明所在邊是橫邊還是縱邊

	//當(dāng)下一個(gè)等值點(diǎn)找到后做相應(yīng)的處理,如下:
	//1.記錄該等值點(diǎn)的i,j
	//2.計(jì)算并保存該等值點(diǎn)的坐標(biāo)
	//3.標(biāo)志該等值點(diǎn)所在邊的已經(jīng)搜索過(guò)

	//驗(yàn)證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; //已經(jīng)追蹤過(guò)
	}
	else
	{	
		ySide[i][j] = -2.0f; //已經(jīng)追蹤過(guò)
	}

}

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

  前進(jìn)方向可以如下判定:
    if( 當(dāng)前點(diǎn).行號(hào) > 前一點(diǎn).行號(hào) )
    {
	    下---->上
	}
	else if( 當(dāng)前點(diǎn).列號(hào) > 前一點(diǎn).列號(hào) )
    {
		左---->右
	}
    else if( 當(dāng)前點(diǎn)在橫邊上 )
	{
		上---->下
	}
	else
	{
	     右---->左

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91黄色在线观看| 久久久天堂av| 在线观看欧美精品| 99久久综合国产精品| 成人免费毛片aaaaa**| 国产成人精品三级| 国产一区不卡在线| 国产盗摄视频一区二区三区| 狠狠色丁香久久婷婷综合丁香| 久久91精品国产91久久小草| 精品一区二区在线看| 精品一区二区三区的国产在线播放| 麻豆精品一区二区av白丝在线| 麻豆国产精品777777在线| 麻豆精品视频在线| 精品在线一区二区| 国产一区二区免费视频| 国产成人精品影院| 成人免费毛片aaaaa**| av动漫一区二区| 色婷婷亚洲精品| 欧美三级乱人伦电影| 91精品国产欧美一区二区| 日韩免费高清av| 国产区在线观看成人精品| 国产精品久久久久久久午夜片 | 狠狠色综合日日| 国产美女精品在线| 成人激情动漫在线观看| 91在线你懂得| 91麻豆精品国产91久久久久| 精品国产乱码久久久久久图片| 国产色一区二区| 亚洲精品视频自拍| 欧美日韩国产另类一区| 91精品免费观看| 久久久久久久av麻豆果冻| 自拍偷自拍亚洲精品播放| 亚洲成人av一区| 国产在线一区二区综合免费视频| 不卡一区二区在线| 欧美日韩综合在线| 精品国产凹凸成av人网站| 国产精品伦理一区二区| 亚洲国产另类av| 国产一区在线观看麻豆| 色999日韩国产欧美一区二区| 欧美一区二区三区啪啪| 欧美国产在线观看| 亚洲电影第三页| 国产麻豆精品在线观看| 欧洲精品在线观看| 26uuu国产一区二区三区| 亚洲美腿欧美偷拍| 蜜桃免费网站一区二区三区| 99re视频精品| 欧美成人r级一区二区三区| ...中文天堂在线一区| 奇米综合一区二区三区精品视频| 99热精品一区二区| 日韩一区二区麻豆国产| 亚洲视频一二三| 国内精品国产三级国产a久久| 欧美中文字幕一二三区视频| 国产亚洲欧美中文| 日韩精品一级二级| 99精品黄色片免费大全| 26uuu欧美| 在线看国产一区二区| 亚洲精品一区二区三区在线观看 | 国内成人精品2018免费看| 色噜噜狠狠色综合欧洲selulu| 欧美精品一区男女天堂| 午夜精品一区二区三区电影天堂| 成人av免费在线观看| 欧美va亚洲va| 日韩影院免费视频| 一本久久精品一区二区| 国产色婷婷亚洲99精品小说| 美女爽到高潮91| 欧美亚州韩日在线看免费版国语版| 中文字幕精品三区| 久久精品99久久久| 欧美少妇一区二区| 亚洲视频在线一区二区| 国产成人在线视频网站| 欧美mv日韩mv国产| 日日摸夜夜添夜夜添精品视频| 在线欧美小视频| 亚洲丝袜自拍清纯另类| 成人aaaa免费全部观看| 国产欧美一区二区精品仙草咪| 精品亚洲免费视频| 日韩一区二区三区高清免费看看 | 丁香婷婷综合五月| 亚洲精品在线三区| 久久精品国产一区二区| 欧美疯狂性受xxxxx喷水图片| 亚洲午夜精品17c| 欧美性大战xxxxx久久久| 一区二区成人在线| 色中色一区二区| 亚洲免费高清视频在线| 99久久精品情趣| 国产精品国产自产拍在线| 国产成a人无v码亚洲福利| 国产亚洲女人久久久久毛片| 国产精品一级二级三级| 国产偷v国产偷v亚洲高清| 国产成人自拍网| 中文无字幕一区二区三区| 成人丝袜视频网| 国产精品高潮呻吟久久| 不卡视频在线看| 亚洲欧美成人一区二区三区| 91久久精品日日躁夜夜躁欧美| 一区二区三区高清在线| 欧美色精品在线视频| 日韩成人伦理电影在线观看| 欧美二区在线观看| 日韩**一区毛片| 欧美精品一区二区三区在线播放| 国产精品一区二区免费不卡| 国产精品国产成人国产三级| 91久久久免费一区二区| 香蕉乱码成人久久天堂爱免费| 亚洲成人资源在线| 538prom精品视频线放| 看电视剧不卡顿的网站| 久久影院午夜论| 99精品国产视频| 午夜一区二区三区在线观看| 日韩无一区二区| 国产福利一区二区三区| 亚洲欧美另类在线| 欧美日韩成人一区| 久久精品国产精品亚洲综合| 中文久久乱码一区二区| 色吊一区二区三区| 日韩中文字幕麻豆| 久久久久久免费网| 91视频.com| 日本 国产 欧美色综合| 国产人成亚洲第一网站在线播放 | 国产精品伦理在线| 欧美三片在线视频观看| 精品一区二区免费视频| 自拍偷自拍亚洲精品播放| 欧美精品电影在线播放| 国产东北露脸精品视频| 亚洲一区二区三区中文字幕在线| 欧美刺激脚交jootjob| 成年人国产精品| 天天av天天翘天天综合网色鬼国产| 久久―日本道色综合久久| 99re成人精品视频| 免费不卡在线视频| 国产精品久久久久久久久免费樱桃| 欧美精品乱码久久久久久| 国产成人免费视频网站 | 免费在线观看一区二区三区| 中文字幕在线不卡一区二区三区| 8x8x8国产精品| 不卡的av在线| 久久er99热精品一区二区| 亚洲人成精品久久久久久| 91精品国产免费| 色域天天综合网| 国产一区91精品张津瑜| 亚洲高清在线精品| 日本一区二区高清| 91精品欧美一区二区三区综合在| 99在线热播精品免费| 精品一区二区三区在线播放| 亚洲线精品一区二区三区八戒| 国产精品美女久久久久久久久 | 一区二区在线观看免费 | 中文字幕一区二区三区在线播放| 欧美成人免费网站| 欧洲中文字幕精品| 成人一区二区在线观看| 奇米精品一区二区三区在线观看 | 91精品国产综合久久福利| 色综合天天狠狠| 成人免费视频免费观看| 久久91精品国产91久久小草| 天堂成人国产精品一区| 亚洲日本乱码在线观看| 国产精品免费久久| 337p日本欧洲亚洲大胆色噜噜| 欧美日韩五月天| 在线一区二区三区| 99视频在线精品| 成人av网站免费| 国产99久久久国产精品免费看| 国产一区二区三区国产| 免费精品99久久国产综合精品| 视频在线观看91| 午夜激情久久久| 午夜精品久久久久久久|