Размещение нескольких трехмерных объектов в Mathematica вместе в одном 3D-боксе - PullRequest
3 голосов
/ 17 января 2012

У меня есть 3D-поверхность, созданная ListPlot3D в Mathematica. Сама поверхность относительно плоская и в произвольной плоскости xy. Я хотел бы поместить эту поверхность поверх молекулы, либо сгенерированной из функции ChemicalData, либо введенной из .pdb или другого входа молекулы. Эта молекула также плоская и помещена снова в плоскость xy. Я хотел бы, чтобы эти два 3D-объекта были разделены некоторым расстоянием по z.

Конечная надежда состоит в том, что у меня будет поверхность потенциальной энергии, расположенная над этой плоской молекулой, которая все еще будет вращаться в 3D. Я использовал параметры Show и Graphics 3D безуспешно. Точки x, y на поверхности соответствуют точкам x, y на трехмерной молекуле, однако их можно легко масштабировать и смещать по мере необходимости. В качестве последнего варианта я полагаю, что я мог бы ввести координаты x, y, z атомов и использовать команду PointListPlot3D с различными опциями, чтобы имитировать внешний вид молекулы, но это, кажется, намного сложнее, чем нужно.

Другой подход, который может быть возможен, заключается в том, что оба 3D-объекта преобразуются в 3D-блоки и просто накладываются друг на друга. Однако я еще не нашел эту функциональность в Mathematica. У кого-нибудь есть идеи как это сделать?

PES = ListPlot3D[{{0., 0., -2.04900365`},..., {0., 0.3, -2.05743098`}}]
Show[Graphics3D[ChemicalData["Benzene","MoleculePlot"]],PES]

Проблема заключалась в том, что масштаб молекулы зависел от масштаба энергетической поверхности.

Единицы, насколько я могу судить, указаны в пикометрах. Однако их атомное расстояние, кажется, отключено на 3%.

В качестве обновления к этому стало намного проще брать координату xyz молекулы и вручную генерировать объекты. Прошло некоторое время, но я верю, если вы только заявите:

ChemicalData["Benzene","MoleculePlot"]

Mathematica покажет вам формат. Если вы сделаете многие из них, можно сделать довольно простой скрипт на python.

Ответы [ 2 ]

9 голосов
/ 17 января 2012

Что Сабольч сказал, и я также не понял из твоего вопроса, почему бы что-то вроде этой работы?

    Show[Graphics3D[
  Rotate[ChemicalData["Caffeine", "MoleculePlot"][[1]], 
   45 Degree, {1, .5, 0}]], 
 Plot3D[-200 + 50 Sin[x*y/10000], {x, -100 Sqrt[3*Pi], 
   100 Sqrt[3*Pi]}, {y, -100 Sqrt[3*Pi], 100 Sqrt[3*Pi]}, 
  ColorFunction -> "TemperatureMap"], Axes -> True]

enter image description here

4 голосов
/ 18 января 2012

ListPlot3D возвращает объект Graphics3D, поэтому вы можете комбинировать его с другими Graphics3D объектами ...

lp = ListPlot3D[  RandomReal[{}, {50, 3}], Mesh -> None];
sp = Graphics3D[Sphere[]];
Show[sp, lp, Boxed -> False]

a new gravatar

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

...