2010-03-19 3 views
4

가로 세로 비율이 Aitem (X : Y) 인 N 개의 직사각형 항목이 있습니다.
가로 세로 비가있는 직사각형 디스플레이 영역이 있습니다.직사각형 항목에 대해 최적화 된 격자

항목은 테이블과 같은 레이아웃 (예 : r 행, c 열)으로 배열해야합니다.

개개의 항목이 최대가되도록 이상적인 격자 행 x 열이 무엇입니까? (행 * 열> = N, 즉 "사용되지 않는"그리드 장소가있을 수 있음).

간단한 알고리즘으로 행 = 1..N을 반복하고, 필요한 열 수를 계산하고, 행/열 쌍을 가장 큰 항목으로 유지할 수 있습니다.

반복적이지 않은 알고리즘이 있는지 궁금합니다 (예 : Aitem = Aview = 1, 행/열은 sqrt (N)으로 근사 될 수 있음).

답변

2

참고 : 나는 프레드릭의 대답을 이해할 수 없어서 문제를 해결하고 같은 해결책으로 보입니다. 도움이되는 경우에 대비하여 내가 한 일을 설명 할 수도 있다고 생각했습니다.

처음에는보기의 종횡비를 항목의 종횡비로 정규화했습니다. (나는 당신이 아이템을 회전시키고 싶지 않다고 가정하고있다.) 이제 폭/높이 비율의 직사각형 포장

a = (view_width/view_height)/(item_width/item_height) 

a 사각형은 항목 뷰 포장 동등하다. 이상적인 경우 (현재 사각형의) 우리의 그리드 것 rc는 행과 열 번호가 어디에있는 우리에게

a = c/r 

을 줄 것, 완전히 사각형을 채우기 위해 :

N = r*c 

배가가 그리드 완벽 경우 /이 두 식을 분할하는 것은 rc, 우리에게

N*a = c^2    N/a = r^2 
c = sqrt(N*a)   r = sqrt(N/a) 

을 제공합니다 정수 수 있지만 r*c는 아직도 N보다 작은하지만 어디하지 않을 경우, 당신은 프레데릭이 언급 한 세 가지 옵션을 시도하고 일을 계속해야합니다 :

  • floor(r), ceil(c)
  • ceil(r), floor(c)
  • ceil(r), ceil(c)
+0

자세한 설명을 주셔서 감사합니다. 나는 여전히 무차별 강제 검색이 당신/Frederics 제안의 결과보다 "좋아 보인다"는 몇 가지 사례가 있습니다. 어쩌면 나는 아직도 라운딩으로 약간의 변화를 보이고 있지만 ... 나는이 파트 타임으로 놀고있다. – peterchen

0

좋은 질문입니다. 보기 치수에게 X의 B를 가지고 (고정) 및 항목 치수를 AXB (변수 극대화 할 수있는)가있는 경우에, 당신이 필요합니다

trunc(A/a) * trunc(B/b) >= N

내가 어떻게 아무 생각하지만이 문제를 해결하기 위해 - TRUNC를 비선형이기 때문에 까다로운 부분입니다.

1
솔루션에 쉽게 일반적인 경우 처리 향상시킬 수

:

을하면 우리는 (일시적으로), 우리가

행이 행과 열의 정수를 할 필요도 잊지 * 열 = N

= X * Y를 aitem

aview = 행 * X = 행 aitem *의 * y를

1 = 컬럼 * Y = (N/로우) * (aview/[AIT EM * 행) = N * aview/(aitem * rows²)

따라서

로우 =하면 SQRT (N * aview/aitem) 및 열 = N/로우 =하면 SQRT (N * aitem/aview) 다음

층 (행)과 바닥 (열)이 너무 작아서 (행과 열이 정수가 아닌 경우) 함께 솔루션이 될 수있는 반면에 ceil (행) 및 ceil (열)은 솔루션입니다. 편집

  • 층 (행) CEIL (열)
  • 천장을 만들다 (행) 바닥 (열)
  • 천장을 만들다 (행) CEIL (열)

이 3 개 가능한 솔루션을 잎을 사용하여 방정식을 수정하십시오. 첫 번째 결과가 잘못되었습니다. (의견보기)

+1

최종 방정식에서 [aitem * aview]는 오타라고 생각합니다. N = 2, aview = 6, aitem = 3 인 경우는 어떻습니까? 당신은 너무 많은 칼럼으로 끝날 것입니다. – mckeed

+0

오타가 아닙니다. 첫 번째 방정식에서 실수입니다. 여기서 aview와 aitem의 정의를 반대했습니다. 초기 공식이 동 질적이지 않기 때문에 당혹 스럽습니다 (예, 저는 물리학 자입니다). 간단한 테스트 케이스에 오류가 나타납니다. 가리켜 주셔서 감사합니다. 이제 테스트 케이스에 대해 2 행 1 열을 예상대로 얻었습니다. –

관련 문제