计算几何之叉乘和极角排序

迫于队伍需要,蒻最近几天一直在刷计算几何的入门,做了两天,10道题,对叉乘的使用有了一定的了解,当初为了叉乘的知识点,可是找了很多的资料,但一直没有自己满意的,现在有点总结,希望各位菊苣能够给予指点。

首先,向量的两种运算,叉乘和点乘,例如向量A(X1,Y1),B(X2,Y2);

叉乘:A×B=(X1*Y2)-(X2*Y1)=|A|*|B|*sinθ

点乘:A·B=(X1*X2)+(Y1*Y2)=|A|*|B|*cosθ

这里着重开始讲解叉乘的作用:

一:叉乘可以判断一个点和一条线段的关系:

例如点A(X1,Y1),线段用向量点B(X2,Y2)和点C(X3,Y3)表示。

令函数Cross(A,B,C)为叉乘运算;令flag=Cross(A,B,C),则有flag=(X1-X3)*(Y2-Y3)-(X2-X3)*(Y1-Y3);

当flag>0的时候,点A在线段BC的右边;因为向量AC在向量BC的顺时针方向

当flag=0的时候,点A在直线BC上。这里是直线,不是线段,说明A也可能在线段BC的延长线上;

当flag<0的时候,点A在线段BC的左边;因为向量AC在向量BC的逆时针方向


二:叉乘可以判断线段与线段的关系:

这里用到的原理与判断点和线段的关系的原理类似:当两个点在一条线段的两边时,必然会有flag1*flag2<0;那么由于这里是判断线段和线段的关系,那么就必然要判断线段A

的两个端点在线段B的两边,同时线段B的两个端点也在线段A的两边,当满足这两个关系的时候,就可以说明两条线段相交。在上边的方法之前还有一个步骤是快速排斥实验,

就是分别以A和B为对角线做矩形,当两个矩形不相交的时候,说明两条线段不相交,但是这里的局限性个人感觉比较大,因为只能唯一判断两条直线不相交的情况,这其中的

对于叉乘的一个补充就是,我们可以判断两条线段刚好端点相交的情况。对于叉乘的定义,我们可以知道叉乘是通过角度来判断位置关系,这也就为什么出现了 一 中flag=0的

多种情况。那么既然是通过角度的话,当满足两条线段刚好端点相交的时候,通过叉乘,我们知道是0*flag<0,这里是不满足相交的情况的,但是这又是确确实实的端点相交。

所以这时候快速排斥实验就排上用场了,另外,特判端点相交的情况的时候,我们也可以通过一个定理:若A点在线段BC上,那么必定存在|AB|+|AC|=|BC|,这个方法和快速排

斥实验的用处是一样的。


另外补充一下极角排序(犄角排序),这里也是通过叉乘值的正负来判断的,因为线段A和线段B比较,最终结果必然是A在B的某一端或者A与B共线,当A与B共线的时候,那么也就可以通过判断距离来分清共线情况了。

代码什么时候有空再补充了,网络上也有点多代码,这里补充基础知识,计算几何系列持续更新。TO BE CONTINUED.......

你可能感兴趣的:(ACM_计算几何)