3

Graphicsオブジェクトからグラフィック プリミティブとディレクティブをどのように取得しますか? Leonid Shifrin は、投稿Mathematica: Removal 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ますJoinedCurve。私がやりたいことは、 のすべてのプリミティブ オブジェクトを反復処理できるようにすることです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。線と色のみを取得する 1 つの試みを次に示します。

 tmp1 = Cases[objs, (_JoinedCurve | _RGBColor), Infinity];
 tmp2 = DeleteCases[objs, (_Polygon | _Thickness), Infinity];
 GraphicsRow[{Graphics[tmp1], Graphics[tmp2]}]

出力

左の画像は間違って描かれていることに注意してください。この画像は と のみを使用して生成されJoinedCurveましRGBColorた。どういうわけか 1 つの色を逃したため、黒い線があり、残りの線は他の色になっています。Polygonsもう一方の画像は正しく描画されています。そこに表示されていたとをすべて削除Thicknessしただけです。ここで私は何をしていますか?同じプロットを取得するべきではありませんか?

4

1 に答える 1

4

私は読む:

代わりに取得したいのは、単純なプリミティブのリストです。内部には入れたくありませんStyles

単純な置換だけで取得できます。

First[ g2 /. Style[expr_, opts___] :> {opts, expr} ]

今、あなたは書きます:

これは、線と色のみを取得する 1 つの試みです。

その内部構造がわかれば、その色でオブジェクトg2だけを抽出するのは簡単です。すべての s が でラップされているLineため、さらに簡単です:LineStyle

tmp3 = Cases[g2, 
   Style[{lines__Line}, ___, color_RGBColor, ___] :> {color, lines}, 
   Infinity];
Graphics[tmp3]
于 2011-06-19T05:48:34.463 に答える