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

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

?? delaunaydoc.cpp

?? 三角網剖分 將平面數據點進行三角剖分 快速構建delaunay三角網
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// DelaunayDoc.cpp : implementation of the CDelaunayDoc class
//

#include "stdafx.h"
#include "Delaunay.h"

#include "DelaunayDoc.h"
#include "pointview.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDelaunayDoc

IMPLEMENT_DYNCREATE(CDelaunayDoc, CDocument)

BEGIN_MESSAGE_MAP(CDelaunayDoc, CDocument)
	//{{AFX_MSG_MAP(CDelaunayDoc)
	ON_COMMAND(ID_BUTTON_ADD, OnButtonAdd)
	ON_UPDATE_COMMAND_UI(ID_BUTTON_ADD, OnUpdateButtonAdd)
	ON_COMMAND(ID_BUTTON_BB, OnButtonBB)
	ON_UPDATE_COMMAND_UI(ID_BUTTON_BB, OnUpdateButtonBB)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDelaunayDoc construction/destruction

CDelaunayDoc::CDelaunayDoc()
{
	// TODO: add one-time construction code here


}

CDelaunayDoc::~CDelaunayDoc()
{
}

BOOL CDelaunayDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)
	//CPointPos* temp=new CPointPos;
	//m_point.Add(temp);
	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CDelaunayDoc serialization

void CDelaunayDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		
	}
	else
	{
		// TODO: add loading code here
	}
	m_con.Serialize(ar);
	m_point.Serialize(ar);////////
	m_tri.Serialize(ar);
//	m_n.Serialize(ar);
}

/////////////////////////////////////////////////////////////////////////////
// CDelaunayDoc diagnostics

#ifdef _DEBUG
void CDelaunayDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CDelaunayDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDelaunayDoc commands


