2

在此处输入图像描述

我已经成功实现了一个基本的光线投射算法,但我想扩展它以使用“角度范围”。

知道网格单元大小、列数和行数、起始射线位置、角度 a 和角度 b,我如何才能获得落在两条射线之间的所有单元?

4

1 回答 1

1

如果两条光线位于同一象限或相邻象限:

您可以使用稍微修改的Bresenham 算法将两条光线并行地走在一起,并在它们之间获得整列或整行单元格。您的示例和(主要)水平扇区的示例伪代码:

 initialisation for deltaerr1, deltaerr2
 for x from 0 to EndXCoord
         get all cells in column (x,y1)-(x,y2)

         error1 := error1 + deltaerr1
         if error1 ≥ 0.5 then
             y1 := y1 + 1
             error1 := error1 - 1.0

         error2 := error2 + deltaerr2
         if error2 ≥ 0.5 then
             y2 := y2 + 1
             error2 := error2 - 1.0

如果光线在相反的象限中,则将它们分开(并取所有中间象限)

一些案例:

第 1 和第 2 象限:沿 y 方向走步,获取行

第 1 和第 4 象限:在 x 方向上执行步骤,获取列(如伪代码)

从第 1 象限开始,在第 3 象限结束角度:在每个象限中沿 y 方向步进,在第 2 象限中获取所有需要的单元格

特别案例:

某个角度是 n*90 - 可能需要改变方向

射线形成 180° 角:在所需范围内沿线进行 Bresenham 步骤,在选定的半平面中获取行或列

于 2013-04-07T15:09:45.500 回答