Добрый день. Делаю реализацию алгоритма Леонова булевых операций над плоскими полигонами. Все до этапа сборки результирующего региона я реализовал и проверил. Все работает правильно, вплоть до маркировки ребер и контуров. Далее идет процесс сборки. Его я запрограммировал, но он не работает. Проверил свой код и сравнил его с тем, что написано в алгоритме, вроде бы все как там. Но мне кажется, что там написано немного неправильно.
Вот как написано в алгоритме:
function Collect(v:вершина; dir:(FORWARD, BACKWARD)):контур;
begin
…Создать пустой контур r;
…repeat
…..Включить v в r;
…..if (dir = FORWARD)
…….E := выходящее из v ребро;
….else
…….E := входящее в v ребро;
….Пометить E как пройденное;
….if ((E.Flags = SHARED1) or (E.Flags = SHARED2))
……пометить сопряженное E ребро как пройденное;
….v := вершина, следующая относительно v в направлении dir;
….if (v является вершиной-пересечением) then
……Jump(v, dir);
…until (текущее ребро помечено как пройденное);
…return r;
end;
точки для удобочитаемости кода
так написано в алгоритме. если проследить его, то получается, что в результирующий контур добавляются даже те точки, которые не должны входить, поскольку точка v добавляется без условий, а она принимает значения всех точек контура.
Разъясните пожалуйста, кто сталкивался с этим алгоритмом, эту часть алгоритма + то, как влияют отсортированные дескрипторы(в процедуре Jump) на включение ребер в результирующий регион. И поправьте, если я не прав насчет включения вершины. Если надо будет, могу скинуть свой код.
Заранее благодарю всех откликнувшихся.
З.Ы. Возможно кто-нибудь сможет скинуть либо весь реализованный алгоритм, либо фрагмент кода, с которым у меня не получается разобраться. На каком языке в принципе без разницы. Спасибо.