⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trianglulationview.cpp

📁 用数值方法做的三角剖分程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		u=0.6+0.2*cos(t);
		v=0.5+0.3*sin(t);
        firstpoint.x =(int)((1-u)*(1-u)*(controlpoint[0].x *(1-v)*(1-v)+2*controlpoint[1].x *v *(1-v)+controlpoint[2].x *v*v)
				+2*u*(1-u)*(controlpoint[3].x *(1-v)*(1-v)+2*controlpoint[4].x *v *(1-v)+controlpoint[5].x *v*v)
				+u*u*(controlpoint[6].x *(1-v)*(1-v)+2*controlpoint[7].x *v *(1-v)+controlpoint[8].x *v*v));
		firstpoint.y =(int)((1-u)*(1-u)*(controlpoint[0].y *(1-v)*(1-v)+2*controlpoint[1].y *v *(1-v)+controlpoint[2].y *v*v)
					+2*u*(1-u)*(controlpoint[3].y *(1-v)*(1-v)+2*controlpoint[4].y *v *(1-v)+controlpoint[5].y *v*v)
					+u*u*(controlpoint[6].y *(1-v)*(1-v)+2*controlpoint[7].y *v *(1-v)+controlpoint[8].y *v*v));
		firstpoint.z =(int)((1-u)*(1-u)*(controlpoint[0].z *(1-v)*(1-v)+2*controlpoint[1].z *v *(1-v)+controlpoint[2].z *v*v)
					+2*u*(1-u)*(controlpoint[3].z *(1-v)*(1-v)+2*controlpoint[4].z *v *(1-v)+controlpoint[5].z *v*v)
					+u*u*(controlpoint[6].z *(1-v)*(1-v)+2*controlpoint[7].z *v *(1-v)+controlpoint[8].z *v*v));

		nextpoint.x =(int)(viewpoint.x +(firstpoint.x -viewpoint.x )*viewpoint.z /(viewpoint.z -firstpoint.z +0.0001))+500;
		nextpoint.y =(int)(viewpoint.y +(firstpoint.y -viewpoint.x )*viewpoint.z /(viewpoint.z -firstpoint.z +0.0001));
		pDC->LineTo (nextpoint.x ,nextpoint.y );
		t=t+0.1;
	}  
}

