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

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

?? contour.cpp

?? 等值線計(jì)算和繪制源程序
?? CPP
字號(hào):
// Contour.cpp: implementation of the CContour class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "stdlib.h"
#include "math.h"
#include "Contour.h"

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

double TestFunction(double x,double y)
{  
	return 0.5*(cos(x+3.14/4)+sin(y+3.14/4)); 
};

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

CContour::CContour()
{
	m_iColFir=m_iRowFir=32;
	m_iColSec=m_iRowSec=256;
	m_dDx=m_dDy=0;
	m_pFieldFcn=NULL;
	m_pLimits[0]=m_pLimits[2]=0;
	m_pLimits[1]=m_pLimits[3]=5.;
	m_ppFnData=NULL;

	// temporary stuff
	m_pFieldFcn=TestFunction;
	m_vPlanes.resize(20);
	for (UINT i=0;i<m_vPlanes.size();i++)
	{
		m_vPlanes[i]=(i-m_vPlanes.size()/2.0)*0.1;
	}
}

CContour::~CContour()
{
	CleanMemory();
}

void CContour::InitMemory()
{
	if (!m_ppFnData)
	{
		m_ppFnData=new CFnStr*[m_iColSec+1];
		for (int i=0;i<m_iColSec+1;i++)
		{
			m_ppFnData[i]=NULL;
		}
	}
}

void CContour::CleanMemory()
{
	if (m_ppFnData)
	{
		int i;
		for (i=0;i<m_iColSec+1;i++)
		{
			if (m_ppFnData[i])
				delete[] (m_ppFnData[i]);
		}
		delete[] m_ppFnData;
		m_ppFnData=NULL;
	}
}

void CContour::Generate()
{

	int i, j;
	int x3, x4, y3, y4, x, y, oldx3, xlow;
	const int cols=m_iColSec+1;
	const int rows=m_iRowSec+1;
	double xoff,yoff;
	
	// Initialize memroy if needed
	InitMemory();

	m_dDx = (m_pLimits[1]-m_pLimits[0])/(double)(m_iColSec);
	xoff = m_pLimits[0];
	m_dDy = (m_pLimits[3]-m_pLimits[2])/(double)(m_iRowSec);
	yoff = m_pLimits[2];

	xlow = 0;
	oldx3 = 0;
	x3 = (cols-1)/m_iRowFir;
	x4 = ( 2*(cols-1) )/m_iRowFir;
	for (x = oldx3; x <= x4; x++) 
	{	  /* allocate new columns needed
		*/
		if (x >= cols)
			break;
		if (m_ppFnData[x]==NULL)
			m_ppFnData[x] = new CFnStr[rows];

		for (y = 0; y < rows; y++)
			FnctData(x,y)->m_sTopLen = -1;
	}

	y4 = 0;
	for (j = 0; j < m_iColFir; j++) 
	{
		y3 = y4;
		y4 = ((j+1)*(rows-1))/m_iColFir;
		Cntr1(oldx3, x3, y3, y4);
	}

	for (i = 1; i < m_iRowFir; i++) 
	{
		y4 = 0;
		for (j = 0; j < m_iColFir; j++) 
		{
			y3 = y4;
			y4 = ((j+1)*(rows-1))/m_iColFir;
			Cntr1(x3, x4, y3, y4);
		}

		y4 = 0;
		for (j = 0; j < m_iColFir; j++) 
		{
			y3 = y4;
			y4 = ((j+1)*(rows-1))/m_iColFir;
			Pass2(oldx3,x3,y3,y4);
		}

		if (i < (m_iRowFir-1)) 
		{	 /* re-use columns no longer needed */
			oldx3 = x3;
			x3 = x4;
			x4 = ((i+2)*(cols-1))/m_iRowFir;
			for (x = x3+1; x <= x4; x++) 
			{
				if (xlow < oldx3) 
				{
					if (m_ppFnData[x])
						delete[] m_ppFnData[x];
					m_ppFnData[x] = m_ppFnData[xlow];
					m_ppFnData[ xlow++ ] = NULL;
				} 
				else
					if (m_ppFnData[x]==NULL)
						m_ppFnData[x] = new CFnStr[rows];

				for (y = 0; y < rows; y++)
					FnctData(x,y)->m_sTopLen = -1;
			}
		}
	}

	y4 = 0;
	for (j = 0; j < m_iColFir; j++) 
	{
		y3 = y4;
		y4 = ((j+1)*(rows-1))/m_iColFir;
		Pass2(x3,x4,y3,y4);
	}
}

