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()

但是当然,这一次只允许一个对象(pointCloud.vtkActorvia的一个实例renderer.AddActor(pointCloud.vtkActor)等待一段时间,然后将其删除renderer.RemoveActor(pointCloud.vtkActor)

如何添加一些演员(我将使用 10 分钟的间隔,当时有多达 5 次地震),用计数器标记它,在每次循环迭代时增加计数器,当它达到5次迭代,去掉actor?

这里有更多关于这个问题的背景信息:Python/vtk - set each point size individual in a vtkPolyData object?

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 的(双链表)。actors 被插入到这个双端队列的左边,并且在每次迭代中最右边的值,如果它是一个“actor”,它就会从场景中移除并且场景被重新渲染。

请注意,我没有 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 回答