【问题标题】:Advice on raytracing algorithm needed需要关于光线追踪算法的建议
【发布时间】:2015-09-25 13:13:43
【问题描述】:

我有一个显示世界及其海岸线的网格。此处显示了英国周边地区的摘录

从海洋中任何地方的任意原点,我想找到那些在原点视线范围内的海岸线点,而不必越过另一个海岸线点。例如,如果原点位于英国西部,我希望获得爱尔兰西部和英国西部的许多海岸线点,但不会来自丹麦,因为它被英国“覆盖”。

我需要一种快速算法的建议,该算法可以“射出”光线并检测这些光线穿过第一条海岸线的位置(海岸线地图以二进制格式提供)。

或者,我可以想象沿着所有海岸线像素移动,在原点和海岸线点之间建立连接线,并检查连接线上是否没有其他海岸线点。是否有任何算法可以有效地完成对海岸线穿越的检查?

我意识到这个问题是一个未知数,但也许有聪明的人在这方面有知识。非常感谢任何帮助。

【问题讨论】:

  • 也许你应该把这个问题发到cs.stackexchange.com
  • 如果您采用this answer 并以有效的方式存储所有边(例如,将地图划分为一个网格并为每个框存储边(相交)它),您可以检查哪些框光线进入,以及它与该框中的哪些线段相交。如果您从射线的原点开始,您可以简单地按顺序选中它通过的框(如果同一框中有多个交叉点,您可能需要检查哪个线段最接近射线的原点)。
  • 当您说海岸线存储为“二进制格式”时,您的意思是它存储为光栅图像吗? (即二维像素数组)将海岸线存储为矢量图像(线段列表)更为常见。根据答案,算法会有所不同(准确性也会有所不同)。
  • 嗨 Sam 和 Anna,感谢您的 cmets。 “拳击”的想法听起来很有趣,好像它会提高效率。我会再考虑一下。安娜,二进制格式,我的意思是我有一个二维像素数组,值为 1(=海岸线)和 0(=无海岸线)。我很想听听你的想法。
  • 您能否具体说明“快速”是什么意思以及在什么硬件上?有多种方法可能在速度和复杂性上有所不同,但如果一些基本的东西可以做,那么创建一个过于复杂的解决方案是没有意义的。另外,你的地图分辨率是多少?

标签: python python-2.7 numpy scipy raytracing


【解决方案1】:

最简单的方法是使用DDA 算法将像素从兴趣点移动到图像边缘上的点。假设在第一次命中时停止,对于 5000x10000 的地图,这会导致非常简单的循环进行数百万次迭代。

如果计算量太大,您可以使用一种空间划分方案(例如四叉树、统一网格、BSP 树)来跳过大的空白区域。

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多