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

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

?? chtriangle.cpp

?? Windows上的MUD客戶端程序
?? CPP
字號:
/*----------------------------------------------------------------------------
                        _                              _ _       
        /\             | |                            | (_)      
       /  \   _ __   __| |_ __ ___  _ __ ___   ___  __| |_  __ _ 
      / /\ \ | '_ \ / _` | '__/ _ \| '_ ` _ \ / _ \/ _` | |/ _` |
     / ____ \| | | | (_| | | | (_) | | | | | |  __/ (_| | | (_| |
    /_/    \_\_| |_|\__,_|_|  \___/|_| |_| |_|\___|\__,_|_|\__,_|

    The contents of this file are subject to the Andromedia Public
	License Version 1.0 (the "License"); you may not use this file
	except in compliance with the License. You may obtain a copy of
	the License at http://www.andromedia.com/APL/

    Software distributed under the License is distributed on an
	"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
	implied. See the License for the specific language governing
	rights and limitations under the License.

    The Original Code is Pueblo client code, released November 4, 1998.

    The Initial Developer of the Original Code is Andromedia Incorporated.
	Portions created by Andromedia are Copyright (C) 1998 Andromedia
	Incorporated.  All Rights Reserved.

	Andromedia Incorporated                         415.365.6700
	818 Mission Street - 2nd Floor                  415.365.6701 fax
	San Francisco, CA 94103

    Contributor(s):
	--------------------------------------------------------------------------
	   Chaco team:  Dan Greening, Glenn Crocker, Jim Doubek,
	                Coyote Lussier, Pritham Shetty.

					Wrote and designed original codebase.

------------------------------------------------------------------------------

	Triangulator for Chaco VRML - based on Graphics Gems V.

----------------------------------------------------------------------------*/

#include <ChTriangle.h>
// #include "ChTriangle.h"

ChExTriangulation CH_EX_TRIANGULATION = { 666 };

ChTriangulator::ChTriangulator() : 
	m_count(0),
	qs(0),
	tr(0),
	seg(0),
	mchain(0),
	vert(0),
	mon(0),
	visited(0),
	permute(0),
	m_triangles(0)
{
};

ChTriangulator::~ChTriangulator()
{
	kill();
};

bool ChTriangulator::Attach(long *coordIndex, GxVec3f *points, int count)
{
#define TRI_EXCEPTIONS 1
#define TRI_EXCEPTIONS_ALL 1
	#if defined(TRI_EXCEPTIONS)
	try
	#endif
	{
		kill();
		init(count);
		project(coordIndex, points, m_count);
		ZapCollinears();
		if(IsSelfIntersecting())
		{
			return false;
		}
		triangulate();
	}
	#if defined(TRI_EXCEPTIONS)
	catch(ChExTriangulation)
	{
		#if 1
		TRACE("Bad polygon for triangulation:\n");
		for(int i = 0; i< count; i++)
		{
			char buf[200];
			int j = coordIndex[i];
			sprintf(buf, "points[%d] = (%.3g, %.3g, %.3g )\n", j, double(points[j].x()), double(points[j].y()), double(points[j].z()));
			TRACE(buf);
		}
		#endif
		return false;
	}
	#if defined(TRI_EXCEPTIONS_ALL)
	catch(...)
	{
		#if 1
		TRACE("Bad polygon for triangulation:\n");
		for(int i = 0; i< count; i++)
		{
			char buf[200];
			int j = coordIndex[i];
			sprintf(buf, "points[%d] = (%.3g, %.3g, %.3g )\n", j, double(points[j].x()), double(points[j].y()), double(points[j].z()));
			TRACE(buf);
		}
		#endif
		return false;
	}
	#endif
	#endif

	return true;
};

int ChTriangulator::init(int count)
{
	m_count = count;
	// Dynamically allocate

	m_segSize = count + 2;	  // ????
	m_qSize = 8 * m_segSize;
	m_trSize = 4 * m_segSize;

	m_trSize *= 5;	// ff  TODO - figure out better number
	m_qSize *= 5;	// ff

	qs = new node_t[m_qSize];				//[QSIZE];		/* Query structure */
	tr = new trap_t[m_trSize];				//[TRSIZE];		/* Trapezoid structure */
	seg = new segment_t[m_segSize];			//[SEGSIZE];		/* Segment table */
	mchain = new monchain_t[m_trSize];		//[TRSIZE]; 
	vert = new vertexchain_t[m_segSize];	//[SEGSIZE]; /* chain init. information.   */
	mon = new int[m_segSize];				//[SEGSIZE];	/* contains position of any vertex in */
	visited = new int[m_trSize];			//[TRSIZE];
	permute = new int[m_segSize];			//[SEGSIZE];
	m_triangles = new triangle_it[m_segSize];	//[200][3];	  

	// Zap what needs zapping
	memset((void *)seg, 0, (m_segSize) * sizeof(*seg));

	return 0;
};

