gpt4 book ai didi

algorithm - Supercover DDA算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:47 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何制作 super 覆盖 DDA 算法。或者换句话说,一种 DDA 算法将覆盖一条线穿过的所有网格点。请参见下图。

图像是我画的,可能不是 100% 准确,但它显示了总体思路。我还要注意图像下半部分的示例没有整数开始和结束坐标,这是必要的。

如果您需要知道,我打算将其用于视线光线转换。

我有能力实现典型的 DDA 算法,但我的问题是,如何修改它以涵盖所有点?

谢谢!

我目前在Lua中实现的DDA算法

function dline(x0,y0, x1,y1) -- floating point input
local dx = x1-x0
local dy = y1-y0

local s = math.max(math.abs(dx),math.abs(dy))

dx = dx/s
dy = dy/s

local x = x0
local y = y0
local i = 0
return function() -- iterator intended for a for loop
if i <= s then
local rx,ry = x,y
x = x+dx
y = y+dy
i = i+1
return rx,ry
end
end
end

最佳答案

不好意思,我问的不多,主要是我没那么好。但我会告诉你我擅长什么!解决我自己的问题! :D

请注意,我的问题中的图像显示如果线精确地穿过一个点,则线穿过对角线,这个算法不会,但经过一番思考,我不希望穿过对角线。

感谢this我找到的文章。

这是新的实现

function line(x0,y0, x1,y1)
local vx,vy = x1-x0, y1-y0 -- get the differences
local dx = math.sqrt(1 + (vy/vx)^2) -- length of vector <1, slope>
local dy = math.sqrt(1 + (vx/vy)^2) -- length of vector <1/slope, 1>

local ix,iy = math.floor(x0), math.floor(y0) -- initialize starting positions
local sx,ex -- sx is the increment direction
-- ex is the distance from x0 to ix
if vx < 0 then
sx = -1
ex = (x0-ix) * dx
else
sx = 1
ex = (ix + 1-x0) * dx -- subtract from 1 instead of 0
-- to make up for flooring ix
end

local sy,ey
if vy < 0 then
sy = -1
ey = (y0-iy) * dy
else
sy = 1
ey = (iy + 1-y0) * dy
end

local done = false
local len = math.sqrt(vx^2 + vy^2)
return function()
if math.min(ex,ey) <= len then
local rx,ry = ix,iy
if ex < ey then
ex = ex + dx
ix = ix + sx
else
ey = ey + dy
iy = iy + sy
end
return rx,ry
elseif not done then -- return the final two coordinates
done = true
return ix,iy
end
end
end

关于algorithm - Supercover DDA算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18881456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com