www.pudn.com > Delaunay2.rar > DelaunayView.cpp


// DelaunayView.cpp : implementation of the CDelaunayView class 
// 
 
#include "stdafx.h" 
#include "Delaunay.h" 
 
#include "DelaunayDoc.h" 
#include "DelaunayView.h" 
 
#include  
#include "dataStruct.h" 
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CDelaunayView 
 
IMPLEMENT_DYNCREATE(CDelaunayView, CView) 
 
BEGIN_MESSAGE_MAP(CDelaunayView, CView) 
	//{{AFX_MSG_MAP(CDelaunayView) 
	ON_WM_LBUTTONDOWN() 
	ON_COMMAND(ID_DELAUNAY, OnDelaunay) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDelaunayView construction/destruction 
 
CDelaunayView::CDelaunayView() 
{ 
	// TODO: add construction code here 
    startPoint.x = 0; 
	startPoint.y = 0; 
	pointNumber = 0; 
	Tricount = nCurTri = 0; 
} 
 
CDelaunayView::~CDelaunayView() 
{ 
} 
 
BOOL CDelaunayView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDelaunayView drawing 
 
void CDelaunayView::OnDraw(CDC* pDC) 
{ 
	CDelaunayDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
 
	POSITION pos1; 
	TriAngle* pTri; 
	PointCls *p4, *p5, *p6;	 
 
	if(pDoc->PointList->GetCount()) 
	{ 
		pos1 = pDoc->PointList->GetHeadPosition(); 
		while(pos1 != NULL) 
		{ 
			PointCls* pa = (PointCls*)pDoc->PointList->GetNext(pos1); 
 
			pDC->SetPixel(pa->x, pa->y, RGB(255, 0, 0)); 
		} 
 
//		createFirstTri(pDoc->PointList, 
//			           pDoc->TriList); 
// 
//		POSITION pos4, pos5; 
//		pos4 = pDoc->TriList->GetHeadPosition(); 
//		TriAngle* pTriSeed = (TriAngle*)pDoc->TriList->GetAt(pos4); 
// 
//		pos5 = pDoc->PointList->GetHeadPosition(); 
//		while(pos5 != NULL) 
//		{ 
//			PointCls* pa = (PointCls*)pDoc->PointList->GetNext(pos5); 
// 
//			if(pa->index == pTriSeed->index[0]) 
//			{ 
//				p1 = pa; 
//			} 
//			if(pa->index == pTriSeed->index[1]) 
//			{ 
//				p2 = pa; 
//			} 
//			if(pa->index == pTriSeed->index[2]) 
//			{ 
//				p3 = pa; 
//			} 
//		} 
//		enlargeEdge(p1, p2, p3, pDoc->PointList, pDoc->TriList); 
// 
//		enlargeTri(pDoc->PointList, pDoc->TriList); 
// 
//		continueEnlarge(pDoc->PointList, pDoc->TriList); 
	} 
	if(pDoc->TriList->GetCount()) 
	{ 
		POSITION pos8 = pDoc->TriList->GetHeadPosition(); 
		while(pos8 != NULL) 
		{ 
			pTri = (TriAngle*)pDoc->TriList->GetNext(pos8);			 
 
			POSITION pos9 = pDoc->PointList->GetHeadPosition(); 
			while(pos9 != NULL) 
			{ 
				PointCls* pa = (PointCls*)pDoc->PointList->GetNext(pos9); 
 
				if(pa->index == pTri->index[0]) 
				{ 
					p4 = pa; 
				} 
				if(pa->index == pTri->index[1]) 
				{ 
					p5 = pa; 
				} 
				if(pa->index == pTri->index[2]) 
				{ 
					p6 = pa; 
				} 
			}			 
			pDC->MoveTo(p4->x, p4->y); 
			pDC->LineTo(p5->x, p5->y); 
			pDC->MoveTo(p5->x, p5->y); 
			pDC->LineTo(p6->x, p6->y); 
			pDC->MoveTo(p6->x, p6->y); 
			pDC->LineTo(p4->x, p4->y); 
		} 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDelaunayView printing 
 
BOOL CDelaunayView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CDelaunayView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CDelaunayView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDelaunayView diagnostics 
 
#ifdef _DEBUG 
void CDelaunayView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CDelaunayView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CDelaunayDoc* CDelaunayView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDelaunayDoc))); 
	return (CDelaunayDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CDelaunayView message handlers 
 
void CDelaunayView::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CDelaunayDoc* pDoc = GetDocument(); 
	 
	startPoint = point; 
	PointCls* p = new PointCls(point.x, point.y, pointNumber); 
	pDoc->PointList->AddTail(p); 
	pointNumber++; 
 
	CClientDC dc(this); 
	dc.SetPixel(point, RGB(255, 0, 0)); 
 
	CView::OnLButtonDown(nFlags, point); 
} 
 