void CTrianglulationView::triangulate()
{
    //the coordinate of the points

	CDC  *pDC=GetDC();

/*	pDC->SetPixel (mypoint[0].x ,mypoint[0].y ,1);
	pDC->SetPixel (mypoint[1].x ,mypoint[1].y ,1);
	pDC->SetPixel (mypoint[2].x ,mypoint[2].y,1 );
	pDC->SetPixel (mypoint[3].x ,mypoint[3].y ,1);
	pDC->SetPixel (mypoint[4].x ,mypoint[4].y,1 );
	pDC->SetPixel (mypoint[5].x ,mypoint[5].y,1);
	pDC->SetPixel (mypoint[6].x ,mypoint[6].y ,1);
	pDC->SetPixel (mypoint[7].x ,mypoint[7].y ,1);*/
    
	//init the edge
	int   i;
    
	double  error=1000.;
	double  d;
	int     pointnumber=-1;
	int     stackvary=0;
	bool    tag1=1,tag2=1;
	bool    change=1;
	int     edgenumber=-1;
	double  d1,d2,d3;
	double  ar;
	int     inside=0;
	
	edgestack[0].number1 =0;
	edgestack[0].number2 =1;
	stacknum++;

	while (change)
	{
		error=1000.0;
		pointnumber=-1;
		edgenumber=-1;
		for (stackvary=0;stackvary<stacknum;stackvary++)
		{
			for (i=0;i<(pointnum);i++)
			{
				if ((IsVisual(edgestack[stackvary],i)==1))
				{
					// d=abs((threepoint(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i)-PI/3)*(threepoint(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i)-PI/3)
					//	 +(threepoint(edgestack[stackvary].number2 ,edgestack[stackvary].number1 ,i)-PI/3)*(threepoint(edgestack[stackvary].number2 ,edgestack[stackvary].number1 ,i)-PI/3)
					//	 +(threepoint(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 )-PI/3)*(threepoint(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 )-PI/3));
				/*	m=sqrt(3)/2;
					d1=abc(AR(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i),m);
					d2=abc(AR(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 ),m);
					d3=abc(AR(edgestack[stackvary].number2 ,i,edgestack[stackvary].number1 ),m);
					d=d1+d2+d3;
					d1=(threepoint(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i)-PI/3)*(threepoint(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i)-PI/3);
					 d2=(threepoint(edgestack[stackvary].number2 ,edgestack[stackvary].number1 ,i)-PI/3)*(threepoint(edgestack[stackvary].number2 ,edgestack[stackvary].number1 ,i)-PI/3);
					 d3=(threepoint(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 )-PI/3)*(threepoint(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 )-PI/3);
					 d=d1+d2+d3;*/
//					ar=AR(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i);
					d3=edge(edgestack[stackvary].number1,edgestack[stackvary].number2);
					d1=abc(edge(edgestack[stackvary].number2,i),d3);
					d2=abc(edge(edgestack[stackvary].number1,i),d3);
					d=d1+d2;
					// if ((d<error)&&(d1>0.1)&&(d2>0.1)&&(d3>0.1))
				     if (d<error)
					 {
						 error=d;
						 pointnumber=i;
						 edgenumber=stackvary;
					 }
				}
			}
		}
		if (pointnumber!=-1)
		{
			i=0;
		    inside =PointIsInside(edgestack[edgenumber].number1 ,edgestack[edgenumber].number2 ,pointnumber);
    	    if (inside!=0)
			{
               pointnumber=inside;
			}
			while ((tag1==1)&&(i<=edgestacknum))
			{
				if (((pointnumber==edgestack[i].number1 )||(pointnumber==edgestack[i].number2 ))
					&&((edgestack[edgenumber].number2 ==edgestack[i].number1 )||(edgestack[edgenumber].number2 ==edgestack[i].number2 )))
				      tag1=0;
				i++;
			}
			if (tag1==1)
			{
				edgestack[stacknum].number1 =edgestack[edgenumber].number2 ;
				edgestack[stacknum].number2 =pointnumber;
				stacknum++;
			}
			tag1=1;
			i=0;
			while ((tag2==1)&&(i<=edgestacknum))
			{
				if (((pointnumber==edgestack[i].number1 )||(pointnumber==edgestack[i].number2 ))
					&&((edgestack[edgenumber].number1 ==edgestack[i].number1 )||(edgestack[edgenumber].number2 ==edgestack[i].number2 )))
		              tag2=0;
				i++;
			}
            if (tag2==1)
			{
				edgestack[stacknum].number1 =edgestack[edgenumber].number1 ;
				edgestack[stacknum].number2 =pointnumber;
				stacknum++;
			}
			tag2=1; 
			triangular[triangularnum].number1 =edgestack[edgenumber].number1;
			triangular[triangularnum].number2 =edgestack[edgenumber].number2 ;
			triangular[triangularnum].number3 =pointnumber;
			triangularnum++;
		}
	else
		change=0;
	}
	stackvary=0;
	while (stackvary<stacknum)
	{
		pDC->MoveTo (mypoint[edgestack[stackvary].number1 ].x,mypoint[edgestack[stackvary].number1 ].y);
		pDC->LineTo (mypoint[edgestack[stackvary].number2 ].x,mypoint[edgestack[stackvary].number2 ].y);
		stackvary++;
	}
}