void CContour::Cntr1(int x1, int x2, int y1, int y2)
{
	double f11, f12, f21, f22, f33;
	int x3, y3, i, j;
	
	if ((x1 == x2) || (y1 == y2))	/* if not a real cell, punt */
		return;
	f11 = Field(x1, y1);
	f12 = Field(x1, y2);
	f21 = Field(x2, y1);
	f22 = Field(x2, y2);
	if ((x2 > x1+1) || (y2 > y1+1)) {	/* is cell divisible? */
		x3 = (x1+x2)/2;
		y3 = (y1+y2)/2;
		f33 = Field(x3, y3);
		i = j = 0;
		if (f33 < f11) i++; else if (f33 > f11) j++;
		if (f33 < f12) i++; else if (f33 > f12) j++;
		if (f33 < f21) i++; else if (f33 > f21) j++;
		if (f33 < f22) i++; else if (f33 > f22) j++;
		if ((i > 2) || (j > 2)) /* should we divide cell? */
		{	
			/* subdivide cell */
			Cntr1(x1, x3, y1, y3);
			Cntr1(x3, x2, y1, y3);
			Cntr1(x1, x3, y3, y2);
			Cntr1(x3, x2, y3, y2);
			return;
		}
	}
	/* install cell in array */
	FnctData(x1,y2)->m_sBotLen = FnctData(x1,y1)->m_sTopLen = x2-x1;
	FnctData(x2,y1)->m_sLeftLen = FnctData(x1,y1)->m_sRightLen = y2-y1;
}

