标签:mil 题目 图片 void 函数 -- .com size html
今天农历28,哈哈明天就能放假过年啦~
都快省选了,才发现自己已经很久没有做过计算几何的题目了,然后匆匆忙忙跑去做了一题很简单的
然后这篇博文就作为一个大杂烩,把这几天做过的计算几何的知识点都丢到里面好了(反正给是给自己看
我习惯用叉积进行排序。
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 }
想象两条平行线绕着一个凸多变形转啊转
具体实现方法其实是在找最大三角形的过程
核心代码:
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