Mathematica: получение графических примитивов и директив
Как вы получаете графические примитивы и директивы от Graphics
объект? Леонид Шифрин показал, как их удалить в посте Mathematica: Удаление графических примитивов. Я пытался применить что-то подобное, но я не могу получить то, что я хочу. Рассмотрим этот пример:
g1 = ListPlot3D[
{{0, -1, 0}, {0, 1, 0}, {-1, 0, 1}, {1, 0, 1}, {-1, 1, 1}},
Mesh -> {2, 2},
Boxed -> False,
Axes -> False,
ViewPoint -> {2, -2, 1},
ViewVertical -> {0, 0, 1},
MeshStyle -> RGBColor[0, 0.5, 0],
BoundaryStyle -> RGBColor[1, 0.5, 0]
];
g2 = ImportString[ExportString[g1, "PDF", Background -> None], "PDF"][[1]]
g2
теперь графический объект. Если вы посмотрите на InputForm
из g2
вы увидите, что этот графический объект состоит из Polygon
с и JoinedCurve
s. То, что я хотел бы сделать, это перебирать все примитивные объекты g2
, Если мы попытаемся выполнить итерацию следующим образом
objs = First[g2];
Table[Head[objs[[i]]], {i, 1, Length@objs}]
мы получаем
{Thickness, Polygon, Polygon, Polygon, Polygon, Style, Style, Style, Style,
Style, Style, Style, Style, Style, Style, Style, Style, Style, Style, Style,
Style, Style, Style, Style, Style, Style, Style, Style, Style, Style, Style,
Style, Style, Style, Style, Style, Style, Style, Style, Style, Style, Style,
Style, Style, Style}
Вместо этого я хотел бы получить список простых примитивов, я не хочу, чтобы они были внутри Styles
, Вот одна попытка получить только линии и цвета:
tmp1 = Cases[objs, (_JoinedCurve | _RGBColor), Infinity];
tmp2 = DeleteCases[objs, (_Polygon | _Thickness), Infinity];
GraphicsRow[{Graphics[tmp1], Graphics[tmp2]}]
Обратите внимание, что изображение слева нарисовано неправильно. Это изображение было создано с использованием только JoinedCurve
с и RGBColor
s. Каким-то образом удалось пропустить один цвет, поэтому у нас черная линия, а у остальных линий другой цвет. Другое изображение нарисовано правильно, все, что мы сделали, это удалили все Polygons
а также Thickness
что появилось там. Что я здесь делаю по-другому? Разве мы не должны получить те же участки?
1 ответ
Я читаю:
Вместо этого я хотел бы получить список простых примитивов, я не хочу, чтобы они были внутри
Styles
,
Вы можете получить его, просто заменив:
First[ g2 /. Style[expr_, opts___] :> {opts, expr} ]
Теперь вы пишете:
Вот одна попытка получить только линии и цвета
Зная внутреннюю структуру g2
просто извлечь только Line
объекты со своими цветами. Это еще проще, потому что все Line
с обернуты Style
:
tmp3 = Cases[g2,
Style[{lines__Line}, ___, color_RGBColor, ___] :> {color, lines},
Infinity];
Graphics[tmp3]