2017-09-04 39 views
6

Screenshot of what I have (on the left) and what I'm trying to accomplish (on the right)Cần giúp đỡ sáp nhập một số hình chữ nhật

Hi, tôi có mớ hỗn độn đống lộn xộn này ở bên trái, đó là khá nhiều một mảng của hình chữ nhật với một số lỗ (đánh dấu màu đỏ). Tôi đang tìm một cách để kết hợp chúng theo cách mà tôi sẽ kết thúc với càng ít hình chữ nhật càng tốt và tốt nhất là hầu hết chúng sẽ càng gần hình vuông càng tốt. Nhìn vào hình ảnh bên phải, đó là loại điều tôi đang cố gắng hoàn thành, chỉ cần một chút đẹp hơn và tốt hơn là tự động hơn một chút.

Tôi cần điều này cho một trò chơi và nó sẽ không được thực hiện trong thời gian chạy vì vậy tốc độ không thực sự là một mối quan tâm (trừ khi nó cực kỳ chậm, bởi vì tôi phải làm điều đó trên một diện tích khá lớn) nhưng tôi chưa bao giờ phải làm điều gì đó như thế này trước đây và tôi thành thật không biết phải bắt đầu từ đâu.

Tôi đã cố gắng bruteforcing theo cách của tôi thông qua mảng, bắt đầu từ hình vuông bên trái và loại sáp nhập cho đến khi không còn gì để hợp nhất nhưng thực sự không hiệu quả vì không thể xem xét hợp nhất hình chữ nhật 3x2, 4x3 , vv ..

Nếu bạn có thể chỉ cho tôi bất kỳ thuật toán nào có thể xử lý loại điều này hoặc có ý tưởng về cách thực hiện điều này, nó sẽ được đánh giá cao. Cảm ơn!

+0

Tôi gặp vấn đề tương tự một chút trong khi trở lại: https: //stackoverflow.com/questions/11002205/find-all-rectangular-areas-with-certain-properties-in-a- ma trận Tuy nhiên trong trường hợp của tôi, các hình chữ nhật thu được có thể trùng lặp. Có lẽ bạn có thể thích ứng với điều đó, tìm tất cả các hình chữ nhật chồng chéo có kích thước tối đa, sau đó cho mỗi vùng được bao phủ bởi nhiều hình chữ nhật, thêm nó vào chính xác một trong những hình chữ nhật đó. – HugoRune

+0

chỉ vì vậy tôi hoàn toàn hiểu, là các hình chữ nhật được tạo ra từ việc vẽ các đường dọc/ngang trên một hình chữ nhật lớn và sau đó chọn một số hình chữ nhật được tạo ngẫu nhiên làm hình chữ nhật 'đỏ'? –

+0

Không, tôi bắt đầu với một tờ chỉ có hình chữ nhật màu đỏ và sau đó tôi cắt toàn bộ trang tính xung quanh. – Otopkin

Trả lời

2

Bạn có thể thử thuật toán tham lam. Tất nhiên nó sẽ không được tối ưu (tốt, bạn đã không xác định tiêu chí tối ưu nghiêm ngặt). Nhưng có lẽ nó sẽ thực hiện đủ tốt cho nhu cầu của bạn.

Vì vậy, bạn có thể thử:

  • Tìm một cặp hình chữ nhật có thể được sáp nhập với tổng diện tích tối đa
  • Thay thế chúng bằng những cái mới - kết quả của hoạt động hợp nhất
  • Lặp lại cho đến khi bạn không thể tìm một cặp phù hợp

Nếu bạn cũng quan tâm đến hình chữ nhật thu được gần vuông, bạn có thể cố gắng tối đa hóa một cái gì đó như a * totalArea + (1 - a) * (min_resulting_side/max_resulting_side) với giá trị phù hợp f hoặc 0 < a < 1.

+0

Vấn đề với việc kết hợp một cách mù quáng 2 hình chữ nhật là meme này có thể xuất hiện: http://i.imgur.com/4O1H1a6.png Nếu tôi tình cờ hợp nhất các màu xanh thì ngăn cản cụm trắng khổng lồ được hình thành, mà rõ ràng sẽ dẫn đến ít hình chữ nhật trong danh sách cuối cùng là một ưu tiên rất lớn – Otopkin

+0

@Otopkin Trong thuật toán của tôi trên mỗi bước, bạn phải hợp nhất cặp hình chữ nhật làm cho ** khu vực lớn nhất **. Cùng với đó bạn cũng có thể tìm thấy một ví dụ mà nó không tối ưu. Tôi chỉ hy vọng rằng cho ứng dụng cuộc sống thực của bạn, nó sẽ là đủ tốt. – algrid

+0

Tôi có thể sẽ làm một cái gì đó dọc theo những dòng này, nên cung cấp cho một cơ sở đủ tốt mà sau này tôi có thể tinh chỉnh bằng tay. Tôi nhìn vào một vài thuật toán giảm đa giác, loại chúng sử dụng cho các mô hình 3d và như vậy, trường hợp xấu nhất tôi có thể chuyển đổi thành lưới, mở nó trong Blender và sử dụng rofl của chúng. – Otopkin

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