2012-03-13 24 views
5

Her birinde ilişkili bir kimlik bulunan bir 2B nokta kümesi var. (örneğin, noktalar bir dizide saklanırsa, kimlik her bir noktaya 0, ...., n-1) endekstir.CGAL 2D Delaunay Üçgenleme: Kenarları köşe çiftleri olarak nasıl alabilirim?

Şimdi bu noktalardan bir Delaunay üçgenleme oluşturuyorum ve tüm sonlu kenarları listelemek istiyorum. Her kenar için, karşılık gelen 2 köşe ile temsil edilen noktaların kimliklerini almak istiyorum. Örnek: 0 ile 2 arasındaki bir kenar varsa, o zaman (0,2). Mümkün mü?

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

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

void load_points(std::vector<Point>& rPoints) 
{ 
    rPoints.push_back(Point(10,10)); // first point 
    rPoints.push_back(Point(60,10)); // second point 
    rPoints.push_back(Point(30,40)); // third point 
    rPoints.push_back(Point(40,80)); // fourth point 
} 

void main() 
{ 
std::vector<Point> points; 
load_points(points); 

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

for(Delaunay::Finite_edges_iterator it = dt.finite_edges_begin(); it != dt.finite_edges_end(); ++it) 
{ 
    } 
} 

cevap

7

Önce these examples gibi bilgi içeren bir köşe türünü kullanmak gerekir. Daha sonra bir kenar, yüze bir tutamağın yanı sıra kenardaki yüzün köşesinde bulunan indeksi de içeren bir çifttir.

varsa: Aradığınız

Delaunay::Edge e=*it; 

endeksleri şunlardır:

int i1= e.first->vertex((e.second+1)%3)->info(); 
int i2= e.first->vertex((e.second+2)%3)->info(); 
+0

sloriot: çok yararlı. Teşekkürler. – 911

+0

Çok net! teşekkür ederim. – LoveMeow