//计算两个向量之间的夹角 
//两个向量分别为(x1[0], x1[1]),(x2[0], x2[1]) 
double  GetAngle(double x1[2], 
			     double x2[2]) 
{ 
	double temp; 
	double norm1,norm2; 
	norm1 = sqrt(x1[ 0 ] * x1[ 0 ] + x1[ 1 ] * x1[ 1 ]); 
	norm2 = sqrt(x2[ 0 ] * x2[ 0 ] + x2[ 1 ] * x2[ 1 ]); 
	temp = x1[ 0 ] * x2[ 0 ] + x1[ 1 ] * x2[ 1 ]; 
	if(norm1 == 0 || norm2 == 0) 
	{ 
		return 0; 
	} 
	else 
	{ 
		temp = temp / (norm1 * norm2); 
		if(temp > 1.0) 
		{ 
			temp = 1.0; 
		} 
		else if(temp < -1.0) 
		{ 
			temp = -1.0; 
		} 
		return acos(temp); 
	}	 
} 
 
void CDelaunayView::createFirstTri(CObList* pointList,  
								   CObList* triList, 
								   PointCls* p1) 
{ 
	POSITION pos1, pos4, pos5, pos6, pos7, pos8; 
	PointCls *p2, *p3; 
	double distance = 1e20; 
	double maxAngle = 0.0; 
	bool inside1 = false; 
	bool inside2 = false; 
 
	bool again = false; 
	 
	pos1 = pointList->GetHeadPosition();  
	if(p1 == NULL) 
	{ 
		p1 = (PointCls*)pointList->GetNext(pos1); 
	} 
	else 
	{ 
		again = true; 
	} 
 
	if(p1->vertex)//p1的所有边的使用次数均为2 
		return; 
////////////////////////////////////////////////////////////////////// 
	//在点表中寻找距离p1最近的点p2 
	while(pos1 != NULL) 
	{ 
		pos4 = pos1; 
		PointCls* pa = (PointCls*)pointList->GetNext(pos1); 
		if(pa->vertex) 
			continue; 
//		if(again) 
//		{ 
//			if(!pa->intri) 
//				continue; 
//		} 
		double tempDis = sqrt((pa->x - p1->x) * (pa->x - p1->x) + 
			(pa->y - p1->y) * (pa->y - p1->y)); 
		if(tempDis < distance 
			&& tempDis > 0) 
		{ 
			inside1 = true; 
			distance = tempDis; 
			pos5 = pos4; 
		} 
	} 
	if(inside1) 
	{ 
		p2 = (PointCls*)pointList->GetAt(pos5); 
	} 
	else 
		return; 
////////////////////////////////////////////////////////////////////// 
 
////////////////////////////////////////////////////////////////////// 
	//在点表中寻找与p1,p2所成夹角最大的点 
	if(p2->intri) 
	{ 
		pos6 = pointList->GetHeadPosition(); 
		while(pos6 != NULL) 
		{ 
			pos7 = pos6; 
			PointCls* p = (PointCls*)pointList->GetNext(pos6); 
 
			POSITION position1, position2, position3; 
			bool inEdgeList = false; 
			position1 = p2->edgeList->GetHeadPosition(); 
			while(position1 != NULL) 
			{ 
				position2 = position1; 
				EdgeNode* pTemp = (EdgeNode*)p2->edgeList->GetNext(position1); 
				if(pTemp->index == p->index) 
				{ 
					inEdgeList = true; 
					position3 = position2; 
					break; 
				} 
			} 
			if(!inEdgeList) 
				continue; 
			else 
			{ 
				if(p->vertex) 
					continue; 
				 
				double x1[2], x2[2]; 
				x1[0] = p1->x - p->x; 
				x1[1] = p1->y - p->y; 
				x2[0] = p2->x - p->x; 
				x2[1] = p2->y - p->y; 
				double angle = GetAngle(x1, x2); 
				if(angle > maxAngle) 
				{ 
					inside2 = true; 
					maxAngle = angle; 
					pos8 = pos7; 
				} 
			} 
		} 
		if(inside2) 
		{ 
			p3 = (PointCls*)pointList->GetAt(pos8); 
		} 
		else 
			return; 
	} 
	else 
	{ 
		pos6 = pointList->GetHeadPosition();  
		while(pos6 != NULL) 
		{ 
			pos7 = pos6; 
			PointCls* p = (PointCls*)pointList->GetNext(pos6); 
			if(p->vertex) 
				continue; 
			double x1[2], x2[2]; 
			x1[0] = p1->x - p->x; 
			x1[1] = p1->y - p->y; 
			x2[0] = p2->x - p->x; 
			x2[1] = p2->y - p->y; 
			double angle = GetAngle(x1, x2); 
			if(angle > maxAngle) 
			{ 
				inside2 = true; 
				maxAngle = angle; 
				pos8 = pos7; 
			} 
		} 
		if(inside2) 
		{ 
			p3 = (PointCls*)pointList->GetAt(pos8); 
		} 
		else 
			return; 
	} 
////////////////////////////////////////////////////////////////////// 
 
////////////////////////////////////////////////////////////////////// 
	//处理p1, p2, p3是当前三角剖分中的点的情形 
	if(p1->intri && p2->intri && p3->intri)//p1, p2, p3都在当前剖分中 
		return; 
	else if(!p1->intri && p2->intri && p3->intri) 
	{ 
		POSITION pos41, pos42, pos43; 
		EdgeNode* pEdge10; 
		bool inside6 = false; 
		pos41 = p2->edgeList->GetHeadPosition(); 
		while(pos41 != NULL) 
		{ 
			pos42 = pos41; 
			EdgeNode* pEdge = (EdgeNode*)p2->edgeList->GetNext(pos41); 
			if(pEdge->index == p3->index) 
			{ 
				inside6 = true; 
				pos43 = pos42; 
				break; 
			} 
		}		 
		 
		if(inside6) 
		{ 
			pEdge10 = (EdgeNode*)p2->edgeList->GetAt(pos43); 
			pEdge10->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge11 = new EdgeNode(p3->index, 1); 
			p2->edgeList->AddTail(pEdge11); 
		} 
 
		POSITION pos51, pos52, pos53; 
		EdgeNode* pEdge12; 
		bool inside7 = false; 
		pos51 = p3->edgeList->GetHeadPosition(); 
		while(pos51 != NULL) 
		{ 
			pos52 = pos51; 
			EdgeNode* pEdge = (EdgeNode*)p3->edgeList->GetNext(pos51); 
			if(pEdge->index == p2->index) 
			{ 
				inside7 = true; 
				pos53 = pos52; 
				break; 
			} 
		}		 
		 
		if(inside7) 
		{ 
			pEdge12 = (EdgeNode*)p3->edgeList->GetAt(pos53); 
			pEdge12->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge13 = new EdgeNode(p2->index, 1); 
			p3->edgeList->AddTail(pEdge13); 
		} 
 
		EdgeNode* pEdge1 = new EdgeNode(p2->index, 1); 
	    EdgeNode* pEdge2 = new EdgeNode(p3->index, 1); 
		EdgeNode* pEdge3 = new EdgeNode(p1->index, 1); 
		EdgeNode* pEdge4 = new EdgeNode(p1->index, 1); 
 
		p1->edgeList->AddTail(pEdge1); 
	    p1->edgeList->AddTail(pEdge2); 
 
		p2->edgeList->AddTail(pEdge3); 
		p3->edgeList->AddTail(pEdge4); 
	} 
	else if(p1->intri && !p2->intri && p3->intri) 
	{ 
		POSITION pos41, pos42, pos43; 
		EdgeNode* pEdge10; 
		bool inside6 = false; 
		pos41 = p1->edgeList->GetHeadPosition(); 
		while(pos41 != NULL) 
		{ 
			pos42 = pos41; 
			EdgeNode* pEdge = (EdgeNode*)p1->edgeList->GetNext(pos41); 
			if(pEdge->index == p3->index) 
			{ 
				inside6 = true; 
				pos43 = pos42; 
				break; 
			} 
		}		 
		 
		if(inside6) 
		{ 
			pEdge10 = (EdgeNode*)p1->edgeList->GetAt(pos43); 
			pEdge10->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge11 = new EdgeNode(p3->index, 1); 
			p1->edgeList->AddTail(pEdge11); 
		} 
 
		POSITION pos51, pos52, pos53; 
		EdgeNode* pEdge12; 
		bool inside7 = false; 
		pos51 = p3->edgeList->GetHeadPosition(); 
		while(pos51 != NULL) 
		{ 
			pos52 = pos51; 
			EdgeNode* pEdge = (EdgeNode*)p3->edgeList->GetNext(pos51); 
			if(pEdge->index == p1->index) 
			{ 
				inside7 = true; 
				pos53 = pos52; 
				break; 
			} 
		}		 
		 
		if(inside7) 
		{ 
			pEdge12 = (EdgeNode*)p3->edgeList->GetAt(pos53); 
			pEdge12->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge13 = new EdgeNode(p1->index, 1); 
			p3->edgeList->AddTail(pEdge13); 
		} 
 
		EdgeNode* pEdge1 = new EdgeNode(p1->index, 1); 
	    EdgeNode* pEdge2 = new EdgeNode(p3->index, 1); 
		EdgeNode* pEdge3 = new EdgeNode(p2->index, 1); 
		EdgeNode* pEdge4 = new EdgeNode(p2->index, 1); 
 
		p2->edgeList->AddTail(pEdge1); 
	    p2->edgeList->AddTail(pEdge2); 
 
		p1->edgeList->AddTail(pEdge3); 
		p3->edgeList->AddTail(pEdge4); 
	} 
	else if(p1->intri && p2->intri && !p3->intri) 
	{ 
		POSITION pos41, pos42, pos43; 
		EdgeNode* pEdge10; 
		bool inside6 = false; 
		pos41 = p1->edgeList->GetHeadPosition(); 
		while(pos41 != NULL) 
		{ 
			pos42 = pos41; 
			EdgeNode* pEdge = (EdgeNode*)p1->edgeList->GetNext(pos41); 
			if(pEdge->index == p2->index) 
			{ 
				inside6 = true; 
				pos43 = pos42; 
				break; 
			} 
		}		 
		 
		if(inside6) 
		{ 
			pEdge10 = (EdgeNode*)p1->edgeList->GetAt(pos43); 
			pEdge10->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge11 = new EdgeNode(p2->index, 1); 
			p1->edgeList->AddTail(pEdge11); 
		} 
 
		POSITION pos51, pos52, pos53; 
		EdgeNode* pEdge12; 
		bool inside7 = false; 
		pos51 = p2->edgeList->GetHeadPosition(); 
		while(pos51 != NULL) 
		{ 
			pos52 = pos51; 
			EdgeNode* pEdge = (EdgeNode*)p2->edgeList->GetNext(pos51); 
			if(pEdge->index == p1->index) 
			{ 
				inside7 = true; 
				pos53 = pos52; 
				break; 
			} 
		}		 
		 
		if(inside7) 
		{ 
			pEdge12 = (EdgeNode*)p2->edgeList->GetAt(pos53); 
			pEdge12->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge13 = new EdgeNode(p1->index, 1); 
			p2->edgeList->AddTail(pEdge13); 
		} 
 
		EdgeNode* pEdge1 = new EdgeNode(p1->index, 1); 
	    EdgeNode* pEdge2 = new EdgeNode(p2->index, 1); 
		EdgeNode* pEdge3 = new EdgeNode(p3->index, 1); 
		EdgeNode* pEdge4 = new EdgeNode(p3->index, 1); 
 
		p3->edgeList->AddTail(pEdge1); 
	    p3->edgeList->AddTail(pEdge2); 
 
		p1->edgeList->AddTail(pEdge3); 
		p2->edgeList->AddTail(pEdge4); 
	} 
	else 
	{ 
		EdgeNode* pEdge1 = new EdgeNode(p2->index, 1); 
		EdgeNode* pEdge2 = new EdgeNode(p3->index, 1); 
		EdgeNode* pEdge3 = new EdgeNode(p1->index, 1); 
		EdgeNode* pEdge4 = new EdgeNode(p2->index, 1); 
		EdgeNode* pEdge5 = new EdgeNode(p3->index, 1); 
		EdgeNode* pEdge6 = new EdgeNode(p1->index, 1); 
 
		p1->edgeList->AddTail(pEdge1); 
		p1->edgeList->AddTail(pEdge5); 
 
		p2->edgeList->AddTail(pEdge2); 
		p2->edgeList->AddTail(pEdge6); 
		 
		p3->edgeList->AddTail(pEdge3); 
		p3->edgeList->AddTail(pEdge4); 
	} 
////////////////////////////////////////////////////////////////////// 
	p1->intri = true; 
	p2->intri = true; 
	p3->intri = true;	 
 
	TriAngle* pTri = new TriAngle(p1->index,  
		                          p2->index,  
								  p3->index); 
	triList->AddTail(pTri); 
 
	Tricount++; 
} 
 
