일련의 선 세그먼트가 지정된 이중 연결 에지리스트를 어떻게 구성합니까?


10

주어진 평면 그래프 라인 세그먼트 세트에 의해 규정되는 평면에 포함 된, 각 세그먼트 엔드 포인트에 의해 표현된다 . 평면 세분화를위한 DCEL 데이터 구조를 구성하고 알고리즘을 설명하며 정확성을 입증하고 복잡성을 보여줍니다.G(V,E)E={e1,...,em}ei{Li,Ri}

DCEL 데이터 구조에 대한이 설명에 따르면 , DCEL의 서로 다른 객체 (정점, 모서리 및면) 사이에는 많은 연결이 있습니다. 따라서 DCEL은 구축 및 유지 관리가 어려운 것 같습니다.

DCEL 데이터 구조를 구성하는 데 사용할 수있는 효율적인 알고리즘을 알고 있습니까?

답변:


8

데이터 구조 ( Wikipedia 기사 와 일치하는 규약 ) :

struct half_edge;

struct vertex {
    struct half_edge *rep;  /* rep->tail == this */
};

struct face {
    struct half_edge *rep;  /* rep->left == this */
};

struct half_edge {
    struct half_edge *prev;  /* prev->next == this */
    struct half_edge *next;  /* next->prev == this */
    struct half_edge *twin;  /* twin->twin == this */
    struct vertex *tail;     /* twin->next->tail == tail &&
                                prev->twin->tail == tail */
    struct face *left;       /* prev->left == left && next->left == left */
};

연산

  1. 각 끝점에 대해 꼭짓점을 만듭니다 .

  2. 각 입력 세그먼트에 대해 두 개의 반쪽 가장자리를 만들고 꼬리 정점과 쌍을 지정합니다.

  3. 각 끝점에 대해 꼬리 정점이 해당 끝점 인 반쪽을 시계 방향으로 정렬합니다.

  4. 반쪽 가장자리의 모든 쌍 e1, e2에 대해 시계 방향으로 e1->twin->next = e2및을 할당합니다 e2->prev = e1->twin.

  5. 반쪽 가장자리 중 하나를 선택하여 끝점의 대표자로 지정합니다. (축소 된 경우 : e정렬 된 목록에 절반이 하나만있는 경우 set e->twin->next = ee->prev = e->twin). 다음 포인터는 반 가장자리의 순열입니다.

  6. 모든 사이클에 대해 구조를 할당하고 할당하십시오 .


2
기본적으로 끔찍한 부기. 이것이 아마도 교과서 저자들이 상세하게 다루기를 꺼리는 이유 일 것입니다.
pshufb 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.