2011-12-17 6 views
1

テキストがあります(かなり長いかもしれません)。そして、高さと幅のある容器があります。どのようにしてテキストをコンテナに合わせるのですか?文字間の間隔(カーニング)と単語間の間隔を調整することのみが可能です。テキストがあまりにも詰まっているかどうかは本当に気にしません。テキストをコンテナに収めます。

質問を言い換えると、私はコストが行の「詰め込み」であるところで、改行のための効率的なアルゴリズムが必要です。

私はTeXで使われているKnuth-Plassアルゴリズムについて知っていますが、実装するのはやや難しく、このシナリオで使用できるかどうかはわかりません。私は遺伝的アルゴリズムを使うこともできますが、それは過剰なものかもしれません。

+1

Knuth-Plassは、あなたが記述したシナリオのために正確に開発されたので、使用可能でなければなりません。簡単に言うと、問題を完全に理解するまでは、既存のアルゴリズムを可能な限り単純なものとみなします。コンピュータプログラムの複雑さは、理由のために導入されました。 – thiton

+0

TeXや他の言語でこれをやりたいですか? – Werner

+0

いくつかの他の言語 - 私は本当にそれが少なくとも幾分共通している限り、実際には気にしません。 –

答えて

0

ここにアイデアがあります。

まず、テキストを表示する線の数を推定します。その数をnとします。次に、テキスト内の文字数がcであると仮定して、テキストを改行して、floor(c/n)文字以上の文字が含まれていないようにします(これは貪欲に行うことができます)。cPerLineとしましょう。 (つまり、線の長さの差)

各文字の平均幅を(文字数に応じて)と仮定しますあなたが使用しているサイズで、Courier Newのような等幅フォントを使用したい場合は、wピクセルです。コンテナの幅がxの場合、簡単に文字間隔を計算することができます:floor(x/cPerline) - w行間隔も考慮する必要があります。したがって、各文字の平均高さがhで、コンテナの高さがyの場合、同様に行間はfloor(y/n) - hになります。

これはどんな方法でも役立ちました。

関連する問題