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

📄 voronoidoc.cpp

📁 一个很不错的求Voronoi线与最小凸壳的vc++源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   LineStruct* Line;
   Line=new LineStruct;
   ZCX(&PointList[0],&PointList[1],Line);
   LineList[0].x1=Line->x1;
   LineList[0].y1=Line->y1;
   LineList[0].x2=Line->x2;
   LineList[0].y2=Line->y2;
   LineList[0].Point1=&PointList[0];
   LineList[0].Point2=&PointList[1];
   LineList[0].exist=TRUE;
   ZCX(&PointList[1],&PointList[2],Line);
   LineList[1].x1=Line->x1;
   LineList[1].y1=Line->y1;
   LineList[1].x2=Line->x2;
   LineList[1].y2=Line->y2;
   LineList[1].Point1=&PointList[1];
   LineList[1].Point2=&PointList[2];
   LineList[1].exist=TRUE;
   Point=intersect(&LineList[0],&LineList[1]);
   ZCX(&PointList[0],&PointList[2],Line);
   LineList[2].x1=Line->x1;
   LineList[2].y1=Line->y1;
   LineList[2].x2=Line->x2;
   LineList[2].y2=Line->y2;
   LineList[2].Point1=&PointList[0];
   LineList[2].Point2=&PointList[2];
   LineList[2].exist=TRUE;
   if(RZDJ(&PointList[0],&PointList[2],&PointList[1])==1)
   {
	   if(IntersectOrNot(Point->x,Point->y,LineList[0].x1,LineList[0].y1,
		   PointList[0].x,PointList[0].y,PointList[1].x,PointList[1].y))
	   {
		    LineList[0].x2=Point->x;
			LineList[0].y2=Point->y;
	   }
	   else
	   {
            LineList[0].x1=Point->x;
			LineList[0].y1=Point->y;
	   }
   }
   else if(RZDJ(&PointList[0],&PointList[2],&PointList[1])==2)
   {
        if(IntersectOrNot(Point->x,Point->y,LineList[0].x1,LineList[0].y1,PointList[1].x,
			PointList[1].y,PointList[2].x,PointList[2].y)||IntersectOrNot(Point->x,Point->y,
			LineList[0].x1,LineList[0].y1,PointList[0].x,PointList[0].y,PointList[2].x,PointList[2].y))
		{
             LineList[0].x1=Point->x;
			 LineList[0].y1=Point->y;
		}
	    else
		{
             LineList[0].x2=Point->x;
			 LineList[0].y2=Point->y;
	   }
   }
   else if(RZDJ(&PointList[0],&PointList[2],&PointList[1])==3)
   {
	   if(IntersectOrNot(Point->x,Point->y,LineList[0].x1,LineList[0].y1,PointList[0].x,
		   PointList[0].y,PointList[1].x,PointList[1].y))
		{
		     LineList[0].x1=Point->x;
			 LineList[0].y1=Point->y;
		}
		else
		{
             LineList[0].x2=Point->x;
			 LineList[0].y2=Point->y;
		}
   }
   if(RZDJ(&PointList[1],&PointList[0],&PointList[2])==1)
   {
	   if(IntersectOrNot(Point->x,Point->y,LineList[1].x1,LineList[1].y1,PointList[1].x,
		   PointList[1].y,PointList[2].x,PointList[2].y))
	   {
		    LineList[1].x2=Point->x;
			LineList[1].y2=Point->y;
	   }
	   else
	   {
            LineList[1].x1=Point->x;
			LineList[1].y1=Point->y;
	   }
   }
   else if(RZDJ(&PointList[1],&PointList[0],&PointList[2])==2)
   {
        if(IntersectOrNot(Point->x,Point->y,LineList[1].x1,LineList[1].y1,PointList[0].x,
			PointList[0].y,PointList[2].x,PointList[2].y)||IntersectOrNot(Point->x,Point->y,
			LineList[1].x1,LineList[1].y1,PointList[0].x,PointList[0].y,PointList[1].x,PointList[1].y))
		{
             LineList[1].x1=Point->x;
			 LineList[1].y1=Point->y;
		}
	    else
		{
             LineList[1].x2=Point->x;
			 LineList[1].y2=Point->y;
	   }
   }
   else if(RZDJ(&PointList[1],&PointList[0],&PointList[2])==3)
   {
	   if(IntersectOrNot(Point->x,Point->y,LineList[1].x1,LineList[1].y1,PointList[1].x,
		   PointList[1].y,PointList[2].x,PointList[2].y))
		{
		     LineList[1].x1=Point->x;
			 LineList[1].y1=Point->y;
		}
		else
		{
             LineList[1].x2=Point->x;
			 LineList[1].y2=Point->y;
		}
   }
   if(RZDJ(&PointList[0],&PointList[1],&PointList[2])==1)
   {
	   if(IntersectOrNot(Point->x,Point->y,LineList[2].x1,LineList[2].y1,PointList[0].x,
		   PointList[0].y,PointList[2].x,PointList[2].y))
	   {
		    LineList[2].x2=Point->x;
			LineList[2].y2=Point->y;
	   }
	   else
	   {
            LineList[2].x1=Point->x;
			LineList[2].y1=Point->y;
	   }
   }
   else if(RZDJ(&PointList[0],&PointList[1],&PointList[2])==2)
   {
        if(IntersectOrNot(Point->x,Point->y,LineList[2].x1,LineList[2].y1,PointList[0].x,
			PointList[0].y,PointList[1].x,PointList[1].y)||IntersectOrNot(Point->x,Point->y,
			LineList[2].x1,LineList[2].y1,PointList[1].x,PointList[1].y,PointList[2].x,PointList[2].y))
		{
             LineList[2].x1=Point->x;
			 LineList[2].y1=Point->y;
		}
	    else
		{
             LineList[2].x2=Point->x;
			 LineList[2].y2=Point->y;
	   }
   }
   else if(RZDJ(&PointList[0],&PointList[1],&PointList[2])==3)
   {
	   if(IntersectOrNot(Point->x,Point->y,LineList[2].x1,LineList[2].y1,PointList[0].x,
		   PointList[0].y,PointList[2].x,PointList[2].y))
		{
		     LineList[2].x1=Point->x;
			 LineList[2].y1=Point->y;
		}
		else
		{
             LineList[2].x2=Point->x;
			 LineList[2].y2=Point->y;
		}
   }
}

