문제

CGAL의 삼각 측량의 맥락에서 상속 된 클래스의 삼각 측량 클래스를 어떻게 사용할 수 있습니까?

기본적으로 다음 코드가 있습니다.

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;

typedef CGAL::Triangulation_vertex_base_with_info_2<int,K> Vb;
typedef CGAL::Triangulation_face_base_with_info_2<int,K>   Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb>        Tds;
typedef CGAL::Delaunay_triangulation_2<K,Tds>              Delaunay;
typedef CGAL::Triangulation_2<K,Tds>                       Triangulation;

typedef Triangulation::Point Point;

...

Triangulation *t = new Delaunay;

...

// x and y are properly defined and instantiated
t->insert(Point(x,y));

물론 Delaunay_triangulation_2는 Triangulation_2에서 상속됩니다

따라서이 코드를 실행할 때 링크는 Triangulation_2 클래스에 대해 수행됩니다. 즉, Delaunay 삼각 측량을 실행하지 않고 정상적인 삼각 측량을 실행합니다 (자식 방법 대신 부모 클래스 메소드 실행).

Triangulation_2의 삽입 방법이 가상으로 선언되지 않으므로 재정의가 작동하지 않기 때문입니다.

이것에 대한 방법을 알고 있습니까? 아마도 sonstrained_triangulation_2 및 constrained_delaunay_triangulation_2를 사용합니까? (이 클래스는 몇 가지 가상 방법을 정의하지만 소스 코드를 읽었으며 명시 적 제약 조건을 추가하지 않고 사용할 수 있다고 생각하지 않습니다).

어떤 아이디어?

도움이 되었습니까?

해결책

나는 당신의 프로그램을 확인했는데, 당신은 일반 프로그래밍 모델에 맞도록 조금 재구성해야합니다. 코드가 무엇을하는지 기억하겠습니다 (사용 가능한 코드 github):

  1. 명령 줄을 읽습니다
  2. 옵션에 따라 힙의 삼각 측량 또는 delaunay_triangulation을 인스턴스화합니다.
  3. 메소드가 가상이라고 가정하면 일부 처리 에이 객체를 사용합니다 (그러나 그렇지 않습니다).

문제에 대한 해결책은 삼각 측량 유형을 템플릿 매개 변수로서 3 단계를 별도의 방법으로 배치하는 것입니다. 같은 것 (나는 당신의 유형과 이름을 사용합니다) :

template < class Triangulation >
void compute_mesh(int n_vertices, int max_x, int max_y)
{
    Triangulation t;
    // DO WHATEVER YOU WANT WITH t
}

그런 다음 주요 기능에서 다음과 같은 방식으로 Delaunay 또는 Non-Delaunay 삼각형의 사용을 트리거합니다.

if (triang_type == 'D') 
    compute_mesh<Delaunay>(n_vertices, max_x, max_y);
else 
    compute_mesh<Triangulation>(n_vertices, max_x, max_y);

다른 팁

이러한 기능이 가상이라고 확신합니까? 가상으로 정의되지 않으면 컴파일러는 파생 클래스 함수를 호출하지 않습니다.

CGAL 헤더를 보면서이 클래스에는 전혀 가상 기능이있는 것으로 보이지 않습니다.

CGAL은 가상 기능이 아닌 일반 프로그래밍을 사용합니다. 그것은 STL과 비슷하며 도메인만이 조금 더 어렵고 STL에서보다 알고리즘에 더 의존해야합니다.

코드의 작은 스 니펫 만 제공했기 때문에 문제에 대한 답은 무엇입니까?

Triangle *t = new Delaunay;

~와 함께

Triangulation *t = new Delaunay;

첫 번째. 도움이되지 않으면 유형 정의에서 자세한 내용을 추가하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top