ここにある擬似コードを使用してポリゴン内の交差点を見つけるために、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
私のポリゴンは、次の構造を使用したテーブルです:{{x = 1、y = 3}、{x = 5、y = 6}、...}
「 SLのsegEより上のセグメント」と「 SLのsegEより下のセグメント」を判別するにはどうすればよいですか?また、スイープライン(SL)が空の場合はどうすればよいですか?また、IをXに挿入するときは、endpoint ='intersect'でマークして最後に追加する必要があります。これにより、ループがこの部分に到達したときに、メインループの "else"ステートメントに入るか、アルゴリズム全体が得られます。間違い?
疑似コードをたどってC++の例と一致させるのは難しいので、PythonやRubyなどの簡単な実装とのリンクを誰かに見せてもらえると完璧でしょう。