2011-02-20 6 views
2

나는 다음과 같은 텍스트가있는 경우 :경계 사각형의 너비를 계산하려면 어떻게해야합니까? 특정 비율에 맞게 줄 바꿈 된 텍스트?

나는 텍스트의 전체 폭을 알고

"안녕하세요이 화면의 사각형 영역에 표시 될 텍스트의 조각입니다".

주어진 비율에 따라 텍스트를 줄 바꿈 폭을 찾으려고합니다.

알고리즘이란 무엇입니까?

예를 들어 경계 사각형의 비율이 16 : 9 인 텍스트를 폭과 높이로 항상 줄 바꿈하려고합니다. 이것은 어떤 길이의 텍스트가 주어질 때 발생해야합니다.

아이디어가 있으십니까? 여기

답변

2

내가 의사에 그것을 할 것입니다 방법 나 또한 거기에 체크를 넣어 수

function calcWidth(string text, int rows, float ratio) 

    let H be int with value /* how many pixels high is a row? */ 
    let total_width be int with value 0 
    for each character c in string text 
     let total_width be total_width + pixel_width(c) 
    end for 

    let W = total_width/length(text) 

    /* RATIO = (H * row)/(W * col) */ 
    /* means col = (H * row)/(W * RATIO) */ 

    let cols be int with value (H * rows)/(W * ratio) 

    return cols 
end function 

그 5 행은 받아 들일 수없는, 그러나 6 행은 내가 5 그래서 내가 더 나은 6보다 알고, 더 나빴다 경우 이 경우 5를 반환합니다. 우리는 고정 폭 글꼴

을 알고

하자 리뷰 : 우리는 고정 폭 않았을 수도 있기 때문에

H * rows 
    ---------- = RATIO 
    W * cols 

지금, 우리는 알고 COLS 각 행에 대해 동일하지 않습니다. 그러나 행 수로 나눈 문자의 총 수로 cols를 근사 할 수 있습니다.

 H * rows 
    -------------- = RATIO 
    W * len/rows 

     H * rows^2 
    -------------- = RATIO 
     W * len 

이제 당신이 행을 제외하고 이러한 모든 변수를 알고, 그래서 행

이제 우리는 그 COLS 위에서 알
rows = roundUp (SQRT ( (RATIO * W * len)/h)) 

에 대한 해결은해야이 두 가지로 약

cols = (H * rows)/(W * ratio) 

입니다 귀하의 상자에 대한 괜찮은 추측.

오류 크기 및 여백에 따라보기 위해 렌더링해야 할 수도 있고, 추가 행 또는 두 행을 올리거나 내려갈 수도 있습니다.

+0

행이나 높이가없는 계산을 찾아야합니다. 가로 세로 비율 만. 경계 사각형의 가장 좋은 추측 너비를 계산하려고합니다. 그런 다음 단어별로 텍스트 단어를 래핑하고 높이를 계산하는 다른 함수로 전달합니다. – Skn3

+0

@ skn3은 이러한 요청을 충족하도록 개정되었습니다. – corsiKa

+0

이것은 효과가 있습니다. 감사합니다. – Skn3

0

단어 길이는 예측할 수 없기 때문에 생성 및 테스트보다 더 나은 방법이 없다고 생각합니다. 먼저 텍스트에 9/16-th의 단어 경계를 찾아 그 지점까지의 너비를 후보 너비로 사용하여 시작할 수 있습니다. 그런 다음 반복적으로 모든 텍스트를 감싸고 결과를 측정 한 다음 가능한 한 가까워 질 때까지 첫 번째 경계를 왼쪽 또는 오른쪽으로 한 단어 옮깁니다. 이렇게하면 첫 번째 줄과 상한선 및 하한선 (한 단어 이상 또는 한 단어 이하)에 대한 최적의 휴식 시간을 얻을 수 있습니다. 원할 경우 이진 검색을 사용하여 최적의 솔루션을 더 검색 할 수 있습니다.

+0

저는 계산의 실시간 성질 때문에 단어 랩 반복을 피하려고했습니다.나는 잘린 단어가 너무 많이 발생하지 않을 것이라는 점을 인정할 수 있기 때문에 단어의 길이에 대해 걱정하지 않는다. 초대 루프를 포함하지 않는 메소드를위한 아이디어는 없습니까? – Skn3