bool CTrianglulationView::IsVisual(Edge edge, int number2)
{
    //判断点point2对边edge是否可见
	double  b;
    int     number1;
	bool    Intersect1=0;
	bool    Intersect2=0;
	int     i;
	double  length;
	bool      isout;

	if ((number2==edge.number1 )||(number2==edge.number2))
	    return  0;//点在直线上
/*	int  d;
	d=(int)(fabs((mypoint[edge.number2 ].y -mypoint[edge.number1 ].y )*mypoint[number2].x -(mypoint[edge.number2 ].x -mypoint[edge.number1 ].x )*mypoint[number2].y 
		+(mypoint[edge.number1 ].y *mypoint[edge.number2 ].x -mypoint[edge.number2 ].y *mypoint[edge.number1 ].x ))
		/sqrt((mypoint[edge.number1].y-mypoint[edge.number2].y)*(mypoint[edge.number1].y-mypoint[edge.number2].y)+(mypoint[edge.number1].x-mypoint[edge.number2].x)*(mypoint[edge.number1].x-mypoint[edge.number2].x)));
    if (d<=5)
		return 0;*/
	number1=PointRelToEdge(edge);
	RelPoint1=-1;
	RelPoint2=-1;
	isout=Isout(edge.number1 ,edge.number2 ,number2);
	if (isout==0)
       return 0;
	if (number1==-1)
		return 0;//没有任何点可见
	if (number1==-2)
		return 1;//任何点都是可见的
	double    b1,b2;

	b1=(mypoint[edge.number1 ].x -mypoint[edge.number2 ].x)*mypoint[number1].y 
		+(mypoint[edge.number2 ].y -mypoint[edge.number1 ].y)*mypoint[number1].x 
		+mypoint[edge.number2].x *mypoint[edge.number1].y -mypoint[edge.number1].x*mypoint[edge.number2].y;
	b2=(mypoint[edge.number1 ].x -mypoint[edge.number2 ].x)*mypoint[number2].y 
	    +(mypoint[edge.number2 ].y -mypoint[edge.number1].y)*mypoint[number2].x
	    +mypoint[edge.number2].x *mypoint[edge.number1].y -mypoint[edge.number1].x*mypoint[edge.number2].y;
	b=b1*b2;
	if (b<0)
	{ 
        i=0;
		while ((i<edgestacknum)&&(!Intersect1)&&(!Intersect2))
		{
			if ((((edgestack[i].number1!=edge.number1 )&&(edgestack[i].number2 !=edge.number2 ))
				||((edgestack[i].number2 !=edge.number1 )&&(edgestack[i].number1 !=edge.number2 )))
				||(((edgestack[i].number1 !=edge.number1 )&&(edgestack[i].number2 !=number2))
				||((edgestack[i].number2 !=edge.number1 )&&(edgestack[i].number1 !=number2))))
                  Intersect1=IsIntersect(edgestack[i].number1 ,edgestack[i].number2 ,edge.number1 ,number2);
		    if ((((edgestack[i].number1!=edge.number1 )&&(edgestack[i].number2 !=edge.number2 ))
				||((edgestack[i].number2 !=edge.number1 )&&(edgestack[i].number1 !=edge.number2 )))
				||(((edgestack[i].number1 !=edge.number2 )&&(edgestack[i].number2 !=number2))
				||((edgestack[i].number2 !=edge.number2 )&&(edgestack[i].number1 !=number2))))
			      Intersect2=IsIntersect(edgestack[i].number1 ,edgestack[i].number2 ,edge.number2 ,number2);
            i++;
		}
		length=(mypoint[edge.number1 ].x -mypoint[edge.number2 ].x )*(mypoint[edge.number1 ].x -mypoint[edge.number2 ].x )+
			(mypoint[edge.number1 ].y -mypoint[edge.number2 ].y )*(mypoint[edge.number1 ].y -mypoint[edge.number2 ].y);
		double  length1,length2;
		length1=(mypoint[edge.number1 ].x -mypoint[number2].x )*(mypoint[edge.number1 ].y -mypoint[number2].y )+
			(mypoint[edge.number1].y -mypoint[number2].y )*(mypoint[edge.number1 ].y -mypoint[number2].y );
		length2=(mypoint[edge.number2 ].x -mypoint[number2].x )*(mypoint[edge.number2 ].y -mypoint[number2].y )+
			(mypoint[edge.number2].y -mypoint[number2].y )*(mypoint[edge.number2 ].y -mypoint[number2].y );
	/*	if ((length1>length2)&&(length1>2*length/3.))
			return 0;
		if ((length2>length1)&&(length2>2*length/3.))
			return 0; */
		if ((Intersect1==1)||(Intersect2==1))
		   return 0;//点不是可见的
		else
		   return 1;
	}
	else 
		return 0;//没有任何点可见
}

