2011-11-18 9 views
9

がそうのように、与えられた矩形を埋めるために、私は文字列は、「123」を言いたいと四角形を塗りつぶしてください:テキスト文字列が

Show[Plot[x, {x, 0, 1}], 
    Graphics[{EdgeForm[Thick], Yellow, Rectangle[{.1, .5}, {.4, .9}]}], 
    Graphics[Text[Style["123", Red, Bold, 67], {.1, .5}, {-1, -1}]]] 

a string in a rectangle

しかし、私の手にチューニングされたフォントサイズそこに(67)その長方形を埋めるように。 任意の文字列を任意の長方形に塗りつぶす方法はありますか?

答えて

8

これは既知の難しい問題だと私は信じています。私はis from John Fultz.

TextRect[text_, {{left_, bottom_}, {right_, top_}}] := 
Inset[ 
    Pane[text, {Scaled[1], Scaled[1]}, 
    ImageSizeAction -> "ResizeToFit", Alignment -> Center], 
    {left, bottom}, {Left, Bottom}, {right - left, top - bottom}] 

Show[ 
Plot[x, {x, 0, 1}], 
Graphics[{ 
    {EdgeForm[Thick], Yellow, Rectangle[{.1, .5}, {.4, .9}]}, 
    TextRect[Style["123", Red, Bold], {{.1, .5}, {.4, .9}}] 
}] 
] 

enter image description here

+0

ニースアプローチ。ところで、{Scaled [1]、Scaled [1]}の代わりにScaled [1]を使用すると、テキストは垂直に配置されます。 – DavidC

+0

@Davidありがとうございます。私はあなたの提案を試みたが、それは私のシステムでは機能しません。 : -/ –

+1

ペインオプションAlignment - > Centerを追加すると、テキストが中央に配置されます。 –

2

を見つけることができる最良の答えはここにポリゴンにマッピングされるテクスチャにテキストを変換し、代替的なアプローチです。これは、地域に合わせてテキストを延伸する機能がある

Show[Plot[x, {x, 0, 1}], 
    Graphics[{EdgeForm[Thick], Yellow, Rectangle[{.1, .5}, {.4, .9}]}], 
    Graphics[{Texture[ImageData[ 
     Rasterize[Style["123", Red, Bold], "Image", RasterSize -> 300, 
     Background -> None]]], 
     Polygon[{{0.1, 0.5}, {0.4, 0.5}, {0.4, 0.9}, {0.1, 0.9}}, 
     VertexTextureCoordinates -> {{0, 0}, {1, 0}, {1, 1}, {0, 1}}]}]] 

Mathematica graphics

の比較を容易にするための機能として(それは本当にもうテキストではないですので、を。):

(* Render string/style s to fill a rectangle with left/bottom corner {l,b} and 
    right/top corner {r,t}. *) 
textrect[s_, {{l_,b_},{r_,t_}}] := Graphics[{ 
    Texture[ImageData[Rasterize[s, "Image", RasterSize->300, Background->None]]], 
    Polygon[{{l,b}, {r,b}, {r,t}, {l,t}}, 
      VertexTextureCoordinates->{{0,0},{1,0},{1,1},{0,1}}]}] 
+0

ええと、私は四角形を完全に埋めるようにストレッチするのが好きです。しかし、私はこれを試してみると粒状に見えます。私は無駄にRasterSizeパラメータで遊んでみました。私は試し続けます。ありがとうブレット! – dreeves

+0

'ImageData'を省略すると、なぜうまくいかないのか分かりません。また、 '' Image''は '' Data''に変更することができます(そして 'ImageData'を省略します)。 – Szabolcs

+0

@Szabolcs私は ''データ ''を使うことを考えていませんでした。なんらかの理由で、 'Background - > None'はテクスチャに含まれているときは正しく動作しません。 (私は 'Texture'を使ってこのようなものを初めて作成したときに別の開発者に尋ねなければなりませんでした)。 –

1

示唆したソリューションPlotが存在しないときには機能しませんでしたが、PlotRangeオプションを使用して解決しました。私は関数でそれをラップしました。不透明度、テキストの色など。オプションにする必要があります。

textBox[text_, color_, position_: {0, 0}, width_: 2, height_: 1] := 
    Graphics[{ 
    { 
    color, Opacity[.1], 
    Rectangle[position, position + {width, height}, 
     RoundingRadius -> 0.1] 
    } 
    , 
    Inset[ 
    Pane[text, {Scaled[1], Scaled[1]}, 
     ImageSizeAction -> "ResizeToFit", Alignment -> Center], 
    position, {Left, Bottom}, {width, height}] 
    }, PlotRange -> 
    Transpose[{position, position + {width, height}}]]; 
関連する問題