如何从 Graphics
对象获取图形基元和指令? Leonid Shifrin 在帖子 Mathematica: Removing graphics primitives 中展示了如何删除它们。我尝试应用类似的东西,但我无法得到我想要的东西。考虑这个例子:
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
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]}]
请注意,左侧的图像绘制不正确。该图像仅使用
JoinedCurve
和 RGBColor
生成。它以某种方式设法错过了一种颜色,这就是为什么我们有一条黑线,然后其余的线有另一种颜色。另一个图像绘制正确,我们所做的只是删除出现在那里的所有 Polygons
和 Thickness
。我在这里做什么不同?我们不应该获得相同的地块吗? 最佳答案
我读:
您可以通过简单的替换来获得它:
First[ g2 /. Style[expr_, opts___] :> {opts, expr} ]
现在你写:
了解
g2
的内部结构后,只提取 Line
对象及其颜色很简单。它更简单,因为所有 Line
都用 Style
包装:tmp3 = Cases[g2,
Style[{lines__Line}, ___, color_RGBColor, ___] :> {color, lines},
Infinity];
Graphics[tmp3]
关于wolfram-mathematica - Mathematica : Obtaining graphics primitives and directives,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6400524/