Frage

Ich berechne die 2D -Delaunay -Triangulation von einigen tausend Punkten. Jeder Punkt hat mehr Daten, die über X- und Y -Koordinaten hinausgehen. Daher habe ich mich gefragt, ob es möglich ist, den Index jedes Punktes abzurufen, damit ich in einem anderen Vektor auf meine eigene Punktstruktur zugreifen kann.

Wenn ich von einem face_handle zugreife, gibt es derzeit einen Punkt zurück (dh x, y -Koordinaten). Wie kann ich jeden Scheitelpunkt mit seiner ID (Index) anstelle seiner x, y -Koordinaten zurückgeben? Vielen Dank.

#include <vector>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef CGAL::Delaunay_triangulation_2<Kernel> Delaunay;
typedef Kernel::Point_2 Point;

void example() {

  std::vector<Point> points;
  points.push_back(Point(1,1)); //index 0
  points.push_back(Point(1,2)); //index 1
  points.push_back(Point(1,3)); //index 2
  points.push_back(Point(2,1)); //index 3
  points.push_back(Point(2,2)); //index 4
  points.push_back(Point(2,3)); //index 5

  Delaunay triangulation;
  triangulation.insert(points.begin(),points.end());

  for(Delaunay::Finite_faces_iterator fit = triangulation.finite_faces_begin();
      fit != triangulation.finite_faces_end(); ++fit) {

    Delaunay::Face_handle face = fit;
    std::cout << "Triangle:\t" << triangulation.triangle(face) << std::endl;
    std::cout << "Vertex 0:\t" << triangulation.triangle(face)[0] << std::endl;
  }
}

Ausgabe (x, y Koordinaten):

Triangle:   1 3 1 2 2 2
Vertex 0:   1 3
Triangle:   1 2 1 1 2 1
Vertex 0:   1 2
Triangle:   1 3 2 2 2 3
Vertex 0:   1 3
Triangle:   1 2 2 1 2 2
Vertex 0:   1 2

Gewünschte Ausgabe (Indizes):

Triangle:   2   1   4
Vertex 0:   2
Triangle:   1   0   3
Vertex 0:   1 
Triangle:   2   4   5
Vertex 0:   2
Triangle:   1   3   4
Vertex 0:   1
War es hilfreich?

Lösung

Sie können alle Informationen an Scheitelpunkte in einer Triangulation anhängen. Zum Beispiel zum Hinzufügen von Indizes (unsigned int) Sie könnten Folgendes tun:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/Triangulation_vertex_base_with_info_2.h>
#include <vector>

typedef CGAL::Exact_predicates_inexact_constructions_kernel            Kernel;
typedef CGAL::Triangulation_vertex_base_with_info_2<unsigned int, Kernel> Vb;
typedef CGAL::Triangulation_data_structure_2<Vb>                       Tds;
typedef CGAL::Delaunay_triangulation_2<Kernel, Tds>                    Delaunay;
typedef Kernel::Point_2                                                Point;

int main() {

  std::vector< std::pair<Point,unsigned> > points;
  points.push_back( std::make_pair( Point(1,1), 0 ) );
  points.push_back( std::make_pair( Point(1,2), 1 ) );
  points.push_back( std::make_pair( Point(1,3), 2 ) );
  points.push_back( std::make_pair( Point(2,1), 3 ) );
  points.push_back( std::make_pair( Point(2,2), 4 ) );
  points.push_back( std::make_pair( Point(2,3), 5 ) );

  Delaunay triangulation;
  triangulation.insert(points.begin(),points.end());

  for(Delaunay::Finite_faces_iterator fit = triangulation.finite_faces_begin();
      fit != triangulation.finite_faces_end(); ++fit) {

    Delaunay::Face_handle face = fit;
    std::cout << "Triangle:\t" << triangulation.triangle(face) << std::endl;
    std::cout << "Vertex 0:\t" << triangulation.triangle(face)[0] << std::endl;
    std::cout << "Vertex 0:\t" << face->vertex(0)->info() << std::endl;
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top