线段判定相交(规范相交)
2018-06-11 本文已影响0人
laochonger
可以用线段的两点式求出线性规划,代入另外两点
但鉴于代码风格的统一性,这里还是使用书上使用向量外积进行判断的代码,两种方法本质上是一样的,都是分别以一条边为标准(所以需要判断两次),判断另外两个点是否在该边的两侧。
bool segmentpropersection(Point a1, Point a2, Point b1, Point b2){
double c1 = Cross(a2-a1, b1-a1), c2 = Cross(a2-a1, b2-a1),
c3 = Cross(b2-b1, a1-b1), c4 = Cross(b2-b1, a2-b1);
return dcmp(c1)*dcmp(c2)<0 && dcmp(c3)*dcmp(c4) < 0;
}
如果允许出现在端点处呢?那就需要再进一步的讨论:
如果c1,c2都等于0,则两线段共线,有可能部分重叠;若不都为0,则必然只有一种相交情况,即某个端点再另一条线段上,用如下代码进行判断(不含端点,因为端点重合的话可以直接看出来...):
bool onsegment(Point P, Point a1, Point a2){
return dcmp(Cross(a1-P, a2-P)) == 0 && dcmp(Dot(a1-P, a2-P)) < 0;
//第一个条件用来判断点在直线上,第二个条件用来判断点在被两天垂足为AB端点的直线围成的区域内
//合在一起用来判断点在线段上
}