void CContour::Pass2(int x1, int x2, int y1, int y2)
{
	int left, right, top, bot,old, iNew, i, j, x3, y3;
	double yy0, yy1, xx0, xx1, xx3, yy3;
	double v, f11, f12, f21, f22, f33, fold, fnew, f;
	double xoff=m_pLimits[0];
	double yoff=m_pLimits[2];
	
	if ((x1 == x2) || (y1 == y2))	/* if not a real cell, punt */
		return;
	f11 = FnctData(x1,y1)->m_dFnVal;
	f12 = FnctData(x1,y2)->m_dFnVal;
	f21 = FnctData(x2,y1)->m_dFnVal;
	f22 = FnctData(x2,y2)->m_dFnVal;
	if ((x2 > x1+1) || (y2 > y1+1)) /* is cell divisible? */
	{	
		x3 = (x1+x2)/2;
		y3 = (y1+y2)/2;
		f33 = FnctData(x3, y3)->m_dFnVal;
		i = j = 0;
		if (f33 < f11) i++; else if (f33 > f11) j++;
		if (f33 < f12) i++; else if (f33 > f12) j++;
		if (f33 < f21) i++; else if (f33 > f21) j++;
		if (f33 < f22) i++; else if (f33 > f22) j++;
		if ((i > 2) || (j > 2)) /* should we divide cell? */ 
		{	
			/* subdivide cell */
			Pass2(x1, x3, y1, y3);
			Pass2(x3, x2, y1, y3);
			Pass2(x1, x3, y3, y2);
			Pass2(x3, x2, y3, y2);
			return;
		}
	}

	for (i = 0; i < (int)m_vPlanes.size(); i++) 
	{
		v = m_vPlanes[i];
		j = 0;
		if (f21 > v) j++;
		if (f11 > v) j |= 2;
		if (f22 > v) j |= 4;
		if (f12 > v) j |= 010;
		if ((f11 > v) ^ (f12 > v)) 
		{
			if ((FnctData(x1,y1)->m_sLeftLen != 0) &&
				(FnctData(x1,y1)->m_sLeftLen < FnctData(x1,y1)->m_sRightLen)) 
			{
				old = y1;
				fold = f11;
				while (1) 
				{
					iNew = old+FnctData(x1,old)->m_sLeftLen;
					fnew = FnctData(x1,iNew)->m_dFnVal;
					if ((fnew > v) ^ (fold > v))
						break;
					old = iNew;
					fold = fnew;
				}
				yy0 = ((old-y1)+(iNew-old)*(v-fold)/(fnew-fold))/(y2-y1);
			} 
			else
				yy0 = (v-f11)/(f12-f11);

			left = (int)(y1+(y2-y1)*yy0+0.5);
		}
		if ((f21 > v) ^ (f22 > v)) 
		{
			if ((FnctData(x2,y1)->m_sRightLen != 0) &&
				(FnctData(x2,y1)->m_sRightLen < FnctData(x2,y1)->m_sLeftLen)) 
			{
				old = y1;
				fold = f21;
				while (1) 
				{
					iNew = old+FnctData(x2,old)->m_sRightLen;
					fnew = FnctData(x2,iNew)->m_dFnVal;
					if ((fnew > v) ^ (fold > v))
						break;
					old = iNew;
					fold = fnew;
				}
				yy1 = ((old-y1)+(iNew-old)*(v-fold)/(fnew-fold))/(y2-y1);
			} 
			else
				yy1 = (v-f21)/(f22-f21);

			right = (int)(y1+(y2-y1)*yy1+0.5);
		}
		if ((f21 > v) ^ (f11 > v)) 
		{
			if ((FnctData(x1,y1)->m_sBotLen != 0) &&
				(FnctData(x1,y1)->m_sBotLen < FnctData(x1,y1)->m_sTopLen)) {
				old = x1;
				fold = f11;
				while (1) {
					iNew = old+FnctData(old,y1)->m_sBotLen;
					fnew = FnctData(iNew,y1)->m_dFnVal;
					if ((fnew > v) ^ (fold > v))
						break;
					old = iNew;
					fold = fnew;
				}
				xx0 = ((old-x1)+(iNew-old)*(v-fold)/(fnew-fold))/(x2-x1);
			} 
			else
				xx0 = (v-f11)/(f21-f11);

			bot = (int)(x1+(x2-x1)*xx0+0.5);
		}
		if ((f22 > v) ^ (f12 > v)) 
		{
			if ((FnctData(x1,y2)->m_sTopLen != 0) &&
				(FnctData(x1,y2)->m_sTopLen < FnctData(x1,y2)->m_sBotLen)) {
				old = x1;
				fold = f12;
				while (1) {
					iNew = old+FnctData(old,y2)->m_sTopLen;
					fnew = FnctData(iNew,y2)->m_dFnVal;
					if ((fnew > v) ^ (fold > v))
						break;
					old = iNew;
					fold = fnew;
				}
				xx1 = ((old-x1)+(iNew-old)*(v-fold)/(fnew-fold))/(x2-x1);
			} 
			else
				xx1 = (v-f12)/(f22-f12);

			top = (int)(x1+(x2-x1)*xx1+0.5);
		}

		switch (j) 
		{
			case 7:
			case 010:
				ExportLine(i,x1,left,top,y2);
				break;
			case 5:
			case 012:
				ExportLine(i,bot,y1,top,y2);
				break;
			case 2:
			case 015:
				ExportLine(i,x1,left,bot,y1);
			break;
		case 4:
		case 013:
			ExportLine(i,top,y2,x2,right);
			break;
		case 3:
		case 014:
			ExportLine(i,x1,left,x2,right);
			break;
		case 1:
		case 016:
			ExportLine(i,bot,y1,x2,right);
			break;
		case 0:
		case 017:
			break;
		case 6:
		case 011:
			yy3 = (xx0*(yy1-yy0)+yy0)/(1.0-(xx1-xx0)*(yy1-yy0));
			xx3 = yy3*(xx1-xx0)+xx0;
			xx3 = x1+xx3*(x2-x1);
			yy3 = y1+yy3*(y2-y1);
			xx3 = xoff+xx3*m_dDx;
			yy3 = yoff+yy3*m_dDy;
			f = (*m_pFieldFcn)(xx3, yy3);
			if (f == v) {
				ExportLine(i,bot,y1,top,y2);
				ExportLine(i,x1,left,x2,right);
			} else
				if (((f > v) && (f22 > v)) || ((f < v) && (f22 < v))) {
					ExportLine(i,x1,left,top,y2);
					ExportLine(i,bot,y1,x2,right);
				} else {
					ExportLine(i,x1,left,bot,y1);
					ExportLine(i,top,y2,x2,right);
				}
		}
	}
}

