【发布时间】:2012-09-20 12:47:43
【问题描述】:
我正在 Lua 中实现 Bentley-Ottmann 算法,以使用位于 here 的伪代码查找多边形中的交叉点。
我对实现算法比较陌生,所以我无法理解它的所有部分。到目前为止,这是我的代码:
local function getPolygonIntersectingVertices( poly )
-- initializing and sorting X
local X = {}
for i = 1, table.getn( poly ) do
if i == 1 then
table.insert( X, { x = poly[i].x, y = poly[i].y, endpoint = 'left' } )
elseif i == table.getn( poly ) then
table.insert( X, { x = poly[i].x, y = poly[i].y, endpoint = 'right' } )
else
table.insert( X, { x = poly[i].x, y = poly[i].y, endpoint = 'right' })
table.insert( X, { x = poly[i].x, y = poly[i].y, endpoint = 'left' })
end
end
local sortxy = function( a, b )
if a.x < b.x then return true
elseif a.x > b.x then return false
elseif a.y <= b.y then return true
else return false end
end
table.sort( X, sortxy )
-- Main loop
local SL = {}
local L = {}
local E
local i = 1
while next(X) ~= nil do
E = { x = X[i].x, y = X[i].y, endpoint = X[i].endpoint }
if E.endpoint == 'left' then
-- left endpoint code here
elseif E.endpoint == 'right' then
-- right endpoint code here
else
end
table.remove( X, i )
end
return L
end
我的多边形是一个使用这种结构的表格:{ { x = 1, y = 3 }, { x = 5, y = 6 }, ... }
如何确定“SL 中 segE 上方的线段;”和“SL 中 segE 下方的线段;”以及如果扫描线 (SL) 为空?另外,在将 I 插入 X 时,是否应该用 endpoint = 'intersect' 标记它并将其附加到末尾,以便当循环到达这部分时进入主循环的“else”语句或我把整个算法弄错了吗?
如果有人可以向我展示一个包含 Python、Ruby 等简单实现的链接,那将是完美的,因为我发现很难遵循伪代码并将其与 C++ 示例相匹配。
【问题讨论】:
-
您的代码甚至无法编译。其中有几个基本的语法错误(有趣的函数前向声明,在
sortxy中elseif之后缺少then,在同一函数中缺少end,使用不存在的运算符!=而不是~=)。在请求帮助之前,你应该多学习一点 Lua。 -
prapin,我还没有测试它,因为还没有什么要测试的。我的问题更笼统。当我有东西要测试时,我会修复一些小东西,这只是我快速写的东西,以显示我的进步并更容易地解释我的问题。还是谢谢...
-
好的,我已经修复了错误,现在编译代码只是为了让真正可以帮助解决问题的人回答问题。
-
这段代码适用于哪个 Lua 版本?
table.getn早已被弃用。 -
这是一个在 Python 中工作的 Bentley-Ottmann 实现,您可能有兴趣将其用作参考:stackoverflow.com/a/33199826/432509
标签: algorithm math lua polygons