【问题标题】:How can I change this raycasting algorithm to not go diagonally?我怎样才能改变这个光线投射算法而不是对角线?
【发布时间】:2010-07-18 16:07:11
【问题描述】:
// Arg0 - Map, Arg1 - X, Arg2 - Y, Arg3 - Distance, Arg4 - MaxDistance  

var xx,yy,dist, x1, y1, dir, maxdist, obj, res, map;  
map = argument0  
x1 = argument1  
y1 = argument2  
dir = argument3  
maxdist = argument4  
dist = 0

do {  
    dist+=1  
    xx = x1+round(lengthdir_x(dist,dir))  
    yy = y1+round(lengthdir_y(dist,dir))  
} until(block_isSolid(map_get_block(map,xx,yy)) or dist>maxdist)  

if !block_isSolid(map_get_block(map,xx,yy)) {  
    return false  
} else {  
    res = ds_list_create()  
    ds_list_add(res,xx)  
    ds_list_add(res,yy)  
    return res  
}

有这个功能。 lengthdir_x/ysin/cos(dir)*dist。 不要因为我把 C 标签放在那里而对我大喊大叫。这些语言非常相似,以至于我几乎可以直接复制。

好了,手续办好了: 当前的算法有时会沿对角线运行(其中 x 和 y 在任一符号中都变化一个),但我希望它不要这样做。

EG:
当前:(其中 X 是投射的光线)

呜呜 呸呸呸 喔喔喔 oooxo 呜呜呜

通缉:

呸呸呸 oxxoo ooxxo oooxx 呜呜呜

有意义吗?

请帮忙。

【问题讨论】:

    标签: c algorithm rounding raytracing gml


    【解决方案1】:

    delta 是一个浮点数,是虚拟秒“射线”的 x 距离(应该在 1.0f - 2.0f 左右,只是实验)

    Delta 不应小于地图中单个像素的大小。

    do {  
        dist+=1  
        xx = x1+round(lengthdir_x(dist,dir))  
        yy = y1+round(lengthdir_y(dist,dir))  
    } until(block_isSolid(map_get_block(map,xx,yy)) || block_isSolid(map_get_block(map,xx + delta,yy)) or dist>maxdist)  
    

    【讨论】:

    • 请详细说明..?我将增量分配给什么?
    • 所以它应该总是1?抱歉回复晚了,正在看电影。
    猜你喜欢
    • 2021-01-18
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2012-04-15
    • 2021-07-14
    相关资源
    最近更新 更多