double CContour::Field(int x, int y)	 /* evaluate funct if we must,	*/
{
	double x1, y1;
	
	if (FnctData(x,y)->m_sTopLen != -1)  /* is it already in the array */
		return(FnctData(x,y)->m_dFnVal);

	/* not in the array, create new array element */
	x1 = m_pLimits[0]+m_dDx*x;
	y1 = m_pLimits[2]+m_dDy*y;
	FnctData(x,y)->m_sTopLen = 0;
	FnctData(x,y)->m_sBotLen = 0;
	FnctData(x,y)->m_sRightLen = 0;
	FnctData(x,y)->m_sLeftLen = 0;
	return (FnctData(x,y)->m_dFnVal = (*m_pFieldFcn)(x1, y1));
}

void CContour::SetPlanes(const std::vector<double>& vPlanes)
{	
	// cleaning memory
	CleanMemory();

	m_vPlanes = vPlanes;
};

void CContour::SetFieldFcn(double (*_pFieldFcn)(double, double)) 
{	
	m_pFieldFcn=_pFieldFcn;
};

void CContour::SetFirstGrid(int iCol, int iRow)
{
	m_iColFir=max(iCol,2);
	m_iRowFir=max(iRow,2);
}

void CContour::SetSecondaryGrid(int iCol, int iRow)
{
	// cleaning work matrices if allocated
	CleanMemory();

	m_iColSec=max(iCol,2);
	m_iRowSec=max(iRow,2);
}

void CContour::SetLimits(double pLimits[])
{
	ASSERT(pLimits[0]<pLimits[1]);
	ASSERT(pLimits[2]<pLimits[3]);
	for (int i=0;i<4;i++)
	{
		m_pLimits[i]=pLimits[i];
	}	
}

