Обработать список треугольников Делоне в алгоритме Вороного

Учитывая список треугольников Делоне, необходимо получить список ребер, которые будут частью мозаики Вороного.

Псевдокод скелета программы:

getVoronoi(list<point> points) {
    list<triangle> triangles = delaunayTriangulation(points);
    list<edge> edges = voronoiTessellation(triangles);

    //Do something with "edges".
}

Пусть N будет размером points, зная, что delaunayTriangulation(points) равен O(N log N) и triangles=<T1,T2,...TM>, тогда в voronoiTessellation(triangles) сложность должна быть меньше или равна O(N log N).

Способ расчета тесселяции:

voronoiTessellation (list<Triangle> triangles) {
    list<Edge> edges;
    map<Triangle, Point> centers;

    foreach(Triangle triangle in triangles) {
        centers.add(triangle,triangle.calculateCircumcircle());
    }

    foreach(<Triangle triangle,Point point> in points) {
        list<edges> triangleEdges = triangle.getEdges();
        foreach (Edge edge in triangleEdges) {
            Triangle neighbor = searchNeighbor(edge);
            Point neighborCircumcenter = centers.get(neighbor);
            Line line(point, neighborCircumcenter);
            //todo only add this edge once
            edges.add(line);
        }
    }

    return edges;
}

Мой вопрос: какова сложность voronoiTessellation(T)? Меньше или равно O(N log N)?

Спасибо!


person Valentina Ramirez    schedule 03.01.2016    source источник


Ответы (1)


Этот алгоритм равен O(N), если вы можете выполнять searchNeighbor(edge) и center.get() за постоянное время, или O(N log N), если searchNeighbor(edge) занимает O(log N) времени.

Любой из них должно быть легко встретить, создав сначала карту: край -> (треугольник, треугольник), с которой будет консультироваться searchNeighbor().

Если вы используете хэш-карты, вы получите ожидаемое время O (N). В триангуляции Делоне из N точек имеется O(N) треугольников, поэтому:

  • Строительство центров добавляет O(N) центров и занимает O(N) времени

  • Существует O(N) треугольников и пар точек.

  • В каждом треугольнике 3 ребра

  • Вы добавляете O(N) ребер к результату за время O(N)

person Matt Timmermans    schedule 03.01.2016
comment
Проблема в том, что я должен знать наихудший случай, когда N = #points, есть такое же количество trangles и points? - person Valentina Ramirez; 03.01.2016
comment
да. двумерная триангуляция Делоне имеет O (# точек) количество треугольников - person Matt Timmermans; 03.01.2016
comment
У вас есть документ или доказательство этого? Спасибо! - person Valentina Ramirez; 03.01.2016