int ChTriangulator::triangulate()
{
	int nmonopoly;

	global.nseg = m_count;
	generate_random_ordering(m_count);
	construct_trapezoids(m_count, seg);
	nmonopoly = monotonate_trapezoids(m_count);
	triangulate_monotone_polygons(nmonopoly, m_triangles);

	return 0;
};

void ChTriangulator::kill()
{
	//  delete what we dynamically allocated
	delete [] qs;
	delete [] tr;
	delete [] seg;
	delete [] mchain;
	delete [] vert;
	delete [] mon;
	delete [] visited;
	delete [] permute;
	delete [] m_triangles;

};

int ChTriangulator::project(long *coordIndex, GxVec3f *points, int count)
{
	int i;			// TODO handle duplicate points

	// Compute the face normal
	GxVec3f	normal(0,0,0);
	for ( i = 0; i < count; i++ )
	{
		normal += points[coordIndex[i]].cross( points[coordIndex[(i+1) % count]] ) ;
	}

	normal.normalize() ;


	// Find maximal projection of normal on basis vector
	// and use other two dimensions
	int 	ix, iy;

	GxVec3f	normalSave(normal);
	m_boolReflected = false;

	normal.set(fabs(normal.x()), fabs(normal.y()), fabs(normal.z()));
	float mx = max(max(normal.x(), normal.y()), normal.z());
	if(normal.x() >= mx)
	{
		ix = 1;
		iy = 2;
		if(normalSave.x() < 0.) m_boolReflected = true;
	}
	else if(normal.y() >= mx)
	{
		ix = 0;
		iy = 2;
		if(normalSave.y() < 0.) m_boolReflected = true;
	}
	else
	{
		ix = 0;
		iy = 1;
		if(normalSave.z() < 0.) m_boolReflected = true;
	}

	#if 1
	GxVec3f *p = new GxVec3f[count];

	for ( i = 0; i < count; i++ )
	{
		p[i].x() = points[coordIndex[i]][ix];
		p[i].y() = points[coordIndex[i]][iy];
		p[i].z() = 0;
	}

	normal.set(0,0,0);
	for ( i = 0; i < count; i++ )
	{
		normal += p[i].cross( p[(i+1) % count] ) ;
	}

	delete [] p;

	m_boolReflected = normal.z() < 0.0;
	#endif

	const float eps = 1.e-4;

	// Project away
	// Note that seg and the returned triangle indices are one-based.
	//
	// If this is CW, we reflect to force CCW; this is cheaper/easier
	// than reversing order
	//
	// We also bump any values which are dupes, to prevent errors
	// in the convexifier.
	for (i = 1; i <= count; i++) {
		seg[i].is_inserted = FALSE;
	
		seg[i].v0.x = points[coordIndex[i-1]][ix];
		seg[i].v0.y = points[coordIndex[i-1]][iy];
		if(m_boolReflected) seg[i].v0.x = -seg[i].v0.x;	// negate to reflect

		if (i == 1) {
			// fill in v1
			seg[count].v1.x = seg[i].v0.x;
			seg[count].v1.y = seg[i].v0.y;
		} else {
			// perturb dupes 
			if(seg[i].v0.x == seg[i-1].v0.x &&	seg[i].v0.y == seg[i-1].v0.y)
			{
				seg[i].v0.x *= (1+eps);	 
			}

			// fill in v1
			seg[i - 1].v1.x = seg[i].v0.x;
			seg[i - 1].v1.y = seg[i].v0.y;
		}
	}
	// perturb final dupes 
	if(seg[1].v0.x == seg[count].v0.x &&	seg[1].v0.y == seg[count].v0.y)
	{
		seg[1].v0.x *= (1+eps);	 
		seg[count].v1.x = seg[1].v0.x;
	}

	return 0;
}

bool ChTriangulator::IsSelfIntersecting()
{
	int i, j;
	float x, y;
	bool	boolHit = false;
	for (i = 1; i < m_count - 1; i++)
	{
		for (j = i+2; j <= m_count; j++)
		{
			if(j != m_count || i != 1)
			{
				boolHit = lines_intersect( seg[i].v0.x,  seg[i].v0.y,   /* First line segment */
			     				 seg[i].v1.x,  seg[i].v1.y,
								 seg[j].v0.x,  seg[j].v0.y,	  /* Second line segment */
								 seg[j].v1.x,  seg[j].v1.y, 
			    			     x,
						         y );
				if(boolHit)
				{
					return true;
				}
			}
		}
	}
	return false;
}

