《算法问题实战策略》-chaper15-计算几何-线段相交
这篇文章着力来讨论线段相交这一个问题。
给出两条线段,如何判断这两条线段相交?
如果这两条线段相交,如何求其交点?
线段相交问题通常由于其繁杂的情况种类而让人避而远之,在这里希望通过笔者的简化讨论希望帮读者的思路进行一下梳理。
首先我们尝试画几个几何图像来找一下线段相交的一些不同的情况,这里需要注意,可能有读者会好奇,这些直观上来看没什么差别的相交情况,我们为什么为认为他们是不同的呢?答案是,这里我们需要将几何特征用代数表达是进行判断,因此不同的几何特征虽然都表示线段相交,但是对应的代数表达式不一定相同。
简单的函数代码如下:
//一般情况线段相交的判断 bool SegmentIntersects(Point a1 , Point a2 , Point b1 , Point b2) { double c1 = Cross(a2-a1 , b1-a1); double c2 = Cross(a2-a1 , b2-a1); double c3 = Cross(b2-b1 , a1-b1); double c4 = Cross(b2-b1 , a2-b1); if(dcmp(c1)*dcmp(c2) == 0 && dcmp(c3)*dcmp(c4) == 0) { if(OnSegment(Point a1 , Point b1 ,Point b2) || OnSegment(Point a2 , Point b1 ,Point b2)||a1==b1 || a1 == b2) return true; else return false; } return if(dcmp(c1)*dcmp(c2) <= 0 && dcmp(c3)*dcmp(c4) <= 0) }