2011-06-19 49 views
3

如何從Graphics對象獲取圖形原語和指令?列昂尼德Shifrin顯示如何刪除他們在後Mathematica: Removing graphics primitives。我試着應用類似的東西,但我無法得到我想要的東西。考慮下面這個例子: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現在是一個圖形對象。如果您查看g2InputForm,您會看到該圖形對象由Polygon s和JoinedCurve s組成。我想要做的就是遍歷所有g2的原始對象。如果我們試圖重複如下

objs = First[g2]; 
Table[Head[objs[[i]]], {i, 1, [email protected]}] 

我們得到

{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 s和RGBColor s生成。它以某種方式設法錯過一種顏色,這就是爲什麼我們有一條黑線,然後其餘的線條有另一種顏色。其他圖像繪製正確,我們所做的只是刪除那裏出現的所有PolygonsThickness。我在這裏有什麼不同?我們不應該得到相同的地塊嗎?

+0

圖片沒有顯示出來:因爲所有Line s的包裹Style那麼就更簡單了。 – gdelfino

+1

我重新上傳了圖像。 – jmlopez

回答

4

我讀:

我想做些什麼,而不是獲得是 簡單的原語的名單,我不 希望他們內部Styles

您只需通過簡單的更換得到它:

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

現在你寫:

這是一個嘗試僅獲得 線條和色彩

Kno翅膀g2的內部結構很簡單,只能提取其顏色的Line對象。

tmp3 = Cases[g2, 
    Style[{lines__Line}, ___, color_RGBColor, ___] :> {color, lines}, 
    Infinity]; 
Graphics[tmp3]