关于凸包:grahman scan

来源:互联网 发布:织梦cookies 编辑:程序博客网 时间:2024/05/21 19:27
二维凸包问题(其实还有三维的,但是这里不做研究)是一类关于一个平面上有n个点,让你连接最少的点使给出的所有点在被划定的区域里。如图1:Figure1,这就是一个最优的解。
下面我们开始介绍求解方法之一:graham  scan、。
        首先我们得知道两个有相同起点的矢量(假设p1-->p2,   p1-->p3)的叉积的正负(叉积公式:(p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))可以代表矢量一是在矢量二的顺时针或逆时针方向。那么根据这个性质,我们可以先从上图取三个点:BG E  B-->G,E-->G调整成B-->G时我们只需要判断一下这两个矢量:B-->E   E-->G的叉积就行了
       理解了这些我们就可以开始接下来的讨论了我们可以对于每一个顶点进行比较,然后得出结论。当然我们可以确定处在最左下的点一定会被取到。那我们把这个当作起点,一个点一个点向外扩张。当然扩张前我们需要对其他点对于以起点为原点x轴的角度先排序,这样就可以保证每一次我们取得点是有序的。
      代码如下:

   #include
#include 
using namespace std;

struct p {
 int x,y;
};
p point [1001];
int n;
p beginn;

int rnd(p beginn,p x,p y)
 {
  return(x.x-beginn.x)*(y.y-beginn.y)-(y.x-beginn.x)*(x.y-beginn.y);
 }

void kp(int x,int y)
{
int i,j;
p k,l;
i=x;j=y;k=point[(x+y)/2];
while(i<=j)
 {
 while(rnd(beginn,point[i],k)<0)i++;
 while(rnd(beginn,point[j],k)>0)j--;
  if(i<=j)
  {
 l=point[i];point[i]=point[j];point[j]=l;
  i++;j--;
  }
 
 }
if(i
 if(j>x)kp(x,j);
}

p line[10001];
int main()
{
int i,j=1,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
 {
 scanf("%d%d",&point[i].x,&point[i].y);
     if(point[j].x>point[i].x||(point[j].x==point[i].x&&point[j].y>point[i].y))
            j=i;
 }
 beginn=point[j];
 point[j]=point[n];
 kp(1,--n);
 
 
 line[1]=beginn;
 line[2]=point[1];
 line[3]=point[2];
 int tail=3;
 for(i=3;i<=n;i++) 
        {
         if(tail<3)
         line[++tail]=point[i];
         else  
           {
           while(rnd(line[tail-1],line[tail],point[i])>=0&&tail!=0)
             tail--;
           line[++tail]=point[i];
               
}
}
 
printf("%d\n",tail);
for(i=1;i<=tail;i++)
 printf("%d:%d%d\n",i,line[i].x,line[i].y);
}


由于本人只用了几个数据来验证代码正确性,所以代码可能有点问题,欢迎各路大神来指点
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 凯恩帝数控超程报警怎么办 凯恩帝数控车床x向超程怎么办 别人问你借账号怎么办 微信成夜间模式怎么办 网络电视突然黑屏了怎么办 1adac连接线坏了怎么办 4g的标志没有了怎么办 苹果手机亏电了怎么办 苹果手机亏电了充不进电怎么办 比值审敛法 ρ=1怎么办 比值审敛法中p=1怎么办 电脑被老友重装系统搞坏了怎么办 vivo手机听筒声音小怎么办 小孩调皮幼儿园不收怎么办 小孩听力残疾幼儿园不收怎么办 幼儿园不收外省小孩怎么办 孩子刚上幼儿园哭闹老师怎么办 孕妇糖耐指标高怎么办 貂蝉经常没蓝怎么办 儿童声导抗c型怎么办 酱牛肉不烂怎么办拯救 卤牛肉一切就碎怎么办 牛肉煮的太烂了怎么办 牛肉卤的太烂怎么办 牛肉炖得太软怎么办 牛肉炖的很硬怎么办 牛肉做的有点硬怎么办 牛肉做老了还能怎么办 牛肉粒 炒老了怎么办 牛肉炖出来很硬怎么办 煮的牛肉太硬怎么办 在产蛋鸡体重偏轻怎么办 产蛋鸡不上高峰怎么办 蛋鸡天热下蛋少怎么办 成年鸡嗉子鼓涨怎么办 黄牛拼失败了钱怎么办 磁力泥粘衣服上怎么办 鼻涕泥弄衣服上怎么办 水晶橡皮泥弄在衣服上怎么办 橡皮泥弄到衣服上怎么办 橡皮泥弄在衣服上怎么办