我已经成功实现了一个基本的光线投射算法,但我想扩展它以使用“角度范围”。
知道网格单元大小、列数和行数、起始射线位置、角度 a 和角度 b,我如何才能获得落在两条射线之间的所有单元?
我已经成功实现了一个基本的光线投射算法,但我想扩展它以使用“角度范围”。
知道网格单元大小、列数和行数、起始射线位置、角度 a 和角度 b,我如何才能获得落在两条射线之间的所有单元?
如果两条光线位于同一象限或相邻象限:
您可以使用稍微修改的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 步骤,在选定的半平面中获取行或列