Algorithm Lua中的Bentley-Ottmann算法

Algorithm Lua中的Bentley-Ottmann算法,algorithm,math,lua,polygons,Algorithm,Math,Lua,Polygons,我正在Lua中实现Bentley-Ottmann算法,使用伪代码查找多边形中的交点 我对实现算法比较陌生,所以我不能理解它的所有部分。以下是我目前的代码: local function getPolygonIntersectingVertices( poly ) -- initializing and sorting X local X = {} for i = 1, table.getn( poly ) do if i == 1 then table.inser

我正在Lua中实现Bentley-Ottmann算法,使用伪代码查找多边形中的交点

我对实现算法比较陌生,所以我不能理解它的所有部分。以下是我目前的代码:

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
局部函数GetPolygonIntersectingVertexts(多边形)
--初始化和排序X
局部X={}
对于i=1,table.getn(poly)do
如果i==1,那么
插入(X,{X=poly[i].X,y=poly[i].y,端点='left'})
elseif i==table.getn(poly)then
插入(X,{X=poly[i].X,y=poly[i].y,端点='right'})
其他的
插入(X,{X=poly[i].X,y=poly[i].y,端点='right'})
插入(X,{X=poly[i].X,y=poly[i].y,端点='left'})
结束
结束
局部sortxy=函数(a,b)
如果a.xb.x,则返回false

elseif a.y您的参考链接从我的位置失败。我会参考,这是相当好的

如何确定“SL中segE上方的段”和“SL中segE下方的段”

该算法要求当前扫描线交叉点的BST按y键排序,即按垂直顺序排序。因此,上面的段是BST的后续段,下面的段是BST的前一段。在BST中查找给定节点的前置节点和后续节点是标准的工作。密钥K的前一个是K的最右边的节点,后一个是K的最左边的节点。有几种计算方法。最简单的方法是使用父指针从K向上遍历树,然后再向下遍历树。另一种方法是基于堆栈的迭代器

如果扫描线(SL)为空,该怎么办

继续处理事件队列。空扫描线仅表示没有线段在其当前x位置相交

另外,在将I插入X时,是否应该用endpoint='intersect'标记它并将其附加到end

事件队列必须在点的x坐标上保持排序。插入交点时,它也必须是x坐标顺序。必须将其标记为交点,因为交点的处理方式与端点不同。当它是x订单中剩余的第一个项目时,将在适当的时候进行处理


请注意,宾利·奥特曼(Bentley Ottman)和几乎所有的几何算法一样,由于浮点不准确而导致了可怕的失败。此外,该算法通常带有一个“一般位置”假设,它允许出现垂直边、点边重合、边边重叠等所有恶劣情况。我最强烈的建议是使用有理算法。即使如此,获得一个完全健壮、正确的实现也是一项重大成就。你可以从很少的免费实现中看出这一点

你的代码甚至没有编译。它有几个基本语法错误(函数的有趣的前向声明,在
sortxy
中的
elseif
之后缺少
,在同一个函数中缺少
end
,使用不存在的操作符
!=
而不是
~=/code>)。在请求帮助之前,你应该多学点Lua。prapin,我还没有测试过它,因为还没有什么可测试的。我的问题比较笼统。当我有东西要测试时,我会修正一些小东西,这只是我写得很快的东西,以显示我的进步,并更容易地解释我的问题。无论如何,谢谢…好的,我已经修复了错误,现在代码编译只是为了让能够帮助解决问题的人回答问题。这段代码是用于哪个Lua版本的
table.getn
早就被弃用了。下面是一个在Python中运行的Bentley Ottmann实现,您可能有兴趣将其用作参考:感谢您最近的回答。我终于自己明白了。:)我赞成使用有理算术。我们尝试了各种各样的技巧来让浮点运算正常工作,但是对于数千条边的交集,由于舍入误差总是会出现失败的情况。使用有理算术,速度较慢,但总是正确的。