码迷,mamicode.com
首页 > 其他好文 > 详细

计算几何 大杂烩

时间:2019-02-02 18:51:01      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:mil   题目   图片   void   函数   --   .com   size   html   

今天农历28,哈哈明天就能放假过年啦~

都快省选了,才发现自己已经很久没有做过计算几何的题目了,然后匆匆忙忙跑去做了一题很简单的 

1069: [SCOI2007]最大土地面积

然后这篇博文就作为一个大杂烩,把这几天做过的计算几何的知识点都丢到里面好了(反正给是给自己看

 


 

极角排序

我习惯用叉积进行排序。

cmp函数里,先按象限来排,同象限的用叉积比较谁在谁的逆时针方向,如果在同一条直线上,比较横坐标。

技术图片向量的运算什么的用重载运算符什么的比较方便吧。

 

 1 int Xx(P a){
 2     if(a.x-O.x>0 &&a.y-O.y>=0)return 1;
 3     if(a.x-O.x<=0&&a.y-O.y>0 )return 2;
 4     if(a.x-O.x<0 &&a.y-O.y<=0)return 3;
 5     if(a.x-O.x>=0&&a.y-O.y<0 )return 4;
 6 }
 7 bool cmp(const P a,const P b){
 8     int aX=Xx(a);
 9     int bX=Xx(b);
10     if(aX!=bX)return aX<bX;
11     double cx= (a-O)*(b-O);
12     if(cx==0)return a.x<b.x;
13     else return cx>0;
14 }

 

凸包

 凸包也比较基础吧,用一个栈来维护,每次叉积来判逆时针,顺时针,按排好的极角顺序就可以了。

技术图片

叉积为正->逆时针

叉积为负->顺时针

1 void TuBao(){
2     st[++top]=p[1];
3     st[++top]=p[2];
4     For(i,3,n+1){
5         while( (p[i]-st[top-1])*(st[top]-st[top-1])>=0 ) top--;
6         st[++top]=p[i];
7     }
8 }

 

 

旋转卡(qia)壳

技术图片

想象两条平行线绕着一个凸多变形转啊转

具体实现方法其实是在找最大三角形的过程

 技术图片

核心代码:

1 Ni=(i1+1)%top; 
2 Np=st[Ni];
3 while(Ni!=x&&(Np-st[y])*(st[x]-st[y])>(p1-st[y])*(st[x]-st[y])){
4     i1=Ni; p1=Np;     
5     Ni=(i1+1)%top; Np=st[Ni];
6 } 

(先这样,会回来补充的~)

 

计算几何 大杂烩

标签:mil   题目   图片   void   函数   --   .com   size   html   

原文地址:https://www.cnblogs.com/HLAUV/p/10348740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!