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

📄 trianglulationview.cpp

📁 用数值方法做的三角剖分程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				  if (point3x >point4x )
					  if ((x>point1x )&&(x<point2x )&&(x>point4x )&&(x<point3x ))
						  return 1;//相交
					  else
						 return 0;//不相交
			  }
		 }
	 else
	 {
		 if (point3x<point4x )
		 {
			  if ((x>point2x )&&(x<point1x )&&(x>point3x )&&(x<point4x))
				     return 1;//不相交
			      else
				     return 0;//相交
		 }
		  else
		  {
			  if (point3x >point4x )
				  if ((x<point1x )&&(x>point2x )&&(x>point4x )&&(x<point3x ))
                      return 1;//不相交
			      else
				     return 0;//相交
		  }
	 }

}

void CTrianglulationView::canshufuzhi()
{
  /*  canshupoint[0].x =(int)fuzhix(0.,0.);
	canshupoint[0].y =(int)fuzhiy(0.,0.);
	canshupoint[0].z =(int)fuzhiz(0.,0.);

	canshupoint[1].x =(int)fuzhix(0.,0.5);
	canshupoint[1].y =(int)fuzhiy(0.,0.5);
	canshupoint[1].z =(int)fuzhiz(0.,0.5);

    canshupoint[2].x =(int)fuzhix(0.,1.);
	canshupoint[2].y =(int)fuzhiy(0.,1.);
	canshupoint[2].z =(int)fuzhiz(0.,1.);

	canshupoint[3].x =(int)fuzhix(0.5,0.);
	canshupoint[3].y =(int)fuzhiy(0.5,0.);
	canshupoint[3].z =(int)fuzhiz(0.5,0.);

	canshupoint[4].x =(int)fuzhix(0.5,0.5);
	canshupoint[4].y =(int)fuzhiy(0.5,0.5);
	canshupoint[4].z =(int)fuzhiz(0.5,0.5);

	canshupoint[5].x =(int)fuzhix(0.5,1.);
	canshupoint[5].y =(int)fuzhiy(0.5,1.);
	canshupoint[5].z =(int)fuzhiz(0.5,1.);

	canshupoint[6].x =(int)fuzhix(1.,0.);
	canshupoint[6].y =(int)fuzhiy(1.,0.);
	canshupoint[6].z =(int)fuzhiz(1.,0.);

	canshupoint[7].x =(int)fuzhix(1.,0.5);
	canshupoint[7].y =(int)fuzhiy(1.,0.5);
	canshupoint[7].z =(int)fuzhiz(1.,0.5);

	canshupoint[8].x =(int)fuzhix(1.,1.);
	canshupoint[8].y =(int)fuzhiy(1.,1.);
	canshupoint[8].z =(int)fuzhiz(1.,1.);*/

	double    u,v;
	u=0.;
	v=0.;
	int       number=0;
	while (u<=1.)
	{
		while (v<=1.)
		{
           canshupoint[number].x =(int)fuzhix(u,v);
		   canshupoint[number].y =(int)fuzhiy(u,v);
		   canshupoint[number].z =(int)fuzhiz(u,v);
		   v=v+0.25;
		   number++;
		}
		u=u+0.25;
		v=0.;
	}
}

double CTrianglulationView::fuzhix(double u, double v)
{
	double d;
    d =(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));
    return d;
}

double CTrianglulationView::fuzhiy(double u, double v)
{
    double d;
	d =(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));
    return  d;
}

double CTrianglulationView::fuzhiz(double u, double v)
{
	double  d;
    d =(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));
    return d;
}

