Làm cách nào để tạo một danh sách cạnh được kết nối gấp đôi với một tập hợp các phân đoạn dòng?


10

Đối với đồ thị phẳng được nhúng trong mặt phẳng, được xác định bởi một tập hợp các phân đoạn dòng , mỗi phân đoạn được biểu thị bằng các điểm cuối của nó . Xây dựng cấu trúc dữ liệu DCEL cho phân khu phẳng, mô tả thuật toán, chứng minh tính chính xác của nó và cho thấy độ phức tạp.G(V,E)E={e1,...,em}ei{Li,Ri}

Theo mô tả về cấu trúc dữ liệu DCEL này , có nhiều kết nối giữa các đối tượng khác nhau (ví dụ: đỉnh, cạnh và mặt) của DCEL. Vì vậy, một DCEL dường như khó xây dựng và bảo trì.

Bạn có biết bất kỳ thuật toán hiệu quả nào có thể được sử dụng để xây dựng cấu trúc dữ liệu DCEL không?

Câu trả lời:


8

Cấu trúc dữ liệu (quy ước phù hợp với bài viết 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 */
};

Thuật toán

  1. Đối với mỗi điểm cuối, tạo một đỉnh .

  2. Đối với mỗi phân đoạn đầu vào, tạo hai nửa cạnh và gán các đỉnh và cặp song sinh của chúng.

  3. Đối với mỗi điểm cuối, sắp xếp các nửa cạnh có đỉnh đuôi là điểm cuối đó theo thứ tự theo chiều kim đồng hồ.

  4. Đối với mỗi cặp nửa cạnh e1, e2theo thứ tự theo chiều kim đồng hồ, gán e1->twin->next = e2e2->prev = e1->twin.

  5. Chọn một trong các cạnh và gán nó làm đại diện cho điểm cuối. (Trường hợp thoái hóa: nếu chỉ có một nửa cạnh etrong danh sách được sắp xếp set e->twin->next = ee->prev = e->twin). Các con trỏ tiếp theo là một hoán vị trên nửa cạnh.

  6. Đối với mỗi chu kỳ, phân bổ và chỉ định một cấu trúc khuôn mặt .


2
Về cơ bản là một loạt các sổ sách sởn gai ốc. Đây có lẽ là lý do tại sao các tác giả sách giáo khoa miễn cưỡng đi vào chi tiết.
pshufb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.