int CTrianglulationView::PointRelToEdge(Edge edge)
{
     int  i;

	 for (i=0;i<triangularstacknum;i++)
	 {
		 if ((triangular[i].number1 ==edge.number1 )||(triangular[i].number2 ==edge.number1 )||(triangular [i].number3 ==edge.number1 ))
		 {
			 if ((triangular[i].number1 ==edge.number2 )||(triangular[i].number2 ==edge.number2 )||(triangular [i].number3 ==edge.number2 ))
                 if ((triangular[i].number1 !=edge.number1 )&&(triangular[i].number1 !=edge.number2 ))
				 {
					 if (RelPoint1==-1)
					     RelPoint1=triangular[i].number1 ;
					 else
                         RelPoint2=triangular[i].number1 ;
				 }
				 else
					 if ((triangular[i].number2 !=edge.number1 )&&(triangular[i].number2 !=edge.number2 ))
					 {
						 if (RelPoint1==-1)
						    RelPoint1=triangular[i].number2 ;
						 else
							 RelPoint2=triangular[i].number2 ;
					 }
					 else
					 {
						 if (RelPoint1==-1)
						    RelPoint1=triangular[i].number3 ;
						 else
							 RelPoint2=triangular[i].number3 ;
					 }
		 }
	 }
	 if ((RelPoint1!=-1)&&(RelPoint2!=-1))
		   {
			   return  -1;//边已经有两个三角形与之相关
		   }
	   if ((RelPoint1!=-1)&&(RelPoint2==-1))
	   {
		   return RelPoint1;//与之相关的顶点
	   }
	   if ((RelPoint2!=-1)&&(RelPoint1==-1))
	   {
		   return RelPoint2;//与之相关的顶点
	   }
	   if ((RelPoint1==-1)&&(RelPoint2==-1))
	   {
		   return -2;//没有顶点与之相关
	   }
}

double CTrianglulationView::threepoint(int number1, int number2, int number3)
{
    //calculate the cos of the three points(number1 is the common point)
     double cos;
	 double l1,l2,m1,m2,n1,n2;
	 l1=mypoint[number1].y -mypoint[number2].y;
     l2=mypoint[number1].y -mypoint[number3].y;
	 m1=mypoint[number1].x -mypoint[number2].x;
	 m2=mypoint[number1].x -mypoint[number3].x;
     n1=mypoint[number2].x *mypoint[number1].y -mypoint[number1].x *mypoint[number2].y ;
	 n2=mypoint[number3].x *mypoint[number1].y -mypoint[number1].x *mypoint[number3].y ;
	 cos =(l1*l2+m1*m2+n1*n2)/(sqrt(l1*l1+m1*m1+n1*n1)*sqrt(l2*l2+m2*m2+n2*n2));
	 cos=acos(cos);
	 return cos;
}

