2012-01-17 2 views
3

나는 mathematica에서 ListPlot3D로 만든 3D 표면을 가지고 있습니다. 표면 그 자체는 상대적으로 평평하고 임의의 평면 xy에 있습니다. 이 표면을 ChemicalData 함수에서 생성되거나 .pdb 또는 다른 분자 입력에서 입력 된 분자 위에 놓고 싶습니다. 이 분자는 평면이고 다시 xy 평면에 놓입니다. 나는이 두 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에서 형식을 표시합니다. 이들 중 많은 것을 수행한다면 상당히 간단한 파이썬 스크립트를 만들 수 있습니다.

+4

'Graphics3D'와'Show'로 시도한 것을 보여줄 수 있습니까? 관련 정보를 먼저 기재하고 가능한 경우 사례를 제공해주십시오. (즉, "이것은 내 코드이고,이 코드는 내가 얻은 것이며 결과는 내가 원하는 것과 다르다") – Szabolcs

+0

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

+0

샘플을 보내 주셔서 감사합니다. 질문을 체계적으로 정리하는 것이 바람직합니다. 따라서 수개월 또는 수년 후에 발견하는 사람들은 여전히 ​​질문을 배울 수 있습니다. 컨텍스트 내에서 질문을 편집하고이 코드를 포함 할 수 있습니까? 그것에서'edit' 링크를 사용하십시오. – Szabolcs

답변

9

Szabolcs가 말한 것과 나는 왜 당신의 질문에서이 작품과 같은 것이 없었을 까? 다른 Graphics3D 객체와 결합 할 수 있어야하므로

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

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

a new gravatar

비록 모든 것을 받고 같은 ...하는 Graphics3D 객체를 반환 크기는 도전이 될 것입니다 ...

+0

@posterity OP가 질문을 업데이트하기 전에이 코드를 사용하여 코드를 보여주었습니다. 그것은 어리석은 대답을 조금 보입니다. 아마도 ... :} – cormullion