亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧洲精品视频在线观看| 5566中文字幕一区二区电影| 欧美日韩小视频| 欧美成人伊人久久综合网| 亚洲图片你懂的| 韩国精品主播一区二区在线观看 | 91亚洲国产成人精品一区二三| 欧美一区二视频| 亚洲人成亚洲人成在线观看图片 | 亚洲国产另类精品专区| 国产乱人伦偷精品视频免下载| 日本精品一级二级| 国产精品素人一区二区| 蜜芽一区二区三区| 精品视频在线免费| 1区2区3区精品视频| 国产精品1区2区3区| 91精品在线麻豆| 一区二区三区丝袜| jvid福利写真一区二区三区| 日韩免费电影一区| 舔着乳尖日韩一区| 欧美精品丝袜中出| 亚洲国产精品影院| 欧美午夜寂寞影院| 一区二区在线观看视频| 99久久99久久久精品齐齐 | 制服丝袜av成人在线看| 一区二区三区四区不卡在线| 日本国产一区二区| 亚洲欧美福利一区二区| 色婷婷一区二区| 亚洲男人都懂的| 色婷婷狠狠综合| 亚洲欧美偷拍另类a∨色屁股| 丁香婷婷综合激情五月色| 日本一区二区三区国色天香 | 色哟哟精品一区| 一区二区三区欧美日韩| 91丨porny丨首页| 国产精品乱子久久久久| 成人性生交大片免费看在线播放 | 国产亚洲一区二区三区在线观看| 精品无人码麻豆乱码1区2区| 久久青草欧美一区二区三区| 国产福利一区二区三区视频 | 麻豆精品在线看| 精品三级在线看| 国产suv精品一区二区三区| 中文字幕在线观看一区| 欧美中文字幕亚洲一区二区va在线| 亚洲电影一区二区| 欧美一区二区三区视频免费 | 国产欧美精品一区二区色综合| 国产91精品露脸国语对白| 亚洲视频图片小说| 欧美视频三区在线播放| 看电影不卡的网站| 中文字幕一区二区三区不卡| 色欧美88888久久久久久影院| 亚洲成人av一区| 久久亚洲捆绑美女| 91视频在线观看免费| 亚洲国产中文字幕| 久久久久久久久久电影| 91猫先生在线| 奇米四色…亚洲| 国产人久久人人人人爽| 欧美亚洲日本国产| 紧缚奴在线一区二区三区| 国产精品久久久久久久岛一牛影视| 欧美视频精品在线观看| 国产精品一二三| 亚洲国产视频一区二区| 欧美激情一区二区三区全黄| 欧美日本国产视频| 国产91精品在线观看| 天天影视涩香欲综合网 | 精品久久久久久综合日本欧美| 不卡一区二区中文字幕| 亚洲午夜激情网站| 国产日韩精品一区二区三区在线| 欧美日韩一区二区在线观看视频 | 欧美96一区二区免费视频| 亚洲三级在线观看| 久久久久久久久久久久久久久99 | 欧美大片顶级少妇| 欧美亚洲一区二区在线观看| 成人精品电影在线观看| 精品一区二区在线免费观看| 一区二区在线免费| 亚洲素人一区二区| 中文在线资源观看网站视频免费不卡| 欧美丝袜自拍制服另类| 不卡的电视剧免费网站有什么| 韩国女主播成人在线| 青青草精品视频| 午夜久久久久久| 亚洲一卡二卡三卡四卡五卡| 国产精品久久影院| 国产午夜久久久久| 久久午夜国产精品| 日韩欧美国产精品| 91精品麻豆日日躁夜夜躁| 在线观看国产91| 在线视频综合导航| 91在线免费视频观看| 成人一区二区三区| 99久久精品国产毛片| 岛国一区二区在线观看| 国产伦精品一区二区三区免费迷 | 91福利在线导航| 色综合久久久久久久久| 91在线视频免费观看| www.av精品| 91女厕偷拍女厕偷拍高清| www.成人在线| 色欧美片视频在线观看在线视频| 99久久精品一区| 色婷婷综合在线| 欧美三电影在线| 9191久久久久久久久久久| 欧美日韩一区三区| 日韩欧美一区二区免费| 精品久久久久香蕉网| 国产日韩亚洲欧美综合| 国产人成一区二区三区影院| 中文字幕av资源一区| 中文字幕在线视频一区| 亚洲乱码中文字幕| 午夜精品久久久久久久蜜桃app| 五月婷婷综合激情| 老司机午夜精品| 国产激情一区二区三区| 99久久精品国产精品久久| 欧美性淫爽ww久久久久无| 欧美日韩午夜影院| xvideos.蜜桃一区二区| 国产精品日日摸夜夜摸av| 亚洲女与黑人做爰| 视频一区在线播放| 国产酒店精品激情| 色婷婷综合久久| 欧美一级艳片视频免费观看| 欧美精品一区二区在线观看| 国产精品久久二区二区| 自拍偷在线精品自拍偷无码专区| 亚洲国产成人91porn| 老司机精品视频导航| 成人高清免费观看| 7777女厕盗摄久久久| 中文字幕第一区| 琪琪久久久久日韩精品| 福利一区福利二区| 欧美精品vⅰdeose4hd| 精品国产一区二区在线观看| 中文字幕成人在线观看| 日本欧美大码aⅴ在线播放| 国产精品亚洲一区二区三区妖精 | 欧美一区二区三区白人| 欧美国产精品一区二区三区| 天涯成人国产亚洲精品一区av| 国产成人精品亚洲777人妖| 欧美在线你懂的| 亚洲国产精品传媒在线观看| 亚洲综合色成人| 福利电影一区二区三区| 欧美一区二区三区白人| 亚洲人成在线播放网站岛国| 国产成人综合自拍| 日韩午夜激情视频| 一区二区三区日韩精品| av电影天堂一区二区在线| 精品久久久久99| 免费人成黄页网站在线一区二区| 91影视在线播放| 国产精品无遮挡| 国产一区二区三区电影在线观看| 欧美久久一二区| 一区二区三区在线视频免费| 成人免费av网站| 国产亚洲欧美激情| 黄网站免费久久| 精品久久久久av影院 | 亚洲一区二区偷拍精品| 成人免费三级在线| 日本一区二区久久| 国产剧情一区二区| 精品国产乱码久久久久久久久 | 亚洲永久精品大片| 99久久综合狠狠综合久久| 久久色视频免费观看| 久久精品久久久精品美女| 91精品国产综合久久婷婷香蕉 | 午夜一区二区三区视频| 色爱区综合激月婷婷| 国产欧美精品一区二区三区四区 | 奇米影视在线99精品| 欧美日精品一区视频| 亚洲超碰97人人做人人爱|