bool CTrianglulationView::IsIntersect(int number1, int number2, int number3, int number4)
{
      double    d1,d2,x,y,f;
	  
	  if ((number1==number3)||(number1==number4)||(number2==number3)||(number2==number4))
		  return 0;
      if ((number1==-1)||(number2==-1)||(number3==-1)||(number4==-1))
		  return 0;
	  d1=((double)mypoint[number4].y  -mypoint[number3].y )/(mypoint[number4].x -mypoint[number3].x )-
		  ((double)mypoint[number2].y -mypoint[number1].y )/(mypoint[number2].x -mypoint[number1].x );
	  d2=((double)mypoint[number2].x *mypoint[number1].y -mypoint[number2].y *mypoint[number1].x )/(mypoint[number2].x -mypoint[number1].x)-
		  ((double)mypoint[number4].x *mypoint[number3].y  -mypoint[number3].x *mypoint[number4].y  )/(mypoint[number4].x -mypoint[number3].x );

	  x=(d2/d1);
	  if (mypoint[number1].x <mypoint[number2].x )
		  {
			  if (mypoint[number3].x<mypoint[number4].x)
			  {
				  if ((x>=mypoint[number1].x )&&(x<=mypoint[number2].x )&&(x>=mypoint[number3].x )&&(x<=mypoint[number4].x))
					     return 1;//不相交
					  else
						 return 0;//相交
			  }
			  else
			  {

				  if (mypoint[number3].x >mypoint[number4].x )
					  if ((x>=mypoint[number1].x )&&(x<=mypoint[number2].x )&&(x>=mypoint[number4].x )&&(x<=mypoint[number3].x ))
						  return 1;//不相交
					  else
						 return 0;//相交
			  }
		 }
	 else
	 {
		 if (mypoint[number3].x<mypoint[number4].x )
		 {
			  if ((x>=mypoint[number2].x )&&(x<=mypoint[number1].x )&&(x>=mypoint[number3].x )&&(x<=mypoint[number4].x))
				     return 1;//不相交
			      else
				     return 0;//相交
		 }
		  else
		  {
			  if (mypoint[number3].x >mypoint[number4].x )
				  if ((x<=mypoint[number1].x )&&(x>=mypoint[number2].x )&&(x>=mypoint[number4].x )&&(x<=mypoint[number3].x ))
                      return 1;//不相交
			      else
				     return 0;//相交
		  }
	 }

}

bool CTrianglulationView::PointToLine(int number1, int number2, int number3)
{
   double  d1,d2;
   d1=sqrt((mypoint[number1].x -mypoint[number2].x )*(mypoint[number1].x -mypoint[number2].x )
	   -(mypoint[number2].y-mypoint[number1].y )*(mypoint[number2].y -mypoint[number1].y ));
 //  d2=
   return 1;
}

void CTrianglulationView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	mypoint[buttonpointnum].x =point.x ;
	mypoint[buttonpointnum].y =point.y ;
	CDC  *pDC=GetDC();
	pDC->SetPixel(mypoint[buttonpointnum].x ,mypoint[buttonpointnum].y ,1);
	CString  mystr1,mystr2,mystr;
	mystr1.Format ("%d",mypoint[buttonpointnum].x );
    mystr2.Format ("%d",mypoint[buttonpointnum].y );
	mystr="  "+mystr1+","+mystr2;
//	pDC->TextOut (mypoint[buttonpointnum].x,mypoint[buttonpointnum].y,mystr);
	buttonpointnum++;
//	triangulate();
//	CView::OnLButtonDown(nFlags, point);
}

void CTrianglulationView::OnTriangulate() 
{
	// TODO: Add your command handler code here
	triangulate();
}

double CTrianglulationView::AR(int number1, int number2, int number3)
{
    double  d;
	d=abs((mypoint[number1].x-mypoint[number2].x  )*mypoint[number3].y  +(mypoint[number2].y -mypoint[number1].y )*mypoint[number3].x 
		+(mypoint[number2].x *mypoint[number1].y -mypoint[number2].y *mypoint[number1].x ))/((mypoint[number1].x -mypoint[number2].x )*
		(mypoint[number1].x -mypoint[number2].x )+(mypoint[number1].y -mypoint[number2].y )*(mypoint[number1].y -mypoint[number2].y ));
	return  d;
}

void CTrianglulationView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
/*	CDC *pDC=GetDC();
	CString  mystr1,mystr2,mystr;
	mystr1.Format ("%d",point.x);
	mystr2.Format ("%d",point.y );
	mystr="  "+mystr1+","+mystr2;
	pDC->TextOut(point.x ,point.y ,mystr);*/
	CView::OnMouseMove(nFlags, point);
}

double CTrianglulationView::abc(double number1, double number2)
{
    double m;
   m=number1-number2;
   if (m>=0.)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -