两条线段的位置关系可以大致归类为平行、相交和不平行且不相交,平行又可以分为重合,共线(不重合),部分重合,不平行且不相交的情况为线段所在直线相交,交点在线段外。
我们要判断线段的位置关系以及计算交点的位置关系,需要用到向量的相关知识,即定义两个向量p(x1, y1)和q(x2, y2),向量积系数k=p×q=x1·y2-x2·y1,若k=0则p与q平行,若k>0,则p逆时针旋转到q(这里指旋转角小于180度的情况),若k<0,则p顺时针旋转到q(相关推导请参考游戏中两个常用的数学运算推导及算法推论 中关于向量积的推导和推论)。
如下图,现在有4个点A(x1, y1)、B(x2, y2)、C(x3,y3)、D(x4, y4),若线段AB和CD存在交点,则设其交点为E(x, y),向量AB记为p1(dx1,dy1),向量CD记为p2(dx2, dy2),向量AC记为p3(dx3, dy3),如下图所示:
我们根据向量积系数为0来判断向量是否平行,即由如下算法:
float k = x1·y2-x2·y1;
if (k == 0) {