Заполнение объекта Graphics3D - PullRequest
3 голосов
/ 28 июля 2011

Вот проблема, которую я не знаю, можно ли решить в Mathematica.

(* Courtesy to Lunchtime Playground Blog *)
to3d[plot_, height_, opacity_] :=
Module[{newplot}, newplot = First@Graphics[plot];
newplot = N@newplot /. {x_?AtomQ, y_?AtomQ} -> {x, y, height} /. 
Arrowheads[List[List[x_, y_, notz_]]] -> 
 Arrowheads[List[List[x, y]]];newplot /.GraphicsComplex[xx__] -> {Opacity[opacity], GraphicsComplex[xx]}];
(* A function to combine 2D Graphics object in Mathematica *)
test[list_]:=VectorQ[list,SameQ[Head[#],Graphics]&];
My3DPlot[list_?(test[#]&),height_?(VectorQ[#,NumberQ]&),opacity_?(VectorQ[#,NumberQ]&),opts:OptionsPattern[]]:=Block[{a},a=MapThread[Graphics3D[to3d[#1,#2,#3]]&,{list,height,opacity}];
Show[a,opts]
]
(* List of 2D graphics *)
list=Table[ContourPlot[y+Sin[x^i+i y],{x,-3,3},{y,-3,3},Contours->15,ContourLines->False,ColorFunction->RandomChoice[ColorData["Gradients"]]],{i,{1,2,3,4}}];
(* List of heights where you want to place the images *)
height={-.5,0,.5,1};
(* List of opacities you want to apply to your 2D layers *)
opacity={1,.8,.7,.5};
(* The function inherits all the options of standard Graphics3D as they are passed through the Show command *)
My3DPlot[Reverse@list,height,opacity,Lighting->"Neutral",BoxRatios->{1,1,.9},Axes->True]

Теперь это возвращает классную картинку, подобную этой. enter image description here

Здесь мой вопрос: возможно ли создать заливку для этих 2D слоев, используя те же функции цвета, которые используются, например, на контурных графиках? Цель состоит в том, чтобы заполнить пустоту между этими 2D слоями некоторым light или color , который непрерывно изменяется в соответствии с цветовой функцией соседнего слоя.

Я надеюсь, что это можно сделать в Mathematica, но мои ограниченные знания в графике Mathematica затрудняют это для меня.

1 Ответ

0 голосов
/ 28 июля 2011

Это должно быть возможно.Texture можно использовать для создания 3D-текстуры.Пример, приведенный в документации:

data = Table[{r, g, b}, {r, 0, 1, 1/20}, {g, 0, 1, 1/20}, {b, 0, 1, 1/20}];

Graphics3D[
  {
   Opacity[1/3], 
   Texture[data], 
   EdgeForm[], 
   Polygon[Table[{{0, 0, z}, {1, 0, z}, {1, 1, z}, {0, 1, z}}, {z, 0, 1, 1/20}], 
   VertexTextureCoordinates -> 
    Table[{{0, 0, s}, {1, 0, s}, {1, 1, s}, {0, 1, s}}, {s, 0, 1, 1/20}]]
  },
  Lighting -> "Neutral"
]

enter image description here

Имитирует объем, используя большой набор плоскостей.Вы можете сделать то же самое.Все, что вам нужно сделать, это описать трехмерную текстуру, которая должна интерполировать плоскости, которые у вас уже есть. Blend будет функцией, которая будет использоваться здесь.Для каждого столбца пикселей в вашем кубе цвет изменяется как Blend[{col1,col2,col3,...},x] с x, изменяющимся от 0 до 1, и цветом coli в i-й плоскости, заданным контурными диаграммами.

Основная проблема заключается в том, что3D полупрозрачный объект с нечеткими цветовыми градиентами не очень хорошо визуализируется.

...