Mặc dù câu hỏi của bạn không nói lên điều đó, tôi cho rằng bạn không muốn các cửa sổ trùng nhau.
Một cách tiếp cận cho vấn đề này là sử dụng một bộ giải hạn chế như Choco . Người ta chỉ cần viết ra các ràng buộc mã hóa vấn đề của bạn, điều chỉnh bộ giải để hành động theo cách thông minh, và sau đó để nó chạy. Điều này có nghĩa là tất cả những suy nghĩ bạn cần làm sẽ được dành cho việc tìm ra một cách tốt để mã hóa vấn đề, chứ không phải nghĩ ra một thuật toán và thực hiện lập trình và điều chỉnh. Đây là một câu trả lời một phần để giúp bạn bắt đầu.
Giả sử rằng kích thước màn hình bằng .xm a x× ym a x
Đối với mỗi cửa sổ, , bạn sẽ có một bộ biến và các ràng buộcx i , y i , h i , w iWtôixtôi, ytôi, htôi, wtôi
- xtôi, ytôi, htôi, wtôi≥ 0
- xi+wi≤xmax
- yi+hi≤ymax
- Có lẽ cũng có một số hạn chế về kích thước tối thiểu của các cửa sổ, ví dụ: và vv.htôi≥ 100
- Ràng buộc về khía cạnh: Nếu tỷ lệ khung hình là 3: 4, thì ràng buộc đó có thể là , trong đó là một số thuật ngữ lỗi nhỏ khác không cho phép không hoàn hảo kích thước cửa sổ, nếu không bạn sẽ hạn chế vấn đề.ε4 htôi- ε ≤ 3 wtôi≤ 4 htôi+ εε
Bây giờ bạn cần phải chăm sóc chồng chéo cửa sổ. Đối với mỗi cặp cửa sổ, , trong đó , bạn sẽ tạo ra các ràng buộc như sau, điều này cho thấy không có góc nào của xuất hiện trong . Đối với , tạo ràng buộc: i ≠ j W j W i ( x , y ) ∈ { ( x j , y j ) , ( x j + w j , y j ) , ( x j , y j + h j ) , ( x j + w j , y j + h jWtôi, Wjtôi ≠ jWjWtôi( x , y) ∈ { ( xj, yj) , ( xj+ wj, yj) , ( xj, yj+ hj) , ( xj+ wj, yj+ hj) }
- ¬ ( xtôi≤ x ≤ xtôi+ wj∧ ytôi≤ y≤ ytôi+ hj) .
Các ràng buộc được chỉ định cho đến nay chỉ mô tả các cửa sổ không chồng lấp không tràn ra các cạnh của màn hình, đáp ứng một số hạn chế kích thước tối thiểu và duy trì tỷ lệ khung hình của chúng.
Để có được sự phù hợp tốt, bạn cần chỉ định một số liệu nắm bắt ý nghĩa của việc bố trí tốt. Một khả năng là giả định rằng bạn muốn giữ cho các cửa sổ có kích thước gần bằng nhau và / hoặc bạn muốn giảm thiểu "khoảng trắng". Tôi không nghĩ rằng điều này có thể được chỉ định bằng Choco, nhưng có thể với một giải pháp ràng buộc khác (người khác có thể giúp đỡ ở đây).
Choco cho phép một người tối đa hóa wrt đến một hàm mục tiêu được chỉ định dưới dạng một biến duy nhất. Dựa trên ý tưởng này, bạn có thể tối đa hóa những điều sau đây:
- Σtôi( htôi+ wtôi)
bằng cách viết một ràng buộc và nói với Choco để tối đa hóa .c o s t = Σtôi( htôi+ wtôi)c o s t