Какой хороший алгоритм для прохождения краев диаграммы Voronoi с использованием boost без рекурсии?Нерекурсивный алгоритм для прохождения краев диаграммы Вороного с boost :: polygon
Я знаю, что мне нужно будет проверить наличие бесконечных ребер в ячейке, а затем проверить его соседи и повторить оттуда, но я бы предпочел метод, который не требует рекурсии, поскольку я имею дело с большими наборами данных ,
Возможно ли это без рекурсии?
Edit, для более разъяснений:
Это способ получить все края клетки:
voronoi_diagram vd;
boost::polygon::construct_voronoi(in.begin(), in.end(), &vd);
std::vector<const voronoi_diagram::cell_type *> edge_cells;
for(const voronoi_diagram::edge_type & e : vd.edges())
if (e.is_infinite())
edge_cells.push_back(e.cell());
Проблема с выше подхода состоит в том, что он не будет пересекать краевые клетки в любой например, по часовой стрелке.
рекурсивный реализация будет делать что-то похожее на это (наспех и непроверенные) код:
bool findNext(const voronoi_diagram::cell_type * c,
std::list<const voronoi_diagram::cell_type *> & list)
{
const voronoi_diagram::edge_type * e = c->incident_edge();
do
{
// Follow infinite edges, adding cells encountered along the way
if (e->is_infinite() && e->twin()->cell() != list.front() &&
e->twin()->cell() != list.back())
{
list.push_back(c);
return findNext(e->twin()->cell(), list);
}
else if (e->twin()->cell() == list.front())
{
list.push_back(c);
return true; // we reached the starting point, return
}
e = e->next();
} while (e != c->incident_edge());
return false;
}
// ...
std::list<const voronoi_diagram::cell_type *> edge_cells;
// ...
for(const voronoi_diagram::edge_type & e : vd.edges())
{
// find first infinite edge
if (e.is_infinite())
{
if (findNext(e.cell(), edge_cells))
break;
else
edge_cells.clear();
}
}
Это траверс бы края диаграммы Вороного, пока не прослеживает его путь назад к первой ячейке и затем останавливается, заполняя стек полностью.
Внерекурсивная реализация будет моделировать второй пример, создавая список ячеек краев по часовой стрелке или против часовой стрелки, без использования рекурсии.
Вы пытались использовать итерацию в цикле вместо рекурсии? –
Да, вложенные циклы, и он становится настолько сложным, что он почти невозможен по сравнению с рекурсивным методом. Вот почему я хотел бы увидеть свежий взгляд на эту тему, возможно, я делаю это неправильно. – voodooattack
@voodooattack: Если я прочитал свой ответ, я ясно написал о выпуклой оболочке. Может быть, вы можете поделиться имиджом вывода? – Bytemain