我正在用JavaScript编写光线投射器。我在为射线广播找到或实现算法时遇到了麻烦。目前,我正在尝试采用以下样式进行投射。
有一个网格,块的宽度和高度相等。我的播放器在网格中具有一个位置,即他所注视的0-360度角方向。第一步,我需要找出我的播放器到网格交叉点处绿点的距离。我知道绿点在交叉点处,因此我可以算出红线的长度。在相交处有一个直角。当我计算出绿点的距离或x和y位置时,我必须在第二步中做类似的事情。橙色线的距离是已知的,绿点的位置和角度是已知的。同样,直角位于相交的边界线上。
我什至不确定这种方式是否可行,但也许您有其他想法,然后我应该如何解决。非常感谢。
答案 0 :(得分:1)
(下面的道歉格式;我正在电话上敲这个)
根据三角学cos(aplha) = (length of red line)/(length of hypotenuse)
。
因此:length of hypotenuse = (length of red line)/cos(alpha)
。
您将sin
用于垂直交点。
但请注意:如果您考虑当玩家直接看墙时会发生什么,所有长度都应该相同,以便在屏幕上保持恒定的高度,但是实际上它们会有所不同,因为对角线是不同的。您需要将玩家方向和投射方向之间的相对角度乘以cos
(因此,如果您拥有60度的视野,则在显示中心处为0,在某一位置处为+30结束,然后降到-30)。
也不要陷入通常认为应该以相同角度隔开的角度的陷阱。再想想一个人直接看着墙,并使用atan
来获得正确的相对角度。
答案 1 :(得分:0)
射线的参数方程式
X = x + t cos α, Y = y + t sin α
带有t>0
。
假设单位网格(但您可以重新缩放),并且第一象限中的角度,与网格的第一个交点为
X = ceiling(x) => t = (X - x) / cos α => Y = y + (X - x) . tan α
和
Y = ceiling(y) => t = (Y - y) / sin α => X = x + (Y - y) . cot α
两个t
中最小的一个会告诉您首先满足水平和垂直哪一个要求。
下一个交点与X = ceiling(x) + i
和Y = ceiling(y) + j
相交,因此Y
在步骤tan α
中增加,而X
在步骤cot α
中
对于其他象限,ceiling
替换为floor
。