在stackowerflow上有很多关于线段之间的交叉点的问题,这里还有一个!抱歉,但我需要帮助来了解如何计算交叉点。我已经阅读了这里的几个问题并查看了其他网站上的几个示例,但我仍然感到困惑并且不明白!我不喜欢在没有工作原理的情况下复制和粘贴代码。
到目前为止,我知道我将比较每个线段的点,例如 Ax、Ay、Bx、By、Cx、Cy、Dx、Dy。有人可以为我解释一下我要计算什么,如果有交叉点,计算的结果会是什么?
这是我看到的示例代码之一。我想我不需要相交点,只是想知道线是否相交。
public static Point lineIntersect(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) {
double denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
if (denom == 0.0) { // Lines are parallel.
return null;
}
double ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3))/denom;
double ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3))/denom;
if (ua >= 0.0f && ua <= 1.0f && ub >= 0.0f && ub <= 1.0f) {
// Get the intersection point.
return new Point((int) (x1 + ua*(x2 - x1)), (int) (y1 + ua*(y2 - y1)));
}
return null;
}
我是否还需要像此代码示例中那样计算一些中值?
For lines through points (x0,y0) and (x1,y1), let xm = (x0+x1)/2, ym = (y0+y1)/2 (median of line segment).
Then a = (y1-y0) and b = (x0-x1).
If you evaluate c = a(x-xm)+b(y-ym), c=0 for (x,y) on the line, and the sign(c) tells you which side a point is on