void CContour::GetLimits(double pLimits[])
{
	for (int i=0;i<4;i++)
	{
		pLimits[i]=m_pLimits[i];
	}
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品在线观看| 美女任你摸久久 | 婷婷成人激情在线网| 亚洲欧美日韩中文字幕一区二区三区| 久久精品在这里| 欧美激情综合网| 国产人久久人人人人爽| 久久精品亚洲国产奇米99| 亚洲精品一区二区精华| 欧美va亚洲va国产综合| 亚洲精品一区二区三区精华液| 日韩欧美成人一区| 日韩视频国产视频| 精品成人在线观看| 欧美精品一区二区三| 久久久久国色av免费看影院| 久久久综合九色合综国产精品| 久久久久国产精品麻豆| 国产欧美日韩综合| 国产精品久久久一区麻豆最新章节| 中文字幕制服丝袜成人av| 亚洲人xxxx| 亚洲一级在线观看| 蜜臀精品久久久久久蜜臀 | 91九色02白丝porn| 欧美系列日韩一区| 91精品国产综合久久久久久| 欧美一级黄色录像| 久久精品人人做人人爽人人| 国产精品三级电影| 亚洲一区视频在线| 免费高清视频精品| 国产大陆亚洲精品国产| 99久久婷婷国产综合精品| 欧美最猛黑人xxxxx猛交| 欧美夫妻性生活| 精品1区2区在线观看| 一色屋精品亚洲香蕉网站| 一区二区三区四区不卡在线 | 久久99精品国产.久久久久| 国产精品一区二区三区四区| 成人一级视频在线观看| 精品视频色一区| 精品久久久久久久人人人人传媒 | 制服.丝袜.亚洲.另类.中文| 欧美大肚乱孕交hd孕妇| 国产欧美一区二区精品久导航 | 2024国产精品| 国产精品家庭影院| 日韩国产欧美在线观看| 国产精品91一区二区| 色域天天综合网| 日韩精品一区二区三区在线播放 | 亚洲国产成人av| 激情综合网天天干| 91久久免费观看| 久久久久久9999| 婷婷夜色潮精品综合在线| 国产盗摄一区二区| 91 com成人网| 综合亚洲深深色噜噜狠狠网站| 五月天激情综合网| fc2成人免费人成在线观看播放| 欧美精品aⅴ在线视频| 中文字幕第一区第二区| 丝袜美腿亚洲一区二区图片| 成人小视频在线观看| 欧美一二三四区在线| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲一区中文日韩| 国产不卡视频在线播放| 91麻豆精品国产无毒不卡在线观看| 国产精品私房写真福利视频| 免费高清不卡av| 欧美色综合网站| 18成人在线观看| 国产资源精品在线观看| 欧美一区二区视频网站| 亚洲欧美日韩精品久久久久| 国产精品一区二区91| 91精品福利在线一区二区三区 | 国产精品传媒在线| 国产精品一二二区| 日韩欧美一级特黄在线播放| 亚洲一区二区三区在线看| 成人av资源站| 国产日韩v精品一区二区| 久久99精品一区二区三区| 欧美日韩亚洲综合在线 | 亚洲成在人线免费| 色综合天天综合色综合av| 国产欧美日韩在线看| 精品一区二区三区免费播放| 欧美丰满美乳xxx高潮www| 一区二区三区在线观看视频| av资源网一区| 国产精品传媒在线| av电影天堂一区二区在线观看| 久久婷婷久久一区二区三区| 免费成人在线影院| 日韩欧美国产午夜精品| 青娱乐精品在线视频| 3atv在线一区二区三区| 天天操天天色综合| 欧美日本高清视频在线观看| 亚洲成av人影院| 欧美日韩国产高清一区二区三区 | 亚洲人被黑人高潮完整版| 亚洲欧美日韩成人高清在线一区| 成人午夜在线免费| 中文字幕av不卡| 成人禁用看黄a在线| 国产精品视频第一区| 不卡一区二区三区四区| 国产精品电影院| 91麻豆视频网站| 亚洲一区二区三区在线看| 7777精品伊人久久久大香线蕉完整版 | 一区二区三区国产精华| 日本精品视频一区二区| 亚洲综合色成人| 欧美视频一区二区三区四区| 婷婷国产在线综合| 欧美电影免费观看高清完整版在线 | 国产精品1区2区3区| 国产精品视频线看| 色综合久久综合网| 五月婷婷激情综合网| 日韩免费一区二区三区在线播放| 国产精品正在播放| 中文字幕欧美一| 欧美猛男gaygay网站| 日韩福利电影在线| 国产亚洲一区二区三区| 99精品欧美一区| 午夜视频在线观看一区二区| 日韩一区二区三区免费观看| 国产精品一区二区免费不卡| 亚洲免费在线视频| 日韩午夜激情视频| 国产不卡在线播放| 亚洲大片精品永久免费| 欧美大片国产精品| 色综合久久六月婷婷中文字幕| 亚洲国产精品久久艾草纯爱| 日韩欧美的一区| 不卡的av在线| 香蕉av福利精品导航| 精品国产乱码久久| 91猫先生在线| 韩国欧美一区二区| 亚洲色图一区二区三区| 日韩午夜小视频| 91美女精品福利| 国内久久婷婷综合| 一区二区三区在线免费视频| 精品免费视频.| 色视频成人在线观看免| 精品一区二区三区免费视频| 亚洲欧美色图小说| 久久婷婷国产综合国色天香| 色婷婷综合激情| 国产毛片一区二区| 亚洲成a人片在线观看中文| 久久久久一区二区三区四区| 欧美在线综合视频| 国产精品538一区二区在线| 三级欧美在线一区| 综合电影一区二区三区| 久久综合五月天婷婷伊人| 欧美主播一区二区三区| 成人app网站| 国产一区二区在线影院| 午夜电影一区二区| 亚洲乱码国产乱码精品精的特点| 久久综合九色综合欧美98| 欧美日韩一区在线观看| 波多野结衣中文字幕一区| 久久99国产精品免费网站| 亚洲香肠在线观看| 国产精品久久久久久久蜜臀| 久久久精品日韩欧美| 日韩一区二区三区四区五区六区| 在线观看日韩国产| 成人黄色软件下载| 国产精品一区二区不卡| 久88久久88久久久| 日日夜夜精品免费视频| 亚洲曰韩产成在线| 亚洲精品va在线观看| 亚洲同性同志一二三专区| 国产欧美一区二区在线| 欧美成人精品3d动漫h| 7777精品伊人久久久大香线蕉经典版下载| av爱爱亚洲一区| 国产99久久久久| 国产精品自拍三区| 国产久卡久卡久卡久卡视频精品| 日本成人在线电影网| 日韩vs国产vs欧美|