计算几何 大杂烩

Posted hlauv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算几何 大杂烩相关的知识,希望对你有一定的参考价值。

今天农历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 } 

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

 

以上是关于计算几何 大杂烩的主要内容,如果未能解决你的问题,请参考以下文章

分享几个实用的代码片段(第二弹)

计算光栅化片段的数量

计算片段着色器内平面的法线

如果几何着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

分享几个实用的代码片段(附代码例子)

分享几个实用的代码片段(附代码例子)