ฉันจะสร้างรายการขอบที่เชื่อมต่อเป็นสองเท่าได้อย่างไรเมื่อได้รับชุดของส่วนของเส้น


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 = e2e2->prev = e1->twin

  5. เลือกหนึ่งในครึ่งขอบและกำหนดให้เป็นตัวแทนสำหรับจุดปลาย (ตัวพิมพ์เล็ก: ถ้ามีเพียงครึ่งเดียวeในรายการที่เรียงลำดับset e->twin->next = eและe->prev = e->twin) พอยน์เตอร์ตัวต่อไปคือการเรียงสับเปลี่ยนบนขอบครึ่ง

  6. ทุกรอบให้จัดสรรและกำหนดโครงสร้างใบหน้า


2
โดยทั่วไปพวงของการทำบัญชี gnarly นี่อาจเป็นสาเหตุที่ผู้เขียนตำราเรียนไม่เต็มใจที่จะลงรายละเอียด
pshufb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.