void CDelaunayDoc::AddPoint(double x, double y)
{
	double z;
	int m_plen;//當前節點個數
	CPointPos *p;
	p=new CPointPos(x,y);
	if(x<=0.4)
	{
		z=0.03-(x-0.2)*(x-0.2)-(y-0.5)*(y-0.5);
	    if(z<0) z=0.1;
		p->m_z=sqrt(z)*double(3);
	}
	else{
	    if(x>=0.6)
		{
			z=0.05-(x-0.8)*(x-0.8)-(y-0.5)*(y-0.5);
	        if(z<0) z=0.1;
		    p->m_z=sqrt(z)*double(1.5);
		}
		else
            p->m_z=0.5;
	}
	//p->m_z=sin((x-0.5)*(y-0.5));
	//z=0.25-(x-0.5)*(x-0.5)-(y-0.5)*(y-0.5);
	//if(z<0) z=0;
	//p->m_z=sqrt(z)*double(4)
	//p->m_z = (float)sin(3.0*x)*cos(3.0*y)/3.0f;
	ASSERT(p!=NULL);	
	m_point.Add(p);
	POSITION pos;
	pos=GetFirstViewPosition();
	m_plen=m_point.GetSize();
	while(pos!=NULL)
	{
		CView *pp=GetNextView(pos);
		if(pp->IsKindOf(RUNTIME_CLASS(CPointView)))
		{
			CListCtrl &list=((CPointView*)pp)->GetListCtrl();
			LV_ITEM li;
			CString str;	
			str.Format("%d",m_plen-1);
			li.mask=LVIF_TEXT;
			li.pszText=str.GetBuffer(10);;
			li.iItem=m_plen-1;
			li.iSubItem=0;
			list.InsertItem(&li);
			str.ReleaseBuffer();
			str.Format("%f",p->m_x);
			li.pszText=str.GetBuffer(10);
			li.iItem=m_plen-1;
			li.iSubItem=1;
			list.SetItem(&li);
			str.ReleaseBuffer();
			str.Format("%f",p->m_y);
			li.pszText=str.GetBuffer(10);
			li.iItem=m_plen-1;
			li.iSubItem=2;
			list.SetItem(&li);
			str.ReleaseBuffer();
		}
	}
};
////////////////////////////////////////////
void CDelaunayDoc::DeleteContents() 
{
	int i,max;
	max=m_point.GetSize();
	for(i=0;i<max;i++)
	{
		if(m_point[i]!=NULL)
			delete m_point[i];
		//if(m_n[i]!=NULL)//????????
		//	delete m_n[i];
	}
	m_point.RemoveAll();


	POSITION pos = m_tri.GetHeadPosition();
	while( pos != NULL )
	{
		delete m_tri.GetNext( pos );
	}
	m_tri.RemoveAll();
    m_con.RemoveAll();
	m_index.RemoveAll();

	CDocument::DeleteContents();
}
///////////////////////////////////////////////////
void CDelaunayDoc::Center(CTriangle *temp)//外接圓心和半徑是利用斜率來求的
{
	ASSERT(temp!=NULL);
	int p1,p2,p3;
	p1=temp->m_p1;
	p2=temp->m_p2;
	p3=temp->m_p3;
    double k21,k31;
	CPointPos* p11=(CPointPos*)m_point[p1];
	CPointPos* p22=(CPointPos*)m_point[p2];
	CPointPos* p33=(CPointPos*)m_point[p3];
	if((p22->m_x-p11->m_x)==0) //有一條邊平行于Y軸
	{
		temp->m_yc=(p11->m_y+p22->m_y)/2;  //circle 縱坐標
        k31=(p33->m_y-p11->m_y)/(p33->m_x-p11->m_x);
		if (k31==0)
		{
			temp->m_xc=(p11->m_x+p33->m_x)/2;
		}//此時為直角三角形
		else
		{
		   temp->m_xc=(p11->m_x+p33->m_x)/2+
			   ((p11->m_y+p33->m_y)/2-temp->m_yc)*k31;
		}
	}
	else//有一條邊平行于X軸 
	{
		k21=(p22->m_y-p11->m_y)/(p22->m_x-p11->m_x);
		if (k21==0)
		{
			temp->m_xc=(p11->m_x+p22->m_x)/2;
			if((p22->m_x-p33->m_x)==0) 
			{
				temp->m_yc=(p11->m_y+p33->m_y)/2;
			}
		    else
			{
                k31=(p33->m_y-p11->m_y)/
		          	(p33->m_x-p11->m_x);
		        temp->m_yc=((p33->m_x+p11->m_x)/2-
					         temp->m_xc)/k31+
							 (p11->m_y+p33->m_y)/2;
			}
		}
		else//都不平行
		{
		    if((p33->m_x-p11->m_x)==0)
			{
				temp->m_yc=(p33->m_y+p11->m_y)/2;
				temp->m_xc=k21*(p11->m_y/2+p22->m_y/2-temp->m_yc)+
								(p11->m_x+p22->m_x)/2;
			}
			else
			{
				 k31=(p33->m_y-p11->m_y)/(p33->m_x-p11->m_x);
				 if(k31==0)
				 {
	                      temp->m_xc=(p11->m_x+p33->m_x)/2;
					      temp->m_yc=((p11->m_x+p22->m_x)/2-
					         temp->m_xc)/k21+
							 (p11->m_y+p22->m_y)/2;
				 }
				 else
				 {
                          temp->m_xc=(k21*k31*(p22->m_y-p33->m_y)+
								(p11->m_x+p22->m_x)*k31-(p11->m_x+p33->m_x)*k21)/(k31-k21);
						  temp->m_xc=temp->m_xc/2;
                          temp->m_yc=((p11->m_x+p22->m_x)/2-
					         temp->m_xc)/k21+
							 (p11->m_y+p22->m_y)/2;
				 }
			}
		}
	}

	temp->m_rad=sqrt((p33->m_x-temp->m_xc)*(p33->m_x-temp->m_xc)
		              + (p33->m_y-temp->m_yc)*(p33->m_y-temp->m_yc));//兩點間的距離
	
}
///////////////////////////////////////////////////
void CDelaunayDoc::OnButtonAdd() 
{
	m_DoWhat=DO_ADD;	
}

void CDelaunayDoc::OnUpdateButtonAdd(CCmdUI* pCmdUI) 
{
	if(m_DoWhat==DO_ADD)
		pCmdUI->SetCheck(1);
	else 
		pCmdUI->SetCheck(0);
}



