2011-11-18 35 views
9

Giả sử tôi muốn có một chuỗi, nói "123", để điền vào một hình chữ nhật được đưa ra, như vậy:Thực hiện một chuỗi văn bản điền vào một hình chữ nhật

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

Nhưng tôi trao chỉnh cỡ chữ ở đó (67) để nó lấp đầy hình chữ nhật. Làm thế nào bạn tạo một chuỗi tùy ý lấp đầy một hình chữ nhật tùy ý?

Trả lời

8

Tôi tin rằng đây là một vấn đề khó biết. Câu trả lời tốt nhất mà tôi có thể tìm thấy 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

Cách tiếp cận tốt đẹp. BTW, văn bản sẽ căn giữa theo chiều dọc nếu bạn sử dụng 'Scaled [1]' thay vì '{Scaled [1], Scaled [1]}'. – DavidC

+0

@David cảm ơn bạn. Tôi đã thử đề xuất của bạn, nhưng nó không hoạt động trên hệ thống của tôi. : -/ –

+1

Thêm tùy chọn Ngăn xếp -> Trung tâm sẽ căn giữa văn bản. –

2

Dưới đây là một cách tiếp cận thay thế có thể chuyển đổi các văn bản để một kết cấu đó được ánh xạ tới một đa giác. Này có các tính năng của kéo dài văn bản để phù hợp với khu vực

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

Là một chức năng để so sánh dễ dàng hơn (vì nó không thực sự văn bản nữa.):

(* 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

Ooh, tôi thích ý tưởng kéo dài nó để lấp đầy hình chữ nhật. Nhưng nó trông có vẻ sần sùi khi tôi thử điều này. Tôi đã thử chơi với tham số RasterSize không có kết quả. Tôi sẽ tiếp tục cố gắng. Cảm ơn Brett! – dreeves

+0

Tôi không hiểu tại sao nó không hoạt động nếu bạn bỏ qua 'ImageData'. Ngoài ra, có vẻ như '' Image "' có thể được thay đổi thành '" Data "' (và sau đó bỏ qua 'ImageData'). – Szabolcs

+0

@Szabolcs Tôi đã không cân nhắc sử dụng '" Dữ liệu "'. Đối với một số lý do, 'Background -> None' không hoạt động chính xác nếu không được bao gồm trong kết cấu. (Tôi đã phải hỏi một nhà phát triển lần đầu tiên tôi tạo ra một cái gì đó như thế này bằng cách sử dụng 'Texture'.) –

1

Các giải pháp đề nghị không hoạt động khi Lô đất không có ở đó, tôi đã sử dụng tùy chọn PlotRange để giải quyết nó. Tôi bọc nó trong một chức năng; Độ mờ, màu văn bản, v.v. nên được đưa vào các lựa chọn;

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}}]]; 
Các vấn đề liên quan