2017-03-25 19 views
0

私はpythonコードを使って任意のシステムの軌道の動きをシミュレートしています。いくつかのサークルの位置をアニメーション化するためにFuncAnimationを使用しています。可能な限り一般化しようとしているので、フレームごとに更新された異なるパッチの配列が良いアイデアだと思っていました。 1次TypeError: 'Circle'オブジェクトはインデックス作成をサポートしていません

# This class method is the core of the animation and how the different CelestialBodies interact. 
def Animation(self,a): 
    for u in range(len(self.system)-1): 
     self.system[u].Position(self.system) 
     self.patches[u].center = (self.system[u].P[-1][0],self.system[u].P[-1][1]) 
    return self.patches 

# This is the main class method, which combines the rest of methods to run the animation. 
def run(self): 
    # Create the axes for the animation 
    fig = plt.figure() 
    ax = plt.axes() 
    ax.axis('scaled') 
    ax.set_xlim(-self.max, self.max) 
    ax.set_ylim(-self.max, self.max) 

    # Create the patches and add them to the axes 
    self.patches = [] 
    for q in range(len(self.system)-1): 
     self.patches.append(plt.Circle(plt.Circle((0,0), 695700000, color='black'))) 
     ax.add_patch(self.patches[q]) 
    # Call the animation and display the plot 
    anim = FuncAnimation(fig, self.Animation, init_func=self.init, frames=10, repeat=True, interval=1, blit=False) 
    plt.title("Solar System - Numerical Intregation Simulation") 
    plt.xlabel("Position in x (m)") 
    plt.ylabel("Position in y (m)") 
    plt.grid() 
    plt.show() 
# Constructor for the animation 
def init(self): 
    return self.patches 

全体のトレースバックは、次のとおりです:ここでTypeError: 'Circle' object does not support indexing

アニメーション用のコードの一部です:

Traceback (most recent call last): 
    File "SolarSystem4.py", line 145, in <module> SolarSystem.run() 
    File "SolarSystem4.py", line 132, in run ax.add_patch(self.patches[q]) 
    File  "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/axes.py", line 1562, in add_patch 
self._update_patch_limits(p) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/axes.py", line 1580, in _update_patch_limits 
xys = patch.get_patch_transform().transform(vertices) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/patches.py", line 1256, in get_patch_transform 
self._recompute_transform() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/patches.py", line 1240, in _recompute_transform 
center = (self.convert_xunits(self.center[0]), 
TypeError: 'Circle' object does not support indexing 
しかし、私はそれを実行するたびにこのエラーを取得しています
+0

全体のトレースバックを投稿してください。 – leovp

+0

あなたはそれを持っています。ありがとうございました。 –

答えて

0

run関数のforループ内の最初の行に問題があるようです。ここに:

self.patches.append(plt.Circle(plt.Circle((0,0), 695700000, color='black'))) 

あなたはCircleオブジェクトを作成し、別のCircleオブジェクトのコンストラクタの最初の引数としてそのオブジェクトを渡しています。 Circle.__init__への最初の引数は、円の中心のxy座標です。あなたが二Circleを作成しているとき、それはその最初の引数としてフォーム(x,y)のタプルを期待しているが、代わりに全体ではなくCircleオブジェクトを取得しているので、それはのような属性で終わる:代わりの

self.center = Circle(....) 

_recompute_transform方法はself.center属性という指標にしようとしていると呼ばれるまで

self.center = (0,0) # or some other coordinates 

これは、問題が発生することはありません。タプルのインデックス付けは問題ありませんが、Circleのインデックスを作成できないため、エラーが発生します。一度に1 Circleを作り、その__init__方法、それが期待する引数を与える、つまり

self.patches.append(plt.Circle((0,0), 695700000, color='black')) 

:修正するには、問題のある行を次のように変更します。

関連する問題