void CDelaunayDoc::AddTriangle(int p)//添加三角形(MY WORK)
{
  	//add new triangles
	CTriangle* pTriangle;
	int max=m_edge.GetSize();	
	for(int i=0;i<max;i++)//確保這些邊是按逆時針來存儲的
	{
	   //Every triangle is stored anticlockwise,too.
	   if(S(m_edge[i]->m_p1,m_edge[i]->m_p2,p)>0)//利用三角形的面積來判斷
	   {
			pTriangle=new CTriangle(m_edge[i]->m_p1,m_edge[i]->m_p2,p);
	   }
	   else
	   {
			pTriangle=new CTriangle(m_edge[i]->m_p2,m_edge[i]->m_p1,p);
	   }
	   Center(pTriangle);				//三角形外接圓半徑和圓心
       BaryCenter(pTriangle);			//三角形重心
	   m_tri.AddTail(pTriangle);		//將當前的三角形加入三角形鏈表						
	}
}



double CDelaunayDoc::S(int p1, int p2, int p3)//求面積
{
	//求三角形面積,以右下角為原點時,s>0為逆時針(左轉),
	//s=0為三點重合
	double s;
	//POI m_p1,m_p2,m_p3;
	CPointPos *m_p1=new CPointPos(m_point[p1]->m_x,m_point[p1]->m_y);
    CPointPos *m_p2=new CPointPos(m_point[p2]->m_x,m_point[p2]->m_y);
    CPointPos *m_p3=new CPointPos(m_point[p3]->m_x,m_point[p3]->m_y);
	s=m_p1->m_x*m_p2->m_y+m_p2->m_x*m_p3->m_y+m_p1->m_y*
		m_p3->m_x-m_p2->m_y*m_p3->m_x-m_p1->m_y*m_p2->m_x-m_p1->m_x*m_p3->m_y;
	s=s/2;
	delete m_p1;
	delete m_p2;
	delete m_p3;

	return s;
}

int CDelaunayDoc::TwoEdgeSuperposition(CBorder *b1, CBorder *b2)
{
	if(b1==b2 || (b1->m_p1==b2->m_p2 && b1->m_p2==b2->m_p1) ) return 1;
	return 0;
}

int CDelaunayDoc::GetInitEdges(double x, double y, int p)//形成最初的三角形,插入法三角剖分(MYWORK)
{
	// GetInitEdges : ransack each trangle to record it's edges
	//when the piont belong it's circle,record the triangle's position in m_tri to m_index
	//'x' and 'y' are the coordinates of the insert point
	//'p' is the mark or th insert point in 'm_point'
	// the returned value 'k/2' is the number of cirecle the point belonged
	POSITION POS;
	CBorder *m_border;
	CBorder *m_border1;
	CTriangle* pTriangle;
	int j=0,i=0,k=0,max=0;
	CPointPos *point=new CPointPos(x,y);
    POS = m_tri.GetHeadPosition();
	while(POS != NULL )
	{
       i= m_tri.GetAt( POS )->Where(point);
	   
	   if(i==POS_ERROR)
	   {
		   return POS_ERROR;
	   }
	   if(i==POS_ON)//in circle POS_ON=2 對邊要進行調整
	   {
		  k=k+i;
		  m_index.Add(POS);    //指向三角形鏈的節點的指針數組,對將要刪出的三角形做標志
		  pTriangle=m_tri.GetAt(POS);
		  //ransack three edge of a triangle,if an edge of a triangle
		  //have belong to the array 'm_pDoc->m_edge' delete both of them to form 
		  // the border of the inserted polygon which is stored in the array
		  //'m_pDoc->m_edge'
		  int array[4];//局部優化,是采用的凸四邊形的優化算法
		  array[0]=pTriangle->m_p1;
		  array[1]=pTriangle->m_p2;
		  array[2]=pTriangle->m_p3;
		  array[3]=pTriangle->m_p1;
          for(int h=0;h<3;h++)
		  {					  
			 m_border=new CBorder(array[h],array[h+1]);
			 max=m_edge.GetSize();
			 if(max==0)
			 {
                m_edge.Add(m_border);
			 }
			 else
			 {
			    j=0;
			    for(int m=0;m<max;m++)
				{						  				         
				   m_border1=m_edge[m];
				   if(TwoEdgeSuperposition(m_border,m_border1)==1)
				   {
				      m_edge.RemoveAt(m,1);
					  max=max-1;
					  j++;
				   }
				}
			    if(j==0)
				{
                   m_edge.Add(m_border);
				}				    
			}		 
		  }
	   }
     pTriangle=m_tri.GetNext(POS);
	}
	delete point;
return k;
}

