2012-01-17 11 views
3

私は、MathematicaのListPlot3Dによって作成された3Dサーフェスを持っています。サーフェス自体は比較的平面で、任意の平面xyにあります。私は、この表面を、ChemicalData関数から生成された分子または.pdbまたは他の分子入力から入力された分子の上に置きたいと思います。この分子もまた平面であり、xy平面内に再び配置される。私はこれらの2つの3Dオブジェクトをz距離だけ分離したいと思います。Mathematicaに複数の3Dオブジェクトを同じ3Dボックスに配置する

最終的な希望は、3Dで回転可能なこの平面分子の上に置かれる可能性のあるエネルギー表面を持つことです。私はShow and Graphics 3Dオプションを使って成功していません。表面上のx、y点は、3D分子上の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スクリプトを作成することができます。

+4

'Graphics3D'と' Show'で試したことを表示できますか?関連情報を最初に含め、可能な場合は例を提供してください。 (つまり、「これは私のコードで、これは私が得たもので、結果は私が望むものとは違う」) – Szabolcs

+0

PES = ListPlot3D [{{0.'0、0'、-2.04900365'}、... 、{0'、0.3'、-2.05743098'}} Show [Graphics3D [Chemical Data ["Benzene"、 "MoleculePlot"]]、PES] ' – Daniel

+0

サンプルをありがとう。質問を整理しておくことが望ましいので、おそらく数ヶ月または数年後にそれを見つけた人々は依然としてそれらから学ぶことができます。あなたの質問を編集し、このコードを文脈に含めることができますか?それに 'edit'リンクを使います。 – Szabolcs

答えて

9

Szabolcsが言ったことは、私もあなたの質問から何も得られなかったのですか?

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

+0

これは本質的に私がやっていることです、私は軸がなく、分子のスケールに気付かなかった。私は現在、分子を正しいサイズにスケールダウンしようとしています...根本的に異なるサイズのために、エネルギー表面が表示されない可能性があります。 – Daniel

3

ListPlot3Dあなたが他のGraphics3Dオブジェクトとそれを組み合わせることができるはずですので...、すべてが同じになっているが

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

a new gravatar

Graphics3Dオブジェクトを返します。サイズは挑戦になります...

+0

@posterity OPが質問を更新して、彼らが使っていたコードを表示する前に、このコメントを書きました。それは今、ちょっとばかげた答えに見える、と思う...:} – cormullion

関連する問題