#define COLLINEAR_EPS (1.e-3)

bool ChTriangulator::ZapCollinears()
{
	#if 0
	int i, j;
	bool	boolHit = false;
	for (i = 1; i <= m_count; i++)
	{
		j = i + 1;
		if(j > m_count) j = 1;

		
		float delta = (seg[j].v1.x - seg[j].v0.x) * (seg[i].v1.y - seg[i].v0.y);
		delta -= (seg[i].v1.x - seg[i].v0.x) * (seg[j].v1.y - seg[j].v0.y);
		if(fabs(delta) < COLLINEAR_EPS)
		{
			seg[i].v1.x += COLLINEAR_EPS * (seg[i].v1.y - seg[i].v0.y);
			seg[j].v0.x = seg[i].v1.x;
			seg[i].v1.y += COLLINEAR_EPS * (seg[i].v1.x - seg[i].v0.x);
			seg[j].v0.y = seg[i].v1.y;
		}
	}
	#endif
	return true;
}


int ChTriangulator::GetCount()
{
	return m_count ? m_count - 2 : 0;
};

bool ChTriangulator::GetTriangle(int triIndex, int *vertIndex)
{
	ASSERT(triIndex < GetCount() && triIndex >= 0);
	if(0 && m_boolReflected)			   // ???? why did i do this??
	{
		vertIndex[0] = m_triangles[triIndex][0] - 1;
		vertIndex[1] = m_triangles[triIndex][2] - 1;
		vertIndex[2] = m_triangles[triIndex][1] - 1;
	}
	else
	{
		vertIndex[0] = m_triangles[triIndex][0] - 1;
		vertIndex[1] = m_triangles[triIndex][1] - 1;
		vertIndex[2] = m_triangles[triIndex][2] - 1;
	}
	return true;
};

