【问题标题】:Line intersection线交点
【发布时间】:2010-10-24 09:28:19
【问题描述】:

如何判断一条线是否在多边形中截取

【问题讨论】:

  • 请提供更多信息
  • 请稍微澄清一下这个问题。您的意思是与 2D 多边形相交的 2D 线吗?一条穿过 2D 多边形平面的 3D 线,线与平面的交点也在多边形内?它是任何一般多边形还是我们可以假设它是凸的?
  • 是否有您正在使用的编程语言?许多人为此内置了库。

标签: algorithm math geometry intersection


【解决方案1】:

您可以从某些网页中找到的此实现中阅读合理的答案

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】:

    根据你到底想要什么(我将假设一个线段,因为我本周刚刚编写了该代码)你可以分为两部分:

    首先我建议将行编码为

    a*X + b*Y - c = 0
    

    因为该表单没有像X=5Y=4X=3*Y 这样的行的极端情况。

    • 测试线是否与多边形的任何一侧相交
      • 测试两条线的末端是否在另一条线的相对两侧。建议的表格只需检查 LHS 的极性即可轻松完成
    • 测试线上的点是否在多边形内
      • 测试从输入线上的某个点到多边形外部的线是否在奇数个点处穿过多边形。请注意,您需要检查从多个位置显示的相同点,并且由于 FP 错误,这无法通过完全匹配测试来完成。

    【讨论】:

      【解决方案3】:

      这个问题有点模棱两可,但我们还是试试吧:

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

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

      【讨论】:

        【解决方案4】:

        您需要坐标图上的多边形点以及直线的斜率和 x 和 y 截距才能找到该信息。从那里开始就是简单的数学运算。

        【讨论】:

          猜你喜欢
          • 2015-07-03
          • 1970-01-01
          • 2012-10-14
          • 1970-01-01
          • 2015-05-17
          • 1970-01-01
          • 2016-12-22
          • 2014-07-27
          相关资源
          最近更新 更多