void CTrianglulationView::developpoint(double u, double v)
{
	CDC  *pDC=GetDC();
    int  tag;
	if ((u<=0.5)&&(v<=0.5))
		tag=1;
	if ((u<=0.5)&&(v>0.5))
		tag=2;
	if ((u>0.5)&&(v<=0.5))
		tag=3;
	if ((u>0.5)&&(v>0.5))
		tag=4;
    double  m,n;
	int     x,y;
	if (tag==1)
	{
		m=2*(u-0.);
		n=2*(v-0.);
		x=(int)(pointxy[0].x*(1-m)*(1-n)+pointxy[1].x*(1-m)*n+pointxy[3].x *m*(1-n)+pointxy[4].x*m*n);
		y=(int)(pointxy[0].y*(1-m)*(1-n)+pointxy[1].y*(1-m)*n+pointxy[3].y *m*(1-n)+pointxy[4].y*m*n);
	    mypoint[pointnum].x =x;
		mypoint[pointnum].y =y;
		pointnum++;
		pDC->SetPixel (x,y,RGB(255,0,0));
	}
    if (tag==2)
	{
        m=2*(u-0.);
		n=2*(v-0.5);
		x=(int)(pointxy[1].x*(1-m)*(1-n)+pointxy[2].x*(1-m)*n+pointxy[4].x *m*(1-n)+pointxy[5].x*m*n);
		y=(int)(pointxy[1].y*(1-m)*(1-n)+pointxy[2].y*(1-m)*n+pointxy[4].y *m*(1-n)+pointxy[5].y*m*n);
		mypoint[pointnum].x =x;
		mypoint[pointnum].y =y;
		pointnum++;
		pDC->SetPixel (x,y,RGB(255,0,0));
	}
	if (tag==3)
	{
        m=2*(u-0.5);
		n=2*(v-0.);
		x=(int)(pointxy[3].x*(1-m)*(1-n)+pointxy[4].x*(1-m)*n+pointxy[6].x *m*(1-n)+pointxy[7].x*m*n);
		y=(int)(pointxy[3].y*(1-m)*(1-n)+pointxy[4].y*(1-m)*n+pointxy[6].y *m*(1-n)+pointxy[7].y*m*n);
		mypoint[pointnum].x =x;
		mypoint[pointnum].y =y;
		pointnum++;
		pDC->SetPixel (x,y,RGB(255,0,0));
	}
	if (tag==4)
	{
        m=2*(u-0.5);
		n=2*(v-0.5);
		x=(int)(pointxy[4].x*(1-m)*(1-n)+pointxy[5].x*(1-m)*n+pointxy[7].x *m*(1-n)+pointxy[8].x*m*n);
		y=(int)(pointxy[4].y*(1-m)*(1-n)+pointxy[5].y*(1-m)*n+pointxy[7].y *m*(1-n)+pointxy[8].y*m*n);
		mypoint[pointnum].x =x;
		mypoint[pointnum].y =y;
		pointnum++;
		pDC->SetPixel (x,y,RGB(255,0,0));
	}

//	CDC   *pDC=GetDC();
//	pDC->SetPixel (x,y,RGB(255,0,0));
}

void CTrianglulationView::OnSelectPoint() 
{
	// TODO: Add your command handler code here
	//CPoint    selpoint[];
	CDC  *pDC=GetDC();
	pDC->MoveTo (200,400);
	pDC->LineTo (400,400);
	pDC->LineTo (400,200);
	pDC->LineTo (200,200);
	pDC->LineTo (200,400);

/*	int   x,y;
	x=300;
	y=200;

	while (y<=360)
	{
		y=y+20;
		pDC->SetPixel (x,y,1);
	}

	x=200;
	y=300;
	while (x<=360)
	{
		x=x+20;
		pDC->SetPixel (x,y,1);
	}
	x=200;
	y=200;
	while (x<=260)
	{
		x=x+20;
		while (y<=260)
		{
			y=y+20;
			pDC->SetPixel (x,y,1);
		}
		y=200;
	}
	x=300;
	y=200;
	while (x<=360)
	{
		x=x+30;
		while (y<=260)
		{
			y=y+30;
			pDC->SetPixel (x,y,1);
		}
		y=200;
	}
	x=200;
	y=300;
	while (x<=260)
	{
		x=x+30;
		while (y<=360)
		{
			y=y+30;
			pDC->SetPixel (x,y,1);
		}
		y=300;
	}
	x=300;
	y=300;
	while (x<=360)
	{
		x=x+20;
		while (y<=360)
		{
			y=y+20;
			pDC->SetPixel (x,y,1);
		}
		y=300;
	}*/
	int  x,y;

	x=200;
	y=200;
	while (x<=400)
	{
        while (y<=400)
		{
			pDC->SetPixel (x,y,RGB(255,0,0));
			mypoint[pointnum].x =x;
			mypoint[pointnum].y =y;
			pointnum++;
			y=y+40;
		}
		x=x+40;
		y=200;
	}
}

