Отображение нескольких 2D-графиков в 3D с использованием графики в Mathematica? - PullRequest
7 голосов
/ 27 июня 2011

Учитывая следующее:

lalist = {{{{1, 1}, 1}, {{3, 3}, 1}, {{5, 5}, 1}},
          {{{1, 5}, 1}, {{3, 3}, 1}, {{5, 1}, 1}}}

enter image description here

Row[{
  Graphics[{
            Opacity[0.5],Red, 
            Disk @@@ lalist[[1]]}, 
            Frame -> True],
  Graphics[{
            Opacity[0.5],Blue, 
            Disk @@@ lalist[[2]]}, 
            Frame -> True]}
    ]

enter image description here

  • Возможно ли, что я готовлю блюз Диски "за" красными в 3 D сюжет?

Ниже не то, что мне нужно:

enter image description here

Ответы [ 3 ]

10 голосов
/ 27 июня 2011

Как это?

Graphics3D[{{Texture[
 Graphics[{Opacity[0.5], Blue, Disk @@@ lalist[[2]]}, 
  Frame -> True]], 
 Polygon[{{-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}}, 
 VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
    1}}]}, {Texture[
 Graphics[{Opacity[0.5], Red, Disk @@@ lalist[[1]]}, 
  Frame -> True]], 
Polygon[{{-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1}}, 
 VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
    1}}]}}, Lighting \[Rule] "Neutral"]

enter image description here

Многие из них с непрозрачностью .2:

tab = Table[{Opacity \[Rule] .2, 
Texture[Graphics[{Opacity[0.5], Blue, Disk @@@ lalist[[2]]}, 
  Frame -> True]], 
Polygon[{{-1, -1, z}, {1, -1, z}, {1, 1, z}, {-1, 1, z}}, 
 VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
    1}}]}, {z, -2, 2, 1}];
plt = Graphics3D[{tab}, Lighting \[Rule] "Neutral"]

enter image description here

и 400 не кажется большой проблемой с точки зрения скорости (вы можете легко изменить приведенный выше код, чтобы увидеть его).

РЕДАКТИРОВАТЬ: ОК, просто глупо, попробуйте это

Dynamic[Graphics3D[{{Texture[#], 
  Polygon[{{-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}}, 
   VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
      1}}]}, {Texture[Rotate[#, \[Pi]/2]], 
  Polygon[{{-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1}}, 
   VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
      1}}]}}, Lighting \[Rule] "Neutral"] &@Binarize[CurrentImage[]]]

, который дает

enter image description here

(или что-то в этом роде), вращающийся, обновляемый в реальном времени и т. Д.

9 голосов
/ 27 июня 2011

См. Решение, представленное на "Площадке для обеда: весело с Mathematica" здесь: http://mathgis.blogspot.com/2009/02/howto-display-2d-plot-in-3d.html

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

Использование прозрачных текстур для рендеринга этих кругов в слоях , как это делает ACL , - хорошее решение, если только вы не хотите взаимодействовать с результирующим 3D-объектом. Рендеринг трехмерных объектов, содержащих прозрачные элементы, выполняется программно, тогда как в противном случае это было бы сделано аппаратно :

В 3D-рендерере используются два различных метода сортировки полигонов.Для графических сцен без прозрачности используется аппаратно-ускоренный буфер глубины.В противном случае средство визуализации использует дерево разделов двоичного пространства для разделения и сортировки полигонов с любой точки зрения.Дерево BSP создается медленнее и не ускоряется аппаратно, но оно обеспечивает наиболее общую возможность поддержки полигонов.

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

Решение было бы использовать 3D-диски вместо полупрозрачных плоскостей с 2D-дисками в них.Поскольку в MMA нет 3D Disk s или Circle s, если вы хотите сделать что-то подобное, вы должны бросить свои собственные.Голая версия будет выглядеть примерно так:

myDisk[{x_, y_, z_}, r_] := 
 Polygon@Table[
               {x, y, z} + r {Cos[\[Phi]], Sin[\[Phi]], 0} // N,
               {\[Phi], 0, 2 \[Pi], 2 \[Pi]/200}
              ]

Ваши слои будут сгенерированы следующим образом:

Graphics3D[
 {
   EdgeForm[],
  {
   Red, 
   myDisk[{1, 1, 0.5}, 0.5],  
   myDisk[{0, 0, 0.5}, 0.5],   
   myDisk[{-1, -1, 0.5}, 0.5]
  },
  {
   Blue,  
   myDisk[{1, -1, -0.5}, 0.5],
   myDisk[{0, 0, -0.5}, -0.5], 
   myDisk[{-1, 1, -0.5}, 0.5]}
  }
 ]

enter image description here

...