Mathematica: получение графических примитивов и директив - PullRequest
3 голосов
/ 19 июня 2011

Как получить графические примитивы и директивы от объекта 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]]

output

g2 теперь является графическим объектом.Если вы посмотрите на InputForm из g2, то увидите, что этот графический объект состоит из Polygon s и 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]}]

output

Обратите внимание, что изображение слева нарисовано неправильно.Это изображение было создано с использованием только JoinedCurve с и RGBColor с.Каким-то образом удалось пропустить один цвет, поэтому у нас черная линия, а у остальных линий другой цвет.Другое изображение нарисовано правильно, все, что мы сделали, это удалили все Polygons и Thickness, которые появились там.Что я здесь делаю по-другому?Разве мы не можем получить те же самые участки?

1 Ответ

4 голосов
/ 19 июня 2011

Я прочитал:

Вместо этого я хотел бы получить список простых примитивов, я не хочу, чтобы они были внутри 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]
...