【问题标题】:Line intersections for diagonals on a 2d plane in C#C#中二维平面上对角线的线交点
【发布时间】:2012-07-30 18:11:00
【问题描述】:

假设一个二维网格,左上角的单元格为 (0, 0)。选择任意两个点/坐标并在每个点上绘制对角线和对角线。它们可能在网格内部或外部相交。

在附图中,红线是(300, 200)和(700, 800)两点的对角线。

如何找出对角线交叉点的坐标?另外,如果直线的斜率为负,公式会有什么不同?

我将在需要高度优化的算法中使用它,这样正确的答案将是最快的计算方式。我不确定这是否可以在没有三角学的情况下完成。

注意: 请记住,红线是真正的对角线/对角线对。换句话说,它们与矩形成 45 度角。这可能有助于选择比矢量计算更优化的公式。

【问题讨论】:

  • 家庭作业的味道? :)
  • @Trikks:这不是家庭作业。它正在努力解决这个问题。这是用于生产应用程序。

标签: c# .net math 2d intersection


【解决方案1】:

D 为两条边长之差。在你的图中,D=200。这是两个白色三角形(外部交点和矩形之间的三角形)的斜边的长度。所以这些三角形的边长是D/sqrt(2),因此外部交点的坐标与矩形角的坐标相差D/2

那么对于你的图表,

(x1,y1) = 300-D/2, 200+D/2 = 200,300
(x2,y2) = 700+D/2, 800-D/2 = 800,700

您必须处理所有可能的方向(x1<x2x1>x2、...),但它们都与这个方向对称。

【讨论】:

  • +1。在每个交叉点周围绘制 200x200 的小方块可能会更加明显。
  • 谢谢。我的几何图形生锈了。我不知道斜边和 Abs(Width-Height) 之间的关系。这个委托人有名字吗?
  • @RaheelKhan:不,只是右上和左下的灰色三角形是90-45-45,所以它们的两个较短的边长度相同。所以剩下的矩形边界段一定是长边和短边之差。
  • 忽略了,谢谢!您如何计算方向 (x1xy, y1y2) 以确定每个交叉点的加法或减法?
  • 这里有一个链接 (stackoverflow.com/questions/11852284/…),供那些可能从中受益的人使用。
【解决方案2】:

这只是数学。你有 2 行方程

y1 = k1 * x1 + b1
y2 = k2 * x2 + b2
If they intersect then y1 == y2 and x1 = x2 so
k1 * x1 + b1 = k2 * x1 + b2
x1 = (b2 - b1) / (k1 - k2)

现在唯一的问题是如何找到k1、k2、b1、b2?简单的!每条线都有 2 个点(来自 graphics.DrawLine(x1, y1, x2, y2))。在这里使用它们。对于第一行:

y1 = k * x1 + b
y2 = k * x2 + b
b = y1 - k * x1
y2 = k * x2 + y1 - k * x1 = k * (x2-x1) + y1
so
k = (y2 - y1) / (x2 - x1)

k 替换为b = y1-k*x1,您将获得计算精确碰撞点所需的所有值。

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 2011-05-25
    • 2020-07-24
    • 2023-03-08
    • 2016-04-20
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多