int CVoronoiDoc::FourPointVoronoi(PointStruct *PointList1,LineStruct* LineList)
{
   int i,j=3,id=0,in[2];
   double x,y;
   PointStruct* JPoint;
   static PointStruct* PointList;
   PointStruct JPoint1;
   PointStruct* Point;
   LineStruct* Line;
   LineStruct* Line1;
   PointList=new PointStruct[4];
   Line=new LineStruct;
   Line1=new LineStruct;
   for(i=0;i<4;i++)
   {
	   PointList[i].x=PointList1[i].x;
	   PointList[i].y=PointList1[i].y;
   }
   do
   {
	   ZCX(&PointList[0],&PointList[1],Line);
       ZCX(&PointList[1],&PointList[2],Line1);
	   Point=intersect(Line,Line1);
	   if(distance(PointList[3].x,PointList[3].y,Point->x,Point->y)<=distance(PointList[0].x,
		  PointList[0].y,Point->x,Point->y))
	   {
		   x=PointList[0].x;
		   y=PointList[0].y;
		   for(i=0;i<3;i++)
		   {
			   PointList[i].x=PointList[i+1].x;
			   PointList[i].y=PointList[i+1].y;
		   }
		   PointList[3].x=x;
		   PointList[3].y=y;
	   }
	   else
		   break;
   }while(1);
   TriangularVoronoi(PointList,LineList);
   Point->x=((PointList[0].x+PointList[1].x)/2+PointList[2].x)/2;
   Point->y=((PointList[0].y+PointList[1].y)/2+PointList[2].y)/2;
   for(i=0;i<3;i++)
   {
	  if(!same(Point->x,Point->y,PointList[3].x,PointList[3].y,PointList[i].x,PointList[i].y,
      PointList[(i+1)%3].x,PointList[(i+1)%3].y))
	     in[id++]=i;
   }
   if(id==2&&in[0]==0&&in[1]==2)
   {
      in[0]=2;
	  in[1]=0;
   }
   i=in[0];
   ZCX(&PointList[i],&PointList[3],Line);
   JPoint=intersect(Line,&LineList[i]);
   LineList[3].x1=Line->x1;
   LineList[3].y1=Line->y1;
   LineList[3].x2=Line->x2;
   LineList[3].y2=Line->y2;
   LineList[3].Point1=&PointList[i];
   LineList[3].Point2=&PointList[3];
   LineList[3].exist=TRUE;
   if(LineList[i].x1==-(1e+5)||LineList[i].x1==1e+5||LineList[i].y1==-(1e+5)||LineList[i].y1==1e+5)
   {
      LineList[i].x1=JPoint->x;
      LineList[i].y1=JPoint->y;
   }
   if(LineList[i].x2==-(1e+5)||LineList[i].x2==1e+5||LineList[i].y2==-(1e+5)||LineList[i].y2==1e+5)
   {
      LineList[i].x2=JPoint->x;
      LineList[i].y2=JPoint->y;
   }
   if(distance(PointList[i].x,PointList[i].y,LineList[3].x1,LineList[3].y1)<distance(PointList[(i+1)%3].x,
	  PointList[(i+1)%3].y,LineList[3].x1,LineList[3].y1)&&distance(PointList[i].x,PointList[i].y,
	  LineList[3].x1,LineList[3].y1)<distance(PointList[(i+2)%3].x,PointList[(i+2)%3].y,LineList[3].x1,
	  LineList[3].y1))
   {
	  LineList[3].x2=JPoint->x;
      LineList[3].y2=JPoint->y;
   }
   else
   {
      LineList[3].x1=JPoint->x;
      LineList[3].y1=JPoint->y;
   }
   if(id==1)
   { 
      ZCX(&PointList[(i+1)%3],&PointList[3],Line);
	  LineList[4].x1=Line->x1;
      LineList[4].y1=Line->y1;
      LineList[4].x2=Line->x2;
      LineList[4].y2=Line->y2;
      LineList[4].Point1=&PointList[(i+1)%3];
	  LineList[4].Point2=&PointList[3];
      LineList[4].exist=TRUE;
	  if(distance(PointList[(i+1)%3].x,PointList[(i+1)%3].y,LineList[4].x1,LineList[4].y1)
		 <distance(PointList[(i+2)%3].x,PointList[(i+2)%3].y,LineList[4].x1,LineList[4].y1)&&
		 distance(PointList[(i+1)%3].x,PointList[(i+1)%3].y,LineList[4].x1,LineList[4].y1)<
		 distance(PointList[i].x,PointList[i].y,LineList[4].x1,LineList[4].y1))
	  {
	     LineList[4].x2=JPoint->x;
         LineList[4].y2=JPoint->y;
	  }
      else
      {
         LineList[4].x1=JPoint->x;
         LineList[4].y1=JPoint->y;
	  }
	  return 5;
	}
   else
   {
      JPoint1.x=JPoint->x;
	  JPoint1.y=JPoint->y;
	  ZCX(&PointList[(i+2)%3],&PointList[3],Line);
	  i=in[1];
      JPoint=intersect(Line,&LineList[i]);
	  if(LineList[i].x1==-(1e+5)||LineList[i].x1==1e+5||LineList[i].y1==-(1e+5)||LineList[i].y1==1e+5)
	  {
         LineList[i].x1=JPoint->x;
         LineList[i].y1=JPoint->y;
	  }
      if(LineList[i].x2==-(1e+5)||LineList[i].x2==1e+5||LineList[i].y2==-(1e+5)||LineList[i].y2==1e+5)
	  {
         LineList[i].x2=JPoint->x;
         LineList[i].y2=JPoint->y;
	  }
      LineList[4].x1=Line->x1;
      LineList[4].y1=Line->y1;
      LineList[4].x2=Line->x2;
      LineList[4].y2=Line->y2;
	  LineList[4].Point1=&PointList[(i+1)%3];
	  LineList[4].Point2=&PointList[3];
      LineList[4].exist=TRUE;
	  if(distance(PointList[(i+1)%3].x,PointList[(i+1)%3].y,LineList[4].x1,LineList[4].y1)
		 <distance(PointList[(i+2)%3].x,PointList[(i+2)%3].y,LineList[4].x1,LineList[4].y1)&&
		 distance(PointList[(i+1)%3].x,PointList[(i+1)%3].y,LineList[4].x1,LineList[4].y1)<
		 distance(PointList[i].x,PointList[i].y,LineList[4].x1,LineList[4].y1))
	  {
	     LineList[4].x2=JPoint->x;
         LineList[4].y2=JPoint->y;
	  }
      else
      {
         LineList[4].x1=JPoint->x;
         LineList[4].y1=JPoint->y;
	  }
	  LineList[5].x1=JPoint1.x;
	  LineList[5].y1=JPoint1.y;
	  LineList[5].x2=JPoint->x;
	  LineList[5].y2=JPoint->y;
      LineList[5].Point1=&PointList[i];
	  LineList[5].Point2=&PointList[3];
      LineList[5].exist=TRUE;
      return 6;
   }
}
double CVoronoiDoc::distance(double x1, double y1, double x2, double y2)
{
    double s;
	s=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
	return s;
}
int CVoronoiDoc::ZX(int n, int j, int k, LineStruct *LineList,PointStruct* PointList)
{
    int i,num1,num2,m,s=0,ida1=0,idb1=0,idak=0,idbk=0;
	double t;
	PointStruct* PointList1;
	PointStruct* PointList2;
	PointStruct* Point;
	PointStruct* Point1;
	PointStruct* Point2;
	LineStruct* Line;
	Line=new LineStruct;
    PointList1=ConstructProtrude(PointList,n/2)->GetPointList();
    num1=ConstructProtrude(PointList,n/2)->GetPointNumber();
	for(i=1;i<num1;i++)
	{
		if(PointList1[ida1].y<PointList1[i].y)
		   ida1=i;
        if(PointList1[idak].y>PointList1[i].y)
		   idak=i;
	}
	PointList2=ConstructProtrude(PointList+n/2,n-n/2)->GetPointList();
    num2=ConstructProtrude(PointList+n/2,n-n/2)->GetPointNumber();
    for(i=1;i<num2;i++)
	{
        if(PointList2[idb1].y<PointList2[i].y)
		   idb1=i;
        if(PointList2[idbk].y>PointList2[i].y)
		   idbk=i;
	}
	Point1=&PointList1[ida1];
	Point2=&PointList2[idb1];
	while(!((Point1->x==PointList1[idak].x&&Point1->y==PointList1[idak].y&&Point2->x==PointList2[idbk].x
		   &&Point2->y==PointList2[idbk].y)||(Point1->x==PointList2[idbk].x&&Point1->y==PointList2[idbk].y
		   &&Point2->x==PointList1[idak].x&&Point2->y==PointList1[idak].y)))
	{
		ZCX(Point1,Point2,Line);
		t=0;
		if(s==0)
		{
			if(Line->y2>Line->y1)
			{
		        LineList[j+k].x1=Line->x2;
		        LineList[j+k].y1=Line->y2;
			}
	        else
			{
		        LineList[j+k].x1=Line->x1;
		        LineList[j+k].y1=Line->y1;
			}
			LineList[j+k+s].Point1=&PointList1[ida1];
            LineList[j+k+s].Point2=&PointList2[idb1];
		}
	    for(i=0;i<j+k;i++)
		{
			if(LineList[i].exist==TRUE&&((LineList[i].Point1->x==Point1->x&&LineList[i].Point1->y
				==Point1->y)||(LineList[i].Point1->x==Point2->x&&LineList[i].Point1->y==Point2->y)
				||(LineList[i].Point2->x==Point1->x&&LineList[i].Point2->y==Point1->y)||
				(LineList[i].Point2->x==Point2->x&&LineList[i].Point2->y==Point2->y))&&
				(IntersectOrNot(Line->x1,Line->y1,Line->x2,Line->y2,LineList[i].x1,LineList[i].y1,
				 LineList[i].x2,LineList[i].y2)))
			{
			    if((int)(intersect(Line,&LineList[i])->y)<(int)(LineList[j+k+s].y1)&&intersect(Line,&LineList[i])->y>t)
				{
				     Point=intersect(Line,&LineList[i]);
		             t=Point->y;
				     m=i;
				}
			}
		}
	    LineList[j+k+s].x2=Point->x;
	    LineList[j+k+s].y2=Point->y;
	    LineList[j+k+s].exist=TRUE;
		LineList[j+k+s+1].x1=Point->x;
	    LineList[j+k+s+1].y1=Point->y;
        if(LineList[m].Point1->x==Point1->x||LineList[m].Point2->x==Point1->x)
		{
			if(!same(Point1->x,Point1->y,LineList[m].x1,LineList[m].y1,Line->x1,Line->y1,Line->x2,Line->y2))
			{
			    LineList[m].x1=Point->x;
		        LineList[m].y1=Point->y;
			}
			else
			{
                LineList[m].x2=Point->x;
		        LineList[m].y2=Point->y;
			}
			if(LineList[m].Point1->x==Point1->x)
			{
        		Point1=LineList[m].Point2;
				LineList[j+k+s+1].Point1=LineList[m].Point2;
				LineList[j+k+s+1].Point2=LineList[j+k+s].Point2;
			}
			else
			{
				Point1=LineList[m].Point1;
				LineList[j+k+s+1].Point1=LineList[m].Point1;
				LineList[j+k+s+1].Point2=LineList[j+k+s].Point2;
			}
		}
        else 
		{
            if(!same(Point2->x,Point2->y,LineList[m].x1,LineList[m].y1,Line->x1,Line->y1,Line->x2,Line->y2))
			{
			    LineList[m].x1=Point->x;
		        LineList[m].y1=Point->y;
			}
			else
			{
                LineList[m].x2=Point->x;
		        LineList[m].y2=Point->y;
			}
            if(LineList[m].Point1->x==Point2->x)
			{
                Point2=LineList[m].Point2;
				LineList[j+k+s+1].Point2=LineList[m].Point2;
				LineList[j+k+s+1].Point1=LineList[j+k+s].Point1;
			}
		    else
			{
                Point2=LineList[m].Point1;
				LineList[j+k+s+1].Point2=LineList[m].Point1;
				LineList[j+k+s+1].Point1=LineList[j+k+s].Point1;
			}
		}
        s++;
	}
	ZCX(Point1,Point2,Line);
	if(Line->y2>Line->y1)
	{
		LineList[j+k+s].x2=Line->x1;
		LineList[j+k+s].y2=Line->y1;
	}
	else
	{
		LineList[j+k+s].x2=Line->x2;
		LineList[j+k+s].y2=Line->y2;
	}
	LineList[j+k+s].exist=TRUE;
    for(i=0;i<j;i++)
	{
		if(LineList[i].x1>700||LineList[i].x2>700)
		{
			LineList[i].exist=FALSE;
		}
	}
	for(i=j;i<j+k;i++)
	{
		if(LineList[i].x1<0||LineList[i].x2<0)
		{
            LineList[i].exist=FALSE;
		}
	}
	return  s+1;
}

⌨️ 快捷键说明

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