int CTrianglulationView::PointIsInside(int number1, int number2, int number3)
{
   int  i=0;
   bool  change1=1,change2=1,change3=1,change=1;
   while ((i<(pointnum))&&(change==1))
   {
	   if ((i!=number1)&&(i!=number2)&&(i!=number3))
	   {
          change1=SameSide(number1,number2,number3,i);
		  change2=SameSide(number1,number3,number2,i);
		  change3=SameSide(number2,number3,number1,i);
		  if ((change1==1)&&(change2==1)&&(change3==1))
		  {
			  change=0;
              return i;//yes
		  }
	   }
	     
			  i++;
   }
   return 0;
}

bool CTrianglulationView::SameSide(int number1, int number2, int number3,int number4)
{
	double b1,b2,b;
	if ((number1==number3)||(number1==number4)||(number2==number3)||(number2==number4))
		return 0;
    b1=(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[number1].x*mypoint[number2].y;
	b2=(mypoint[number1 ].x -mypoint[number2 ].x)*mypoint[number4].y 
	    +(mypoint[number2 ].y -mypoint[number1].y)*mypoint[number4].x
	    +mypoint[number2].x *mypoint[number1].y -mypoint[number1].x*mypoint[number2].y;
	b=b1*b2;
	if (b>=0)
		return 1;//在三角行边上
	else
		return 0;//不在三角行边上
}

void CTrianglulationView::Onuvtriangulation() 
{
	// TODO: Add your command handler code here
	CDC  *pDC=GetDC();

/*	pDC->MoveTo (200,400);
	pDC->LineTo (400,400);
	pDC->LineTo (400,200);
	pDC->LineTo (200,200);
	pDC->LineTo (200,400);*/

/*	x=200;
	y=200;

	while (y<=360)
	{
		y=y+80;
		pDC->SetPixel (x,y,RGB(255,0,0));
		mypoint[pointnum].x =x;
		mypoint[pointnum].y =y;
		pointnum++;
	}

	x=200;
	y=300;
	while (x<=360)
	{
		x=x+80;
		pDC->SetPixel (x,y,RGB(255,0,0));
		mypoint[pointnum].x =x;
		mypoint[pointnum].y =y;
		pointnum++;
	}
	x=200;
	y=200;
	while (x<=260)
	{
		x=x+80;
		while (y<=260)
		{
			y=y+80;
			pDC->SetPixel (x,y,RGB(255,0,0));
			mypoint[pointnum].x =x;
		    mypoint[pointnum].y =y;
		    pointnum++;
		}
		y=200;
	}
	x=300;
	y=200;
	while (x<=360)
	{
		x=x+80;
		while (y<=260)
		{
			y=y+80;
			pDC->SetPixel (x,y,RGB(255,0,0));
			mypoint[pointnum].x =x;
	        mypoint[pointnum].y =y;
		    pointnum++;
		}
		y=200;
	}
	x=200;
	y=300;
	while (x<=260)
	{
		x=x+80;
		while (y<=360)
		{
			y=y+80;
			pDC->SetPixel (x,y,RGB(255,0,0));
			mypoint[pointnum].x =x;
		    mypoint[pointnum].y =y;
		    pointnum++;
		}
		y=300;
	}
	x=300;
	y=300;
	while (x<=360)
	{
		x=x+80;
		while (y<=360)
		{

⌨️ 快捷键说明

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