void CDelaunayDoc::DelTriMarked()
{
   int max=m_index.GetSize();
   for(int i=0;i<max;i++)
   {
	  m_tri.RemoveAt(m_index[i]);
   }
}

void CDelaunayDoc::EditCon(int r, int l,int p)//判斷點在凸包中的邊界
{	 CBorder *m_border;
     int hr=0;//record the number of points on edge of convexity that should be deleted before r(include r) 
	 int hl=0;//record the number of points on edge of convexity that should be deleted after l(include l)
	 int i=r;
	 int i1;
	 int h=hr+hl; 
	 int max=m_con.GetSize();
	 //search rightward, first
	 if((i+1)>max-1)  i1=i+1-max;	 
	 else  	          i1=i+1;	
	 while(S(p,m_con[i],m_con[i1])<0)
	 {                  
			m_border=new CBorder(m_con[i],m_con[i1]);
			m_edge.Add(m_border);	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av电影在线播放| 成人永久看片免费视频天堂| 国产精品视频yy9299一区| 欧洲精品在线观看| 国产成人精品1024| 视频一区二区三区在线| 国产精品剧情在线亚洲| 欧美一级精品大片| 色婷婷综合久久久中文字幕| 国产福利一区在线观看| 婷婷综合久久一区二区三区| 亚洲桃色在线一区| 欧美激情一二三区| 精品国产一区二区三区不卡| 欧美视频一区在线观看| 成人app下载| 国产成人免费视频一区| 裸体健美xxxx欧美裸体表演| 亚洲福中文字幕伊人影院| 中文字幕日本乱码精品影院| 久久综合九色综合欧美就去吻| 欧美精品99久久久**| 日本道在线观看一区二区| 成人av网站免费观看| 国产精品88888| 国产中文字幕精品| 精品一区二区三区免费| 日韩电影一区二区三区四区| 亚洲一区在线观看网站| 最新中文字幕一区二区三区 | 亚洲韩国一区二区三区| 亚洲国产高清aⅴ视频| 精品卡一卡二卡三卡四在线| 欧美一区二区在线视频| 欧美久久一二区| 欧美日韩久久久久久| 欧美三级一区二区| 欧美日韩在线观看一区二区 | 色综合天天综合| 日韩欧美123| 欧美巨大另类极品videosbest | 精品日韩欧美在线| 欧美变态tickle挠乳网站| 欧美一区二区三区不卡| 在线不卡免费欧美| 91精品国产综合久久香蕉麻豆 | 久久精品国产网站| 久久精品99国产国产精| 狠狠网亚洲精品| 国产成人精品一区二区三区网站观看| 国产乱子伦一区二区三区国色天香 | 欧美高清一级片在线观看| 日本一区免费视频| 亚洲视频中文字幕| 一区二区三区自拍| 日韩精品成人一区二区在线| 奇米影视一区二区三区| 精品一区二区三区在线播放视频 | 欧美日韩国产小视频在线观看| 欧美日韩一级片在线观看| 91精品国产色综合久久| 欧美精品一区二区久久久| 国产婷婷一区二区| 亚洲欧美乱综合| 日日嗨av一区二区三区四区| 极品少妇xxxx精品少妇| 不卡的av在线| 欧美日韩美少妇 | 亚洲成人综合视频| 欧美体内she精高潮| 91黄色免费版| 日韩欧美一级二级三级久久久| 日韩欧美成人午夜| 国产精品久久久久久久久免费桃花| 一区二区三区日韩精品视频| 蜜臀久久久99精品久久久久久| 国产一区二区三区免费在线观看| 99久久99久久久精品齐齐| 欧美日韩一区国产| 国产性做久久久久久| 亚洲综合一区在线| 国产乱码精品一品二品| 色伊人久久综合中文字幕| 日韩欧美资源站| 亚洲人成人一区二区在线观看 | 老司机免费视频一区二区| 粉嫩欧美一区二区三区高清影视 | 日韩午夜av一区| |精品福利一区二区三区| 免费观看成人av| 91视频观看视频| 欧美mv日韩mv| 亚洲午夜免费视频| 粉嫩av一区二区三区在线播放| 91豆麻精品91久久久久久| 26uuu国产电影一区二区| 一区二区三区精品视频| 国产精品一区二区久激情瑜伽| 欧美日韩国产在线观看| 中文在线一区二区| 久久99精品久久久久久国产越南 | 国产精品久久三| 欧美aaaaa成人免费观看视频| 99久久伊人精品| 精品国产sm最大网站免费看| 亚洲精品高清在线| 东方aⅴ免费观看久久av| 欧美一区二区三区婷婷月色| 亚洲免费观看高清完整版在线观看| 国产在线日韩欧美| 91精品国产高清一区二区三区| 亚洲美女视频在线观看| 国产成人福利片| 欧美成人综合网站| 五月综合激情网| 91极品美女在线| 成人欧美一区二区三区在线播放| 韩国欧美国产1区| 欧美一区二区三区小说| 亚洲va国产天堂va久久en| 91蝌蚪porny九色| 国产精品久久99| 国产成人av一区二区三区在线| 欧美xxxxxxxx| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美日韩国产一级片| 一区二区三区在线观看动漫| 97国产精品videossex| 久久国产人妖系列| 欧美一区二区日韩| 日本在线播放一区二区三区| 欧美日韩夫妻久久| 国产黄色91视频| 亚洲已满18点击进入久久| 亚洲成人一区在线| 91久久免费观看| 一区二区在线观看不卡| 97精品超碰一区二区三区| 亚洲色图在线看| 色婷婷久久综合| 亚洲资源中文字幕| 欧美日韩一区视频| 日韩精品久久久久久| 日韩免费观看高清完整版 | 蜜臀av性久久久久蜜臀av麻豆| 51精品秘密在线观看| 日本不卡视频在线| 精品国产亚洲在线| 国产一区二区美女| 国产精品天天看| 99国产精品国产精品毛片| 一区二区三区日本| 欧美视频一二三区| 美女视频黄a大片欧美| 精品日韩av一区二区| 国产精品91一区二区| 中文字幕佐山爱一区二区免费| 欧美综合色免费| 日韩国产成人精品| 久久久久久一级片| 91玉足脚交白嫩脚丫在线播放| 亚洲制服丝袜av| 日韩欧美一二三四区| 国产成人精品aa毛片| 一区二区三区四区乱视频| 欧美精品日韩综合在线| 久久精品国产77777蜜臀| 国产拍欧美日韩视频二区| 91麻豆6部合集magnet| 日韩成人av影视| 国产欧美一区二区精品忘忧草 | 国产日韩综合av| 成人h版在线观看| 亚洲高清免费一级二级三级| 日韩美女主播在线视频一区二区三区| 国产成人一区在线| 亚洲永久免费视频| 亚洲精品在线电影| 色天使色偷偷av一区二区| 蜜桃av一区二区三区| 中文字幕欧美一区| 欧美岛国在线观看| 91免费国产在线观看| 久久99这里只有精品| 亚洲免费av网站| 久久综合狠狠综合| 欧美三级中文字幕在线观看| 国产在线精品国自产拍免费| 亚洲另类色综合网站| 精品国产露脸精彩对白 | 久久综合网色—综合色88| 色综合久久综合中文综合网| 免费高清不卡av| 亚洲色大成网站www久久九九| 日韩美女在线视频| 欧美在线视频你懂得| 风流少妇一区二区| 日本不卡中文字幕| 亚洲一区二区免费视频| 日本一区二区动态图|