0

vtk ライブラリを使用して、地震の動的マップを作成しています。

私はすでに静的なものを作成しました(ここを参照してください: https://github.com/yacobuk/QuakeCloudとここを参照してください: http://www.youtube.com/watch?v=4HVdTcI_ozI ) 基本的なアイデアが機能することを知っています、しかし今、私は時間をかけて地震を見せたいと思っています。

フレームを更新する方法とオブジェクトを追加/削除する方法を示すコード例がいくつかありますが、インスタンスをスピンアップし、数期間追跡してから削除する方法を理解することに行き詰まっています。

基本的な追加/削除コードは次のようになります。

for point_and_mag in pm.points_mag:
        time.sleep(0.5)
        mag = point_and_mag[1]
        point = point_and_mag[0]
        if mag > 2:
            pointCloud = VtkPointCloud(pm)
            pointCloud.addPoint(point, math.log(mag)*10)
            renderer.AddActor(pointCloud.vtkActor)
            renderer.ResetCamera()
            renderWindow.Render()
            time.sleep(0.3)
            renderer.RemoveActor(pointCloud.vtkActor)
            renderer.ResetCamera()
            renderWindow.Render()

しかしもちろん、これは一度に 1 つのオブジェクトしか許可しません ( pointCloud.vtkActorviaのインスタンスはrenderer.AddActor(pointCloud.vtkActor)しばらく待ってから、renderer.RemoveActor(pointCloud.vtkActor)

多数のアクターを追加するにはどうすればよいですか (10 分の間隔を使用します。その間に最大 5 回の地震がありました)、カウンターでタグ付けし、ループの反復ごとにカウンターをインクリメントし、到達したときに5 回繰り返して、アクターを削除しますか?

この質問には、さらにいくつかのコンテキストがあります: Python/vtk - vtkPolyData オブジェクトで各ポイント サイズを個別に設定しますか?

4

1 に答える 1

1

可能な(テストされていない)解決策は次のとおりです。

from collections import deque

# The number 5 indicates for how many iterations the actors should be rendered.
rendered_actors = deque([None] * 5, maxlen=5)

for point_and_mag in pm.points_mag:
    if rendered_actors[-1] is not None:
        renderer.removeActor(rendered_actors[-1])
        renderer.ResetCamera()
        renderWindow.Render()

    time.sleep(0.5)
    mag = point_and_mag[1]
    point = point_and_mag[0]
    if mag > 2:
        pointCloud = VtkPointCloud(pm)
        pointCloud.addPoint(point, math.log(mag)*10)
        rendered_actors.appendleft(pointcloud.vtkActor)
        renderer.AddActor(pointCloud.vtkActor)
        renderer.ResetCamera()
        renderWindow.Render()
    else:
        rendered_actors.appendleft(None)

このコードは、deque長さ 5 の (二重リンクされたリストである) を作成します。アクターはこの両端キューの左側に挿入され、各反復で右端の値が「アクター」の場合はシーンから削除され、シーンが再レンダリングされます。

私は vtk を持っていないので、このコードをテストできないことに注意してください。


ちょっとしたスタイル ノート: これは実際には非 Pythonic コード スタイルです。

for point_and_mag in pm.points_mag:
    mag = point_and_mag[1]
    point = point_and_mag[0]

タプルアンパッキングを使用します。

for point, mag in pm.points_mag:
    # ...
    if mag > 2:
        # ...
于 2013-07-24T07:06:17.720 に答える