Algorithm 光线投射到栅格交点的距离

Algorithm 光线投射到栅格交点的距离,algorithm,trigonometry,raycasting,Algorithm,Trigonometry,Raycasting,我正在用JavaScript编写一个raycaster。我很难找到或实现光线投射的算法。目前我正在尝试以下风格的演员阵容 有一个块宽和块高相等的网格。我的球员在网格内有一个位置,一个角度为0-360度的方向,他在那里看着。在第一步中,我需要计算出从我的播放器到网格交叉点绿点的距离。我知道绿点在十字路口,所以我可以算出红线的长度。在十字路口有一个直角。当我计算出绿点的距离或x和y位置时,我必须在第二步做一个模拟的事情。橙色线的距离已知,绿点的位置和角度已知。同样,直角位于相交边界线上 我甚至不确定

我正在用JavaScript编写一个raycaster。我很难找到或实现光线投射的算法。目前我正在尝试以下风格的演员阵容

有一个块宽和块高相等的网格。我的球员在网格内有一个位置,一个角度为0-360度的方向,他在那里看着。在第一步中,我需要计算出从我的播放器到网格交叉点绿点的距离。我知道绿点在十字路口,所以我可以算出红线的长度。在十字路口有一个直角。当我计算出绿点的距离或x和y位置时,我必须在第二步做一个模拟的事情。橙色线的距离已知,绿点的位置和角度已知。同样,直角位于相交边界线上


我甚至不确定这样做是否可行,但也许你有任何其他想法,我应该如何解决它。非常感谢。

对于下面的格式设置表示歉意;我正在电话上窃听这个

根据三角学,cosaplha=红线长度/斜边长度

因此:斜边长度=红线长度/cosapha

你会用sin作为垂直交叉点

不过需要注意的是:如果你想一想当玩家直视一堵墙时会发生什么,那么所有的长度都应该是相同的,这样屏幕上的高度是恒定的,但实际上它们是不同的,因为对角线是不同的。你需要乘以玩家方向和施法方向之间相对角度的cos,因此,如果你有一个60度的视野,那么显示器的中心为0,一端为+30,另一端为-30


也不要陷入一个常见的陷阱,认为你投的角度应该是均匀分布的。再想一想一个人直视墙壁,用atan获得适当的相对角度。

光线的参数方程读取

X = x + t cos α, Y = y + t sin α
t>0时

假设为单位栅格,但可以重新缩放,并且角度在第一个象限中,与栅格的第一个交点为

X = ceiling(x) => t = (X - x) / cos α => Y = y + (X - x) . tan α

两个t中最小的一个会告诉你水平线和垂直线中哪一个最先相遇

下一个交点是X=ceilingx+i和Y=ceilingy+j,因此在步骤tanα中Y增加,在步骤cotα中X增加

对于其他象限,天花板被地板所取代。

这可能会引起您的兴趣。
Y = ceiling(y) => t = (Y - y) / sin α => X = x + (Y - y) . cot α