bool ChTriangulator::Iterate()
{
	int iv[3];
	for(int j=0; j<m_count-2; j++)
	{
		GetTriangle(j, iv); 		   // not optimal, but I need to handle 
										// order flipping for reflected
		if(!DoTriangle(j, iv)) return false;
	}
	return true;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲视频在线一区| 欧美精品亚洲一区二区在线播放| 欧美日韩国产一区| 亚洲444eee在线观看| 日本高清不卡在线观看| 国产精品乱人伦一区二区| 91网上在线视频| 亚洲免费看黄网站| 欧美日韩小视频| 久草这里只有精品视频| 久久一夜天堂av一区二区三区 | 五月天亚洲婷婷| 91精品国产91久久久久久一区二区| 石原莉奈一区二区三区在线观看 | 欧美三片在线视频观看| 91农村精品一区二区在线| 国产成人免费xxxxxxxx| 亚洲小说欧美激情另类| 久久综合久久综合久久| 国产校园另类小说区| 欧美日韩免费观看一区三区| 欧美午夜精品电影| 波多野结衣中文字幕一区二区三区| 亚洲男人天堂av| 亚洲综合视频在线观看| 精品成人免费观看| 日本高清视频一区二区| 97se亚洲国产综合自在线不卡 | 视频精品一区二区| 夜夜精品浪潮av一区二区三区| 91麻豆精品视频| 国产精一区二区三区| 日韩欧美二区三区| 91精品一区二区三区久久久久久 | 国产午夜一区二区三区| 精品福利一区二区三区| 日韩无一区二区| 日本亚洲最大的色成网站www| 欧美日韩国产影片| 91精品国产综合久久久久久| 日韩亚洲欧美在线| 久久蜜桃av一区二区天堂| 国产精品12区| 国产99久久久国产精品潘金 | 日韩亚洲欧美在线| 国产日韩亚洲欧美综合| 成人黄色一级视频| 在线观看一区日韩| 欧美精品丝袜久久久中文字幕| 91精品一区二区三区在线观看| 久久久久久久久久久99999| 国产精品美女一区二区三区| 一级做a爱片久久| 免费一级片91| 99久久婷婷国产综合精品电影 | 中文字幕日本不卡| 欧美亚洲一区二区在线观看| 欧美色老头old∨ideo| 欧美成人午夜电影| 在线亚洲高清视频| 精品福利一区二区三区| 亚洲视频一区在线| 久久99久久精品| 色成年激情久久综合| 精品欧美一区二区久久| 亚洲蜜桃精久久久久久久| 亚洲成人高清在线| 99这里只有精品| 欧美日韩国产电影| 国产精品美女www爽爽爽| 日韩国产精品91| 99久久久无码国产精品| 欧美一区二区三区人| 亚洲黄一区二区三区| 伦理电影国产精品| 欧美日本乱大交xxxxx| 国产精品嫩草99a| 免费视频最近日韩| 色狠狠综合天天综合综合| 亚洲精品一区二区三区香蕉| 午夜久久久影院| 成人h动漫精品一区二区| 精品国精品自拍自在线| 亚洲一区二区三区中文字幕| 成人手机在线视频| 欧美r级电影在线观看| 一区二区三区高清不卡| 国产一区二区三区日韩| 韩国成人福利片在线播放| www.激情成人| 久久久.com| 老司机午夜精品99久久| 日韩女优视频免费观看| 亚洲男人的天堂网| 粉嫩绯色av一区二区在线观看| 日韩一区二区电影网| 午夜私人影院久久久久| eeuss鲁片一区二区三区在线观看| www国产亚洲精品久久麻豆| 日本欧美加勒比视频| 日本高清成人免费播放| 亚洲精品国产无套在线观| 91蜜桃婷婷狠狠久久综合9色| 中文字幕欧美激情一区| 成人av网站大全| 综合分类小说区另类春色亚洲小说欧美| 国产成人自拍高清视频在线免费播放| www国产成人免费观看视频 深夜成人网| 日本视频一区二区| 日韩女优电影在线观看| 国产精品一级片| 中文字幕欧美区| 色婷婷综合久久久久中文一区二区 | 国产精品久久久久久久浪潮网站| 国产精品一区免费在线观看| 久久在线观看免费| 丁香六月综合激情| 自拍偷拍亚洲激情| 欧美在线观看视频在线| 日本成人在线电影网| 欧美一区日韩一区| 国产成人精品aa毛片| 亚洲欧洲精品成人久久奇米网| 91麻豆产精品久久久久久| 亚洲第一主播视频| 久久亚洲欧美国产精品乐播| bt欧美亚洲午夜电影天堂| 亚洲国产精品欧美一二99 | 香蕉成人伊视频在线观看| 欧美一区欧美二区| 成人a免费在线看| 亚洲国产乱码最新视频| 久久久99久久| 成人精品电影在线观看| 亚洲视频 欧洲视频| 欧美日韩成人在线一区| 久久99精品一区二区三区三区| 欧美视频在线观看一区二区| 韩国一区二区视频| 玉足女爽爽91| 亚洲精品在线免费观看视频| 粉嫩av一区二区三区粉嫩| 亚洲一区二区精品视频| 久久久久久久久岛国免费| 91麻豆福利精品推荐| 美腿丝袜亚洲三区| 亚洲午夜av在线| 久久综合色之久久综合| 欧美日韩亚洲综合在线| 丰满少妇在线播放bd日韩电影| 亚洲在线一区二区三区| 亚洲国产精品99久久久久久久久| 欧美三级在线视频| av不卡在线播放| 精品一区二区三区久久久| 亚洲观看高清完整版在线观看| 欧美激情综合五月色丁香小说| 欧美一级理论片| 欧美性感一类影片在线播放| 福利视频网站一区二区三区| 麻豆91免费观看| 午夜不卡av免费| 亚洲欧美日韩国产综合| 久久精品免视看| 欧美精品一区二区在线播放| 日韩欧美在线1卡| 欧美色爱综合网| 在线免费观看日韩欧美| 成人网在线免费视频| 午夜私人影院久久久久| 亚洲卡通欧美制服中文| 欧美三级乱人伦电影| 91啪在线观看| eeuss影院一区二区三区| 国产精品123区| voyeur盗摄精品| 99re热这里只有精品视频| 不卡免费追剧大全电视剧网站| 高清国产午夜精品久久久久久| 久久99久久久欧美国产| 久久精品国产精品亚洲综合| 精品一区二区三区免费视频| 精品一区二区三区免费毛片爱 | 夜夜嗨av一区二区三区中文字幕| 专区另类欧美日韩| 中文字幕日韩精品一区 | 亚洲精品在线观| 国产精品毛片大码女人| 欧美精品一区二区在线播放| 日本一区二区三区在线不卡 | 中文字幕国产一区二区| 国产精品传媒视频| 亚洲女同一区二区| 亚洲成人三级小说| 麻豆91精品91久久久的内涵| 国产精品影音先锋| 99视频一区二区三区| 在线视频国内自拍亚洲视频| 欧美色男人天堂| 日韩精品自拍偷拍|