判断平面上的点与有向线段的位置关系是计算几何里面的最基本的问题,求解该问题的算法主要运用在凸壳的构造方面,如三角形,凸多变形的构造。网上最流行的两种判别方法是面积法和向量法,但这两种方法本质上是一样的。都是利用二维向量的叉乘等于三个点组成的三角形的“面积”的两倍来计算,这里的“面积”是一个有正有负的数值,我们刚好可以用这个值来判断点在线段的左边还是右边,比如有P1,P2两个点构成一条有向线段P1P2,我们要做的是判断点P在P1P2的左边还是右边,
设向量V1=P1P2=(x1,y1), V2=PP1=(x2,y2),
则”面积”f=x1y2-x2y1.
若f>0则点P在P1P2的右侧;
若f<0,则点P在P1P2的左侧;
若f=0,则点P在P1P2的延长线上。
C++代码如下:
#define Vsub(D,A,B) D.x=A.x-B.x; D.y=A.y-B.y
struct vertex
{
float x;
float y;
};
float Isleft(vertex p1, vertex p2, vertex p)
{
vertex V1, V2;
Vsub(V1,p1,p2);
Vsub(V2, p, p1);
float f = V1.x*V2.y - V2.x*V1.y;
return f;
}