void CDelaunayView::enlargeEdge(PointCls *p1,  
								PointCls *p2, 
								PointCls *p3, 
								CObList* pointList, 
								CObList* triList) 
{ 
	POSITION pos1, pos2, pos3; 
	EdgeNode* pEdge1 = NULL; 
	bool inside = false; 
	pos1 = p1->edgeList->GetHeadPosition(); 
	while(pos1 != NULL) 
	{ 
		pos2 = pos1; 
		EdgeNode* pEdge = (EdgeNode*)p1->edgeList->GetNext(pos1); 
		if(pEdge->index == p2->index) 
		{ 
			inside = true; 
			pos3 = pos2; 
			break; 
		} 
	} 
	if(inside) 
	{ 
		pEdge1 = (EdgeNode*)p1->edgeList->GetAt(pos3); 
	} 
	else 
		return; 
 
	if(inside && (2 == pEdge1->nCount)) 
		return; 
 
	POSITION pos4, pos5, pos6; 
	double maxAngle = 0.0; 
	PointCls* p4 = NULL; 
	bool flag = false; 
	pos4 = pointList->GetHeadPosition(); 
	while(pos4 != NULL) 
	{ 
		pos5 = pos4; 
		 
		PointCls* pTemp = (PointCls*)pointList->GetNext(pos4); 
		if(pTemp->vertex) 
			continue; 
		 
		double y1, y2; 
		double ratio = (double)(p2->y - p1->y) / (p2->x - p1->x); 
		y1 = p1->y + ratio * (p3->x - p1->x); 
		y2 = p1->y + ratio * (pTemp->x - p1->x); 
		if(pTemp == p1 
		   || pTemp == p2) 
		   continue; 
		else if((p3->y >= y1 && pTemp->y >= y2)//判断pTemp是否与p3同侧 
			    || (y1 >= p3->y && y2 >= pTemp->y)) 
				continue; 
		else 
		{ 
			POSITION pos7, pos8, pos9, pos10; 
			bool inside1 = false; 
			bool inside2 = false; 
			EdgeNode* pEdge3 = NULL; 
			EdgeNode* pEdge4 = NULL; 
			pos7 = pTemp->edgeList->GetHeadPosition(); 
			while(pos7 != NULL) 
			{ 
				pos8 = pos7; 
				EdgeNode* pEdge = (EdgeNode*)pTemp->edgeList->GetNext(pos7); 
				if(pEdge->index == p1->index 
				   || pEdge->index == p2->index) 
				{ 
					if(pEdge->index == p1->index) 
					{ 
						inside1 = true; 
						pos9 = pos8; 
					} 
					else 
					{ 
						inside2 = true; 
						pos10 = pos8; 
					} 
				} 
			} 
			if(inside1) 
			{ 
				pEdge3 = (EdgeNode*)pTemp->edgeList->GetAt(pos9); 
				if(2 == pEdge3->nCount) 
					continue; 
			} 
			if(inside2) 
			{ 
				pEdge4 = (EdgeNode*)pTemp->edgeList->GetAt(pos10); 
				if(2 == pEdge4->nCount) 
					continue; 
			} 
		} 
 
		double x1[2], x2[2]; 
		x1[0] = p1->x - pTemp->x; 
		x1[1] = p1->y - pTemp->y; 
		x2[0] = p2->x - pTemp->x; 
		x2[1] = p2->y - pTemp->y; 
		double angle = GetAngle(x1, x2); 
		if(angle > maxAngle) 
		{ 
			maxAngle = angle; 
			pos6 = pos5; 
			flag = true; 
		} 
	} 
	if(flag) 
	{ 
		p4 = (PointCls*)pointList->GetAt(pos6); 
	} 
 
	if(p4 != NULL) 
	{ 
		//update p1->edgeList 
		if( pEdge1!= NULL) 
		{ 
			pEdge1->nCount++; 
		} 
 
		POSITION pos11, pos12, pos13; 
		EdgeNode* pEdge5; 
		bool inside3 = false; 
		pos11 = p1->edgeList->GetHeadPosition(); 
		while(pos11 != NULL) 
		{ 
			pos12 = pos11; 
			EdgeNode* pEdge = (EdgeNode*)p1->edgeList->GetNext(pos11); 
			if(pEdge->index == p4->index) 
			{ 
				inside3 = true; 
				pos13 = pos12; 
				break; 
			} 
		}		 
		 
		if(inside3) 
		{ 
			pEdge5 = (EdgeNode*)p1->edgeList->GetAt(pos13); 
			pEdge5->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge6 = new EdgeNode(p4->index, 1); 
			p1->edgeList->AddTail(pEdge6); 
		} 
 
		//遍历p1的边表,若所有结点的边使用次数都为2,则将p1从点链PointList中删除。 
        POSITION pos61; 
		int number1 = 0; 
		int number2 = 0; 
		pos61 = p1->edgeList->GetHeadPosition(); 
		while(pos61 != NULL) 
		{ 
			EdgeNode* pEdge = (EdgeNode*)p1->edgeList->GetNext(pos61); 
			if(2 == pEdge->nCount) 
			{ 
				number1++; 
			} 
			number2++; 
		} 
		if(number1 == number2) 
		{ 
			p1->vertex = true; 
		} 
 
		//update p2->edgeList 
		POSITION pos21, pos22, pos23; 
		EdgeNode* pEdge7; 
		bool inside4 = false; 
		pos21 = p2->edgeList->GetHeadPosition(); 
		while(pos21 != NULL) 
		{ 
			pos22 = pos21; 
			EdgeNode* pEdge = (EdgeNode*)p2->edgeList->GetNext(pos21); 
			if(pEdge->index == p1->index) 
			{ 
				inside4 = true; 
				pos23 = pos22; 
				break; 
			} 
		} 
		if(inside4) 
		{ 
			pEdge7 = (EdgeNode*)p2->edgeList->GetAt(pos23); 
			pEdge7->nCount++; 
		} 
 
		POSITION pos31, pos32, pos33; 
		EdgeNode* pEdge8; 
		bool inside5 = false; 
		pos31 = p2->edgeList->GetHeadPosition(); 
		while(pos31 != NULL) 
		{ 
			pos32 = pos31; 
			EdgeNode* pEdge = (EdgeNode*)p2->edgeList->GetNext(pos31); 
			if(pEdge->index == p4->index) 
			{ 
				inside5 = true; 
				pos33 = pos32; 
				break; 
			} 
		}		 
		 
		if(inside5) 
		{ 
			pEdge8 = (EdgeNode*)p2->edgeList->GetAt(pos33); 
			pEdge8->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge9 = new EdgeNode(p4->index, 1); 
			p2->edgeList->AddTail(pEdge9); 
		} 
 
		//遍历p2的边表,若所有结点的边使用次数都为2,则将p2从点链PointList中删除。 
        POSITION pos71, pos72; 
		int number3 = 0; 
		int number4 = 0; 
		pos71 = p2->edgeList->GetHeadPosition(); 
		while(pos71 != NULL) 
		{ 
			pos72 = pos71; 
			EdgeNode* pEdge = (EdgeNode*)p2->edgeList->GetNext(pos71); 
			if(2 == pEdge->nCount) 
			{ 
				number3++; 
			} 
			number4++; 
		} 
		if(number3 == number4) 
		{ 
			p2->vertex = true; 
		} 
 
		//update p4->edgeList 
		POSITION pos41, pos42, pos43; 
		EdgeNode* pEdge10; 
		bool inside6 = false; 
		pos41 = p4->edgeList->GetHeadPosition(); 
		while(pos41 != NULL) 
		{ 
			pos42 = pos41; 
			EdgeNode* pEdge = (EdgeNode*)p4->edgeList->GetNext(pos41); 
			if(pEdge->index == p1->index) 
			{ 
				inside6 = true; 
				pos43 = pos42; 
				break; 
			} 
		}		 
		 
		if(inside6) 
		{ 
			pEdge10 = (EdgeNode*)p4->edgeList->GetAt(pos43); 
			pEdge10->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge11 = new EdgeNode(p1->index, 1); 
			p4->edgeList->AddTail(pEdge11); 
		} 
 
		POSITION pos51, pos52, pos53; 
		EdgeNode* pEdge12; 
		bool inside7 = false; 
		pos51 = p4->edgeList->GetHeadPosition(); 
		while(pos51 != NULL) 
		{ 
			pos52 = pos51; 
			EdgeNode* pEdge = (EdgeNode*)p4->edgeList->GetNext(pos51); 
			if(pEdge->index == p2->index) 
			{ 
				inside7 = true; 
				pos53 = pos52; 
				break; 
			} 
		}		 
		 
		if(inside7) 
		{ 
			pEdge12 = (EdgeNode*)p4->edgeList->GetAt(pos53); 
			pEdge12->nCount++; 
		} 
		else 
		{ 
			EdgeNode* pEdge13 = new EdgeNode(p2->index, 1); 
			p4->edgeList->AddTail(pEdge13); 
		} 
 
		//遍历p4的边表,若所有结点的边使用次数都为2,则将p4从点链PointList中删除。 
        POSITION pos81, pos82; 
		int number5 = 0; 
		int number6 = 0; 
		pos81 = p4->edgeList->GetHeadPosition(); 
		while(pos81 != NULL) 
		{ 
			pos82 = pos81; 
			EdgeNode* pEdge = (EdgeNode*)p4->edgeList->GetNext(pos81); 
			if(2 == pEdge->nCount) 
			{ 
				number5++; 
			} 
			number6++; 
		} 
		if(number5 == number6) 
		{ 
			p4->vertex = true; 
		} 
 
 
		//加入新三角形 
		TriAngle* pTri = new TriAngle(p1->index,  
			p2->index,  
			p4->index); 
		triList->AddTail(pTri); 
 
		p4->intri = true; 
		 
		Tricount++; 
	} 
} 
 
