【问题标题】:Find the intersection between line and grid in a fast manner快速找到线和网格的交点
【发布时间】:2022-03-11 11:07:47
【问题描述】:

有没有办法让我找到一条线和一个网格之间的所有交点? (我知道相交的圆圈不是按比例绘制的)

一种蛮力的方法是计算x-y 网格与线的交点,但这种算法效率非常低(O(m*n),其中mx 网格的数量,ny 网格的数量)。

我正在为此寻找更好的算法。

【问题讨论】:

  • 网格应该是规则的吗?
  • @Ignacio,是的,网格是规则的。

标签: c# geometry


【解决方案1】:

听起来您需要Digital Differential AnalyzerBresenham's line algorithm。 Bresenham 与用于在位图上绘制线条的算法相同。在这种情况下,为像素着色相当于检查该正方形中的碰撞。

【讨论】:

  • 我相信这应该是公认的答案。使用像 Bresenham's 这样的算法将检查网格点,然后从那里可以更轻松地计算各个交点 - 水平和垂直分量都是已知的。
【解决方案2】:

我不确定我是否真的理解这个问题。这就是你要找的东西吗?

【讨论】:

  • 我想要红线和网格线之间的每一个交点。所以,点是(0,b)((h-b)/m, h)(w, mw+b)(2w, 2wm+b)((2h-b)/m,2h)(3w, 3wm+b)等等
  • @dtb,什么都没有。但我想要一个有效的算法
  • 对我来说,这看起来像是每个交叉点的一个计算。我无法想象有什么比这更有效的了。
  • @dtb,如果是这样的话,那将是非常低效的。假设你有一个 100*100 的网格,那么你就要做 100*100 的操作。
  • @Ngu Soon Hui:我不明白。我的答案中的网格由 5 条水平线和 5 条垂直线组成。红线在 7 个地方与网格线相交。要找到这 7 个交点,您最多需要执行 10 次计算,而不是 25 次。
【解决方案3】:

如果网格是轴对齐的:

  1. 找出直线方程
  2. 计算交点 直接使用任一网格 行的 x 或 y 作为固定变量

如果网格是规则的,则与每条水平线的交点之间的距离将相同。垂直线也是如此。在这种情况下,你可以用 dx 和 dy 做一个简单的迭代算法。

【讨论】:

    【解决方案4】:

    算法:

    网格由墙组成。

    墙具有/在某个维度:(垂直、水平、深度)

    墙壁尺寸与形成单元格相交(在最终尺寸中)

    这条线与墙壁主要在它们自己的维度上相交。

    解决方案是将问题视为:如何将线与墙在其自身维度中相交。

    解决方案是从一堵墙滑到另一堵墙,根据需要切换尺寸。

    滑过这条线时,总是选择最近的墙作为下一个目的地。

    在它自己的维度上从墙到墙的滑动是恒定的/总是相同的。

    线和墙的交点在每个维度上是不同的。

    这最终决定了墙壁交叉点的顺序。

    因此解决方案是:

    第一阶段:初始化

    计算维度.IntersectT

    计算 Dimension.SlideT

    第 2 阶段:开始从起点向目的地滑动,选择最近的墙壁:

    Dimension.T := Dimension.IntersectT

    而 ?结束条件?

    选择最小的Dimension.T

    更新选定的 Dimension.T += Dimension.SlideT

    结束

    难点在于计算Ts。

    再见, 斯凯巴克。

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      相关资源
      最近更新 更多