Lợi ích của việc sử dụng Half Edge so với Winged Edge là gì?


9

Đối với biểu diễn dạng lưới, lợi ích của việc sử dụng cấu trúc dữ liệu Half Edge so với Winged Edge là gì?

Tôi hiểu cả hai biểu diễn lưới, sự khác biệt duy nhất là một nửa cạnh sử dụng cạnh định hướng và cạnh có cánh sử dụng cạnh vô hướng. Cho đến nay, tôi không thể nghĩ được sự hữu ích của việc sử dụng cạnh định hướng là gì, nhưng nó chỉ giúp tiêu thụ nhiều bộ nhớ hơn.


1
"Sự khác biệt duy nhất là một nửa cạnh sử dụng cạnh định hướng và cạnh có cánh sử dụng cạnh vô hướng." Theo hiểu biết của tôi, giống như: Nửa cạnh được liên kết đôi (và mỗi hướng có thể chứa thông tin bổ sung), trong khi cạnh có cánh , thông thường nhất, chỉ ngược chiều kim đồng hồ.
David Kuri

Vì vậy, bạn có nghĩa là cách họ sử dụng liên kết đôi chỉ đơn giản để thêm thông tin rõ ràng? Bởi vì tôi nghĩ bằng cách sử dụng Half Edge, có thể có một số hiệu suất đạt được cho truy vấn cụ thể từ lưới. Nhưng cho đến bây giờ, tôi vẫn không thể tìm ra truy vấn nào ..
Bla ...

Mặc dù chúng tôi đang đại diện cho cạnh, đây là một bài viết tuyệt vời, khái quát rất nhiều trong số chúng: Graphics.cs.ucdavis.edu/~joy/ecs178/Unit-9/resource/
trộm

Câu trả lời:


7

Theo như tôi có thể nói, ưu điểm chính của nửa cạnh là việc di chuyển ngang có thể đơn giản hơn một chút do đảm bảo các cạnh có hướng ổn định trong mỗi mặt.

Xem xét vấn đề lặp trên tất cả các đỉnh hoặc cạnh của một mặt nhất định, theo thứ tự ngược chiều kim đồng hồ. Trong cấu trúc nửa cạnh, điều này có thể được thực hiện bằng cách bắt đầu với một nửa cạnh tùy ý của khuôn mặt đó và chỉ cần làm theo các con trỏ "tiếp theo" cho đến khi bạn quay lại nơi bạn bắt đầu.

Ngược lại, làm điều này trong một cấu trúc cạnh có cánh là một chút khó chịu, bởi vì các cạnh được định hướng tùy ý; bất kỳ cạnh nào bạn gặp có thể chỉ theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ so với khuôn mặt bạn đang cố gắng lặp lại, vì vậy bạn phải kiểm tra thêm có điều kiện ở mỗi bước để xem bạn nên đi qua cạnh hiện tại tiến hay lùi.

Các loại truy vấn kết nối khác hoạt động tương tự: phiên bản nửa cạnh cho phép bạn theo dõi các liên kết theo một trình tự nhất quán trong khi phiên bản có cánh yêu cầu kiểm tra định hướng ở mỗi bước.

Liệu các điều kiện có thực sự là một vấn đề hiệu suất cho cạnh có cánh hay không sẽ phụ thuộc vào các yếu tố khác. Đối với việc triển khai "ngây thơ" với các con trỏ mọi cách và dữ liệu nằm rải rác trong bộ nhớ, tôi hy vọng bộ nhớ cache sẽ bỏ qua bất kỳ tác động nào của các điều kiện. Mặt khác, nếu bạn có cấu trúc dữ liệu được đóng gói chặt chẽ với mọi thứ nóng trong bộ đệm, bạn có thể thấy một số hiệu ứng từ các điều kiện do dự đoán nhánh không chính xác, v.v. Thật khó để nói.

Để lại hiệu suất một mình, tôi thích nửa cạnh chỉ vì lý do dễ dàng hơn để viết và viết mã chính xác, ngay cả khi nó dẫn đến chi phí bộ nhớ nhỏ.

Nhân tiện, có một vài lựa chọn thiết kế khác với cấu trúc dữ liệu lưới thường có vẻ bị nhầm lẫn với cái này. Một nhà bình luận đã đề cập đến liên kết đơn và liên kết đôi, nhưng tự nhiên bạn có thể thực hiện liên kết đơn hoặc đôi với một nửa cạnh hoặc cạnh có cánh. (Mặc dù tôi không thấy cách liên kết đơn với cạnh có cánh thậm chí sẽ hoạt động, vì như đã đề cập ở trên, bạn có thể phải đi qua các cạnh hoặc lùi hoặc tiến trong quá trình truy vấn.)

Ngoài ra, có câu hỏi liệu cấu trúc đỉnh và mặt có lưu trữ một danh sách tất cả các cạnh của chúng hay chỉ một (và yêu cầu bạn đi qua các cạnh để tìm phần còn lại). Có một danh sách các cạnh có độ dài thay đổi trên mỗi đỉnh / mặt làm phức tạp đáng kể logic nếu bạn muốn thực hiện nó một cách hiệu quả (nghĩa là không có phân bổ heap riêng cho mỗi đỉnh / mặt), nhưng một lần nữa, điều này độc lập với việc các cạnh có phải là nửa cạnh không hoặc có cánh cạnh.

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.