【问题标题】:How to detect if the line intersects in C#?如何检测线是否在C#中相交?
【发布时间】:2012-01-01 17:07:58
【问题描述】:

我想在 C# 中添加我的项目的附加功能,我已经可以在我的程序中画线,但我想检测绘制的一条线的相交线并显示它们相交的点。是否可以?谢谢

我的程序还包括垂直距离的计算,这里是示例代码:

    public static Double PerpendicularDistance(Point Point1, Point Point2, Point Point)
    {
        Double area = Math.Abs(.5 * (Point1.X * Point2.Y + Point2.X * Point.Y + Point.X * Point1.Y - Point2.X * Point1.Y - Point.X * Point2.Y - Point1.X * Point.Y));
        Double bottom = Math.Sqrt(Math.Pow(Point1.X - Point2.X, 2) + Math.Pow(Point1.Y - Point2.Y, 2));
        Double height = area / bottom * 2;

        return height;
    }
}

这里的 POINT 是我的 X 和 Y 坐标的类。

【问题讨论】:

  • 对您的问题“有可能吗?”的简短回答是:是的 ;-) 较长的一个:你的问题是什么?你研究过这个问题吗?更具体一些,人们将能够帮助您。
  • 我的问题是我想知道如何在 C# 中获取 ONE LINE 绘图的交集并使用消息框显示它。谢谢
  • 同意安德烈的观点,给出的信息很难解决问题。您可以通过求解直线方程来求解直线的交点,例如geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html#SEC32.3 然而你提到曲线?你有这些线的输入点数组吗?你有什么信息,你想要什么?
  • 我已经编辑了这个问题,希望现在更清楚了。谢谢!

标签: c# intersection


【解决方案1】:

如果您试图找到两条线的交点,那么解决方案相当简单。

如果这两行的形式是 Ax + By = C:

float delta = a1*b2 - a2*b1;
if(delta == 0) 
    throw new ArgumentException("Lines are parallel");

float x = (b2*c1 - b1*c2)/delta;
float y = (a1*c2 - a2*c1)/delta;

我担心的是上面的评论说只有一条画线。我不确定你是什么意思。这是否意味着应用提供了一条线而用户提供了另一条线,或者我们是在处理线与自身相交的曲线?

【讨论】:

  • 实际上是第二条“线相交的曲线”..
  • 很有趣的问题!!!这是我能想到的唯一方法,但我不确定它在代码方面是否非常有效。我确信有许多优化可以消除尝试明显不相交的线的需要。任何曲线都可以通过将其分解为多个线段来近似。然后程序可以遍历它们以查看是否有任何线段相交。
  • 进一步澄清....如果我们将曲线分成 10 个线段,那么您将在 s1-s2 上使用上述方法,然后在 s1-s3 上使用上述方法,将 s1 与其他线段进行比较,然后将 s2 与所有其他部分等等。不幸的是,这运行大约 n*n 时间,所以性能不会很好。
  • 我认为这是个好主意.. 但是我将如何根据上面的代码在 C# 中实现它?我只有 2 点 X 和 Y,Point1 和 Point2..
  • 我不确定。基于您只有 p1 和 p2 的事实,那么我可以安全地假设它们代表某种手绘程序中的 MouseDown 和 MouseUp 坐标吗?如果是这种情况,那么您可以使用 onMouseMove 事件来捕获 Cursor.Position。
猜你喜欢
  • 1970-01-01
  • 2013-07-15
  • 2014-03-21
  • 1970-01-01
  • 2013-01-03
  • 2014-03-15
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多