Tôi đang tạo một thứ gì đó để đặt các mục tương tự với những gì Mac OS X thực hiện với các cửa sổ trong Exposé. Nó thích nghi với tỷ lệ khung hình của các mục và tỷ lệ khung hình của khu vực có sẵn.Exposé Layout Algorithm
Về cơ bản, khu vực có sẵn được chia thành các hàng và cột. Một mục được đặt trong mỗi ô (giao điểm của một hàng và cột). Các mục phải duy trì tỷ lệ khung hình (ở đây width/height
) mặc dù tỷ lệ khung hình của ô. Số lượng ô phải lớn hơn hoặc bằng số lượng mục. Trong trường hợp số lượng ô lớn hơn số lượng mục, hàng cuối cùng sẽ không được sử dụng đầy đủ. Mục tiêu là có càng nhiều khu vực sẵn có được sử dụng bởi các mặt hàng càng tốt. Tôi chắc chắn tỷ lệ khung hình của mỗi ô càng gần với tỉ lệ cỡ ảnh của mặt hàng càng tốt.
Các công việc sau tốt khi tỉ lệ diện tích có sẵn là tương đương với tỉ lệ màn hình của các hạng mục:
rows := round(sqrt(count));
columns := ceiling(sqrt(count));
đâu: count
là số mặt hàng; round(x)
vòng x
với giá trị tích phân gần nhất, làm tròn các trường hợp nửa chừng cách xa 0; và ceiling(x)
trả về giá trị tích phân nhỏ nhất không nhỏ hơn x
.
Tôi biết Compiz sử dụng các thuật toán tương tự sau đó, nhưng nó không đưa vào tài khoản các tỷ lệ khía cạnh của các mặt hàng và khu vực có sẵn:
rows := floor(sqrt(count + 1));
columns := ceiling(count/rows);
đâu: floor(x)
trả về giá trị không thể thiếu lớn nhất không lớn hơn x
.
Tôi gộp lại thuật toán O (n) sau đây để kiểm tra mọi kết hợp của hàng và cột và phù hợp nhất, nhưng chắc chắn có thuật toán O (1) vì nó tạo ra kết quả tương tự như đầu tiên (O (1)) thuật toán khi tỷ lệ khía cạnh của các mặt hàng và khu vực có sẵn đều giống nhau:
fit (itemCount, itemRatio, availableRatio)
{
bestRows := infinity;
bestColumns := infinity;
bestDiff := infinity;
for (rows := 1; rows <= count; rows += 1)
{
columns := ceiling(count/rows);
cellWidth := availableRatio/columns;
cellHeight := 1.0/rows;
cellRatio := cellWidth/cellHeight;
diff := abs(cellRatio - itemRatio);
if (diff < bestDiff)
{
bestRows := rows;
bestColumns := columns;
bestDiff := diff;
if (diff = 0)
break;
}
}
return (bestRows, bestColumns);
}
đâu: abs(x)
trả về giá trị tuyệt đối của x
.
Chú ý: Bạn có thể nhận thấy điều này không được tối ưu hóa ở tất cả
Vì vậy, cách tốt nhất để có diện tích có sẵn hầu hết sử dụng bởi các mặt hàng càng tốt là những gì? (Nói cách khác, làm thế nào để tìm thấy phù hợp nhất?)
Mọi thông tin đều tốt đẹp .. Tôi không thể tìm ra những gì để nghiên cứu, tôi dường như không thể tìm thấy bất cứ điều gì. Chỉ cần một tên chung cho vấn đề sẽ hoạt động. – vedosity
mà không có kiến thức apriori bạn sẽ phải xem xét ít nhất kích thước của mọi người, vì vậy mà đã có thể là O (n). Tôi không thể thấy bất kỳ cách hợp lý nào để biến nó thành O (1) trừ khi bạn có thêm thông tin. – lijie
Tất cả các mục đều có cùng tỷ lệ khung hình và có thể thay đổi kích thước miễn là tỷ lệ khung hình của chúng giống nhau. Bạn có thể nhìn vào nó như chiều rộng của chúng sẽ là tỷ lệ khung hình và chiều cao của chúng sẽ là 1, vì vậy kích thước là giá trị đã biết. – vedosity