判断两点连线是否与线段相交,判断两点是否在线段两边

https://blog.csdn.net/tengchongwei/article/details/72922056

1、如图a(x1,y1) b(x2,y2) c(x3,y3) d(x4,y4)

判断c,d是否在线段两端,只需要判断ad和ac的斜率一个比ab的斜率大 另一个比ab的斜率小就行了。判断c在直线ab的上方和判断d在直线ab的下方或者向量是否跨立,最终化简后也可以归根于判断斜率问题。

1、使用链接中的方式,先判断线段的bound是否会相交,加快排除过程再进行如下操作。

2、判断C、D与直线ab的关系

bool value = false;
if((y3-y2)/(x3-x2)<(y2-y1)/(x2-x1))
    value = ! value;
if(y4-y2)/(x4-x2)<(y2-y1)/(x2-x1))
    value = ! value;
return value;

可将除法转换为乘法
bool value = false;
if((y3-y2)*(x2-x1)<(y2-y1)*(x3-x2))
    value = ! value;
if(y4-y2)*(x2-x1)<(y2-y1)*(x4-x2))
    value = ! value;
return value;

3、再按同样的步骤判断A、B与直线cd的关系。

如果最终返回true ,则定会相交

求交点:http://www-cs.ccny.cuny.edu/~wolberg/capstone/intersection/Intersection%20point%20of%20two%20lines.html

这种方式比较快,将 除法次数降到1

猜你喜欢

转载自blog.csdn.net/qiushangren/article/details/82782220