线路交叉口

时间:2009-05-07 05:06:52

标签: algorithm math geometry intersection

如何查找是否在多边形中拦截了一条线

4 个答案:

答案 0 :(得分:3)

这个问题有点模棱两可,不过我们试试吧:

假设线上的点(x,y)由方程Ax + By + C = 0定义。 然后我们可以通过评估显然确定点(x,y)是否在线上 Ax + By + C.如果该点不在线上,则Ax + By + C的符号告诉我们该点的哪一侧。 因此,通过检查多边形的每个顶点(x,y)的表达式Ax + By + C的符号,我们可以确定多边形的所有点是否在线的同一侧。

(稍微不同的问题是确定多边形是否与线段相交。)

答案 1 :(得分:3)

您可以从某个网页上的此实现中读取合理的答案

Point  * intersection2(Point * _line1, Point * _line2) {

Point  p1,p2,p3,p4;
p1=_line1[0]; p3=_line2[0];
p2=_line1[1]; p4=_line2[1];

// Store the values for fast access and easy
// equations-to-code conversion
double x1 = p1.x, x2 = p2.x, x3 = p3.x, x4 = p4.x;
double y1 = p1.y, y2 = p2.y, y3 = p3.y, y4 = p4.y;

double A1 = y2-y1;
double B1 = x1-x2;
double C1 = (A1*x1)+(B1*y1);

double A2 = y4-y3;
double B2 = x3-x4;
double C2 = A2*x3+B2*y3;

double det = A1*B2 - A2*B1;

if (det==0){
    return NULL;
}else{
    // Return the point of intersection
    Point  * ret = new CvPoint2D64f ();
    ret->x = (B2*C1 - B1*C2)/det;
    ret->y = (A1*C2 - A2*C1)/det;
    return ret;

}

}

参考。 C ++示例:几何概念线交点及其应用,2D绘图 由lbackstrom 来自网站ucancode

答案 2 :(得分:0)

您需要坐标图上的多边形点以及线的斜率和x和y截距来查找该信息。从那里它是简单的数学。

答案 3 :(得分:0)

取决于你想要什么(我假设一个线段,因为我本周刚刚编写了这段代码),你可以分两部分来看:

首先,我建议将行编码为

a*X + b*Y - c = 0

因为该表单没有X=5Y=4X=3*Y等行的大写字母。

  • 测试线是否与多边形的任何一侧相交
    • 测试两条线的末端是否在另一条线的两侧。只需检查LHS的极性
    • ,建议的形式就可以轻松实现
  • 测试线上的点是否在多边形内
    • 测试从输入线上的某个点到多边形外部的线是否在奇数个点处对多边形进行了测试。请注意,您需要检查从多个地方出现的相同点,并且由于FP错误,无法通过完全匹配测试来完成。