Как создать символ в кружке в Mathematica?

Я знаю, что Framed используется для отображения рамки вокруг символа, как я могу показать круг вокруг символа?


person Andrew    schedule 29.10.2011    source источник
comment
Вы не возражаете, если на выходе будет объект Graphics?   -  person abcd    schedule 30.10.2011
comment
@yoda Если это можно поместить в ячейку DisplayFormula с обычными математическими символами TraditionalForm, например. поставить скобки вокруг него.   -  person Andrew    schedule 30.10.2011


Ответы (5)


Если вы не против микроуправления параметрами выравнивания, вы можете наложить символ пустого круга на символ:

TraditionalForm @ Style[
  Overlay[{x, Style[\[EmptyCircle], 24]}, Alignment -> {0.075, 0.16}]
, "DisplayFormula"
]

обведен x

Показанные параметры размера шрифта и выравнивания подходят для шрифта на моем компьютере, но вам, возможно, придется настроить их для получения хороших результатов на вашем экране. И снова настройте их для приличной распечатки. Следующие Manipulate могут помочь в этом процессе:

Manipulate[
  TraditionalForm @ Style[
    Overlay[
      {Style[x, xSize], Style[\[EmptyCircle], circleSize]}
    , Alignment -> {xAlign, yAlign}
    ]
  , "DisplayFormula"
  ]
, {{xSize, 12}, 8, 40, 1, Appearance -> "Labeled"}
, {{circleSize, 24}, 8, 40, 1, Appearance -> "Labeled"}
, {{xAlign, 0.075}, -1, 1, Appearance -> "Labeled"}
, {{yAlign, 0.016}, -1, 1, Appearance -> "Labeled"}
]

манипулятор настройки изображения

person WReach    schedule 30.10.2011

Вот попытка создать функцию, которая обводит произвольные выражения. Это довольно неуклюже, но я не могу придумать лучшего способа на данный момент.

circled =
    With[{m = Max@Rasterize[#,"RasterSize"]},
       Framed[
         Pane[#, {m, m}, Alignment -> Center],
         RoundingRadius -> 1*^6]
    ] &;


circled[1/x + y + z]

введите здесь описание изображения

person Mr.Wizard    schedule 30.10.2011
comment
Какая польза от написания 1*^6 вместо 10^6? - person abcd; 30.10.2011
comment
@yoda, ничего, просто привычка. 1*^6 — это мое большое значение по умолчанию, и когда я его вижу, я часто понимаю, что это просто произвольное большое число. Есть одна связанная вещь: в конце концов, с 1*^x на одну операцию меньше, чем с 10^x. Например: Timing[a = 1*^60000000;] и Timing[b = 10^60000000;]. - person Mr.Wizard; 30.10.2011
comment
@yoda Или, что более актуально: Timing@Do[1*^6, {50000000}] против Timing@Do[10^6, {50000000}]. - person Mr.Wizard; 30.10.2011
comment
@Мистер. Я не единственный, кто заметил запутанный код, который вы пишете в последнее время .... - person Dr. belisarius; 30.10.2011
comment
@bel Можешь сделать лучше? Смирись или заткнись. ;-)) (Знаю, это довольно некрасиво, но я, честно говоря, не могу придумать лучшего способа.) - person Mr.Wizard; 30.10.2011
comment
@Mr.Wizard Спасибо, я не знал об этой разнице в производительности. Однако в данном случае я думаю, что это больше сбивает с толку, чем обучает, но я понимаю, что привычки умирают с трудом. - person abcd; 30.10.2011
comment
@Мистер. Если вы хотите обрамлять целые выражения (а не только простые символы), размер панели [] должен учитывать наибольшую диагональ. См. circled["3((1/x+y+z)/h)\n2\nm\np"] - person Dr. belisarius; 30.10.2011
comment
@bel, что я должен видеть в этом примере? - person Mr.Wizard; 30.10.2011
comment
@belisarius это не то, что я вижу! Я думаю, это зависит от системы (или настроек?). i.stack.imgur.com/tARbx.gif - person Mr.Wizard; 30.10.2011
comment
@Мистер. Ха! Поэтому я опубликовал ответ, чтобы решить полусуществующую проблему :) - person Dr. belisarius; 30.10.2011
comment
@belisarius @Mr Я понимаю то, что получает Велисарий, но в TraditionalForm это больше похоже на то, что получает мистер Волшебник. - person Andrew; 30.10.2011