void CDelaunayView::enlargeTri(CObList* pointList, 
							   CObList* TriList) 
{ 
	POSITION pos1, pos2, pos3; 
	PointCls *p1, *p2, *p3; 
	p1 = p2 = p3 = NULL; 
	TriAngle* pTri; 
 
	pos1 = TriList->GetHeadPosition();	 
	while(pos1 != NULL) 
	{ 
		pos3 = pos1; 
		pTri = (TriAngle*)TriList->GetNext(pos1);			 
		 
		if(!pTri->enlarge) 
		{ 
			pos2 = pointList->GetHeadPosition(); 
			while(pos2 != NULL) 
			{ 
				PointCls* pa = (PointCls*)pointList->GetNext(pos2); 
				 
				if(pa->index == pTri->index[0]) 
				{ 
					p1 = pa; 
				} 
				if(pa->index == pTri->index[1]) 
				{ 
					p2 = pa; 
				} 
				if(pa->index == pTri->index[2]) 
				{ 
					p3 = pa; 
				}			 
			} 
			if(p1 == NULL || p2 == NULL || p3 == NULL) 
				return; 
			enlargeEdge(p2, p3, p1, pointList, TriList); 
			enlargeEdge(p3, p1, p2, pointList, TriList); 
 
			pTri->enlarge = true; 
		}		 
	} 
} 
 
void CDelaunayView::continueEnlarge(CObList* pointList, 
		                            CObList* TriList) 
{ 
	POSITION pos1, pos2, pos3; 
	PointCls *p, *p1, *p2, *p3; 
	p1 = p2 = p3 = NULL; 
	 
	pos1 = pointList->GetHeadPosition(); 
	 
	while(pos1 != NULL) 
	{ 
		p = (PointCls*)pointList->GetNext(pos1); 
		if(p->intri) 
			continue; 
		else 
		{ 
			createFirstTri(pointList, 
				TriList, 
				p); 
			 
			TriAngle *pTriSeed, *ptri; 
			pTriSeed = NULL; 
			 
			pos2 = TriList->GetHeadPosition(); 
			while(pos2 != NULL) 
			{ 
				ptri = (TriAngle*)TriList->GetNext(pos2); 
				 
				if(ptri->enlarge) 
					continue; 
				else 
				{ 
					pTriSeed = ptri; 
					pos3 = pointList->GetHeadPosition(); 
					while(pos3 != NULL) 
					{ 
						PointCls* pa = (PointCls*)pointList->GetNext(pos3); 
						 
						if(pa->vertex) 
							continue; 
						 
						if(pa->index == pTriSeed->index[0]) 
						{ 
							p1 = pa; 
						} 
						if(pa->index == pTriSeed->index[1]) 
						{ 
							p2 = pa; 
						} 
						if(pa->index == pTriSeed->index[2]) 
						{ 
							p3 = pa; 
						} 
					} 
					if(p1 == NULL || p2 == NULL || p3 == NULL) 
						return; 
					 
					enlargeEdge(p1, p2, p3, pointList, TriList); 
					 
					enlargeTri(pointList, TriList);					 
				} 
			}			 
		} 
	}	 
} 
 
void CDelaunayView::OnDelaunay()  
{ 
	// TODO: Add your command handler code here 
	CDelaunayDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc);	 
 
	if(!pDoc->PointList->GetCount()) 
	{ 
		char str[100]; 
		ostrstream osr(str,100);		 
		osr<<"请用鼠标左键在窗口里选择要进行三角剖分的顶点"<<'\n' 
			<<"                  谢谢合作"<<'\0'; 
		CString output(str); 
		MessageBox(output); 
		return; 
	} 
 
	PointCls *p1, *p2, *p3;	 
	POSITION pos4, pos5; 
 
	createFirstTri(pDoc->PointList, 
			       pDoc->TriList); 
	 
	pos4 = pDoc->TriList->GetHeadPosition(); 
	TriAngle* pTriSeed = (TriAngle*)pDoc->TriList->GetAt(pos4); 
 
	pos5 = pDoc->PointList->GetHeadPosition(); 
	while(pos5 != NULL) 
	{ 
		PointCls* pa = (PointCls*)pDoc->PointList->GetNext(pos5); 
 
		if(pa->index == pTriSeed->index[0]) 
		{ 
			p1 = pa; 
		} 
		if(pa->index == pTriSeed->index[1]) 
		{ 
			p2 = pa; 
		} 
		if(pa->index == pTriSeed->index[2]) 
		{ 
			p3 = pa; 
		} 
	} 
	enlargeEdge(p1, p2, p3, pDoc->PointList, pDoc->TriList); 
 
	enlargeTri(pDoc->PointList, pDoc->TriList); 
 
	continueEnlarge(pDoc->PointList, pDoc->TriList); 
 
	Invalidate(); 
}