计算几何-通过叉积判断向量旋转方向

今天刷cf的时候看到一道凸包的裸(其实并不裸)题。但是我发现我不会求凸包,所以我就是学习了一下Graham扫描法。学到一半发现我不会判断向量的旋转方向,于是我又去学习了一下叉乘。作为蒟蒻的我看了半天看不懂,所以我决定写一个连我这样的蒟蒻都能看得懂的便于理解的指北(雾)。

先上结论:对于两根向量a(x1,y1),b(x2,y2),如果a X b = x1*y2-x2*y1<0,那么顺时针转,反之逆时针转。

先求表达式,首先我们有定义 a X b = |a| * |b| * sin< a,b >
ij为一组互相垂直的基向量,不妨令他们分别于x,y轴平行,那么有:

a X b = (x1* i + y1* j) * (x2* i + y2* j)

展开,化简得(由sin0=0,有i X i = 0):

(x1* i + y1* j) * (x2* i + y2* j)= (x1*y2 * i X j) + (x2*y1 * j X i)

由sin< a,b > = - sin< b,a >,有

(x1*y2 * i X j) + (x2*y1 * j X i) = x1*y2-x2*y1

即:

a X b = x1*y2-x2*y1

然后我们会发现,x1表示向量a向右走的倾向,y2表示向量b向上走的倾向。考虑到a,b地位是等价的,价值是相反的,可以认为y2表示向量a向下走的倾向。我们不管说先向右再向下,还是先向下再向右,都可以描述为一种顺时针运动的倾向,我们定义x1*y2为向量a的顺势。那么对应的,不难得出x2*y1为向量b的顺势

方便起见,我们定义CWi为向量i的顺势。

因为向量a插在向量b的尾巴上,所以如果CWb>CWa,说明b比a顺时针运动的倾向大,所以b是在a的基础上向右偏转了,vice verse。

有了这个旋转方向的判断之后,就可以确定下一个点是在前面的边的左边还是右边了。呢。

猜你喜欢

转载自blog.csdn.net/qq_42778110/article/details/81567954