Framed может выбрать вариант RoundingRadius.

Framed[expr, RoundingRadius -> radius]

При меньших значениях radius углы кадра просто слегка закругляются, а при больших значениях кадр становится овалом или кругом.

person John Flatness    schedule 29.10.2011
comment
Комбинация нестандартных значений RoundingRadius и FrameMargins, кажется, делает это, но для каждого выражения, которое я хочу поместить в круг, требуется другая комбинация. - person Andrew; 30.10.2011
comment
Я надеялся, что вы будете в порядке с овалами... Я не знаю лучшего решения. - person John Flatness; 30.10.2011
comment
Может быть, есть способ программно вычислить правильные значения параметров. - person Andrew; 30.10.2011
comment
Кто-нибудь может сделать кнопку палитры, чтобы сделать это? У меня есть палитра с одной кнопкой, чтобы отменить выбор (из этого: mathematica.stackexchange.com/a/112407/ 23076), и я хотел бы добавить кнопку, чтобы автоматически обвести его. С палитрами я пока не дружу… - person ibeatty; 04.12.2016

Та же идея WReach, но попытка автоматического расчета:

cirBeli[x_] := 
 TraditionalForm@
    Style[Overlay[{#, 
       Style[\[EmptyCircle], 
        N@2 Norm[ImageDimensions[Rasterize[#]][[1 ;; 2]]]]}, 
      Alignment -> Center], "DisplayFormula"] &@x

cirBeli[x]

введите здесь описание изображения

person Dr. belisarius    schedule 30.10.2011
comment
В cirBeli[Sin[z^2]/Exp[z] + Integrate[Sin[x] Cos[x] Sqrt[x], x]] выражение не находится в середине круга. - person Andrew; 30.10.2011
comment
@Andrew Проблема в том, что [EmptyCircle] не центрирован по вертикали. Посмотрим, смогу ли я это исправить. - person Dr. belisarius; 30.10.2011

Использование Framed[] с RoundingRadius

f = Rasterize[#, "RasterSize"] &;
circledBeli[x_] := Framed[ x,
                    FrameMargins -> (Norm@f@x - Array[1 &, {2, 2}] f@x)/2,
                    RoundingRadius -> Norm@f@x];

circledBeli[Sin[z^2]/Exp[z] + Integrate[Sin[x] Cos[x] Sqrt[x], x]]

введите здесь описание изображения

circledBeli["3((1/x+y+z)/h)\n2\nm\np"]

введите здесь описание изображения

Изменить

Следующее, похоже, лучше работает с TraditionalForm:

f = ImageDimensions[Rasterize[#]][[1 ;; 2]] &;
g = Reverse[ImageDimensions[Rasterize[Rotate[#, Pi/2]]][[1 ;; 2]]] &;
h = Max /@ Transpose@{f@#, g@#} &;
circledBeli[x_] := 
  Framed[x, FrameMargins -> (Norm@h@x - Array[1 &, {2, 2}] h@x)/2, 
   RoundingRadius -> Norm@h@x];
t = TraditionalForm[Sin[z^2]/Exp[z] + Integrate[Sin[x] Cos[x] Sqrt[x], x]]
circledBeli[t]

введите здесь описание изображения

person Dr. belisarius    schedule 31.10.2011
comment
Как вы используете это с TraditionalForm? - person Andrew; 31.10.2011
comment
@Andrew Поскольку TraditionalForm отображает разные размеры по горизонтали и вертикали в Rasterize [], прямого пути нет, насколько мне известно. - person Dr. belisarius; 31.10.2011
comment
FWIW, этот метод ведет себя странно, когда окно уже, чем объект, по крайней мере, для меня. Пример: i.stack.imgur.com/ScOKg.gif - person Mr.Wizard; 31.10.2011
comment
@Мистер. Спасибо! Возможно, завтра еще раз посмотрю. Теперь пора спать. - person Dr. belisarius; 31.10.2011