2012-11-27 15 views
8

का उपयोग करके मैटलप्लिब के साथ एक क्षुद्रग्रह का मॉडलिंग करना मैं plot_surface और plot_wireframe का उपयोग कर क्षुद्रग्रह का मॉडल करने की कोशिश कर रहा हूं। मेरे पास क्षुद्रग्रह की सतह पर बिंदुओं के लिए एक्स वाई और जेड मान हैं। वायरफ्रेम क्षुद्रग्रह के आकार के लिए सटीक है लेकिन सतह की साजिश वायरफ्रेम फिट नहीं है। मैं wireframe फिट करने के लिए सतह साजिश कैसे प्राप्त कर सकता हूं या मैं 3 डी ठोस मॉडल प्राप्त करने के लिए वायरफ्रेम का उपयोग कैसे कर सकता हूं? यहाँ मॉडल के लिए मेरी कोड है:सतह और वायरफ्रेम

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib import cm 
from matplotlib.mlab import griddata 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
data = np.genfromtxt('data.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

ax.plot_wireframe(x, y, z, rstride=1, cstride=1, alpha=1) 

xi = np.linspace(min(x), max(x)) 
yi = np.linspace(min(y), max(y)) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi) 


surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, 
     linewidth=0, antialiased=False) 
ax.set_zlim(-1.01, 1.01) 

plt.show() 

डेटा, इस प्रारूप में हालांकि वहाँ मूल फ़ाइल में एक बहुत अधिक पंक्तियां हैं:

-1.7738946051191869E-002 4.3461451610545973E-002 1.3393057231408241  
-0.29733561550902488  0.32305812106837900  1.3393057231408241  
-0.29733561550902488  0.16510132228266330  1.3548631099230350  
-0.21872587865015569  2.4170900455101410E-002 1.3610011616437809  
1.4452975249810950E-002 -0.20900795344486520  1.3610011616437809  
1.5732454381265970E-002 -0.20900795344486520  1.3608751439485580  
-0.34501536374240321  0.51320241386595655  1.3158820995876130  
-0.40193014435941982  0.45628763324893978  1.3158820995876130  
-0.42505849480150409  0.28183419537116011  1.3307863198123011  
-0.18994178462386799  -0.19294290416565860  1.3424523041534830  
1.4452975249810939E-002 -0.39733766403933751  1.3424523041534830  
5.8021940902131752E-002 -0.57108837516584876  1.3210481842104100  
9.3746267961881152E-002 -0.61017602710257668  1.3136798474111200  
0.26609469681891229  -0.43782759824554562  1.3136798474111200  
    0.17938460413447810  0.39179924148155021  1.2357401964919650  
    8.9613011902522258E-002 0.42818009222325598  1.2584008460875080  
    0.33671539027096409  -0.47165177581327772  1.2965073126705291  
    0.53703772594296528  -0.47165177581327777  1.2357401964919561  
-0.19242375014122229  0.71021685426700043  1.2584008460875080  
-0.34501536374240321  0.66763766324752027  1.2904902860951690 

आशा है कि आप मदद कर सकते हैं

+1

मैं http://code.enthought.com/projects/mayavi/ में देख सिफारिश करेंगे जो 'vtk' लाभ उठाता है और ज्यादा बेहतर 3 डी प्रदान करता है:

एक चक्र की निम्न उदाहरण मेरी बात को वर्णन करना चाहिए 'matplotlib' से समर्थन। – tacaswell

+0

दिलचस्प समस्या, क्या आप पूरे डेटा के लिए एक लिंक पोस्ट कर सकते हैं? –

+0

मैं @tcaswell से सहमत हूं: matplotlib का 3 डी वास्तव में इस पर निर्भर नहीं है; http://stackoverflow.com/questions/6030098/how-to-display-a-3d-plot-of-a-3d-array-isosurface-in-matplotlib-mplot3d-or-simil देखें कि कैसे मायावी का उपयोग किया गया था 3 डी वॉल्यूम डेटा के isosurfaces प्रस्तुत करें (काफी समस्या नहीं है)। – timday

उत्तर

2

सका आप क्या हो रहा है की एक छवि प्रदान करते हैं? मुझे लगता है कि आपको एक ऐसी छवि मिल रही है जहां क्षुद्रग्रह की सतह पूरी जगह पर कूद रही है। क्या वो सही है? यदि ऐसा है तो यह प्लॉटटर के कारण हो सकता है जो अंक के क्रम को नहीं जानता है।

यदि हमारे पास अंक का एक सेट है, जिसमें यूनिट सर्कल के सभी बिंदु शामिल हैं, तो हम उन बिंदुओं के चित्र को यूनिट सर्कल बनाने की अपेक्षा करेंगे। यदि, हालांकि, आपने प्रत्येक बिंदु को दो अन्य बिंदुओं से जोड़ने का निर्णय लिया है, तो यह आवश्यक रूप से एक सर्कल की तरह नहीं दिखता है। यदि (किसी कारण से) आपने सर्कल के दूसरी तरफ एक बिंदु को एक बिंदु से जोड़ा और तब तक ऐसा करना जारी रखा जब तक कि प्रत्येक बिंदु दो अन्य बिंदुओं से कनेक्ट न हो, यह एक सर्कल की तरह दिख सकता है या नहीं, क्योंकि प्रत्येक बिंदु नहीं है जरूरी बिंदुओं से जरूरी है।

आपके क्षुद्रग्रह के लिए भी यही सच है। आपको कुछ योजनाओं के साथ आने की जरूरत है ताकि साजिशकर्ता जानता है कि अंक कैसे कनेक्ट करें, अन्यथा आपको एक ही समस्या जारी रहेगी।

import math 
import matplotlib.pylab as plt 
import random 

thetaList = range(360) 
random.shuffle(thetaList) 
degToRad = lambda x: float(x) * math.pi/float(180) 
x = [math.cos(degToRad(theta)) for theta in thetaList] 
y = [math.sin(degToRad(theta)) for theta in thetaList]  

#plot the cirlce 
plt.plot(x,y) 
plt.show() 
संबंधित मुद्दे