2012-01-06 22 views
37

Có một vài câu hỏi tương tự trên stackoverflow, nhưng không có câu hỏi nào có vẻ như cung cấp câu trả lời hữu hình cho người nào đó mà không hiểu rõ vấn đề NP-hard và thuật toán có thể hiểu được.Cách đóng gói thùng 2D được lập trình như thế nào?

Làm cách nào để thực hiện đóng gói thùng 2D đối tượng hình chữ nhật? Trong trường hợp của tôi, tôi đang cố gắng tập hợp một số hình ảnh thành một hình ảnh duy nhất, để sử dụng như một spritesheet, sử dụng số lượng nhỏ nhất của không gian. Mỗi hình ảnh có thể có các giới hạn cực kỳ khác nhau, nhưng không có giới hạn nào được đặt cho vùng chứa. Tôi đã hy vọng một ai đó hiểu biết về các thuật toán đóng gói thùng rác có thể giải thích cách thức này có thể đạt được lập trình, thay vì cung cấp tổng quan chung về phương pháp đóng gói thùng rác.

+1

http://www.codeproject.com/KB/web-image/rectanglepacker.aspx –

+1

Tôi thực sự đọc bài viết đó khá kỹ lưỡng, và trong khi nó đã cải thiện sự hiểu biết của tôi về việc đóng gói thùng, việc triển khai ví dụ của nó phụ thuộc rất nhiều vào các cấu trúc có sẵn trong C#. Ngay cả sau khi đọc qua mã nguồn được cung cấp, tôi không có ý tưởng làm thế nào anh ta hoàn thành một số bước cần thiết. – FrozenFire

Trả lời

20

I Googled "bin packing code" và đây là hit đầu tiên của tôi: http://codeincomplete.com/posts/2011/5/7/bin_packing/

Dưới đây là một bản tóm tắt: xây dựng một cây nhị phân. Mỗi nhánh cây có chứa một sprite. Mỗi nút lá đại diện cho không gian có sẵn. Ban đầu cây chỉ có nút gốc, biểu thị tất cả không gian có sẵn. Để thêm một sprite vào cây, tìm kiếm cây cho một nút trống (lá) đủ lớn để giữ hình sprite. Biến nút đó từ một lá thành một nhánh bằng cách thiết lập sprite là người cư ngụ của nút và cho nút hai con. Một đứa trẻ đại diện cho không gian còn lại ở bên phải của sprite; khác đại diện cho không gian còn lại bên dưới sprite và đứa trẻ đầu tiên.

Bài viết tôi đã liên kết ở trên giải thích điều này đầy đủ hơn, với sơ đồ và mã JavaScript. Nó cũng giải thích làm thế nào để tự động phát triển bảng ma trận thay vì chọn một kích thước cố định trước.

Các vấn đề liên quan