2013-07-22 22 views
2

我使用下面的代碼來填充點雲:How to display point cloud in vtk in different colors?Python/vtk - 在vtkPolyData對象中分別設置每個點的大小?

這些點是新西蘭現在地震的長,緯度和深度。

我想改變點的大小,將其縮小第四個值 - mag - 這是羣體中每個地震的震級數據。

我真的不熟悉vtk的包裝,並想知道如果任何人都可以指出在這一點我可以解決的演員,並改變每個點的大小:

代碼:

import vtk 
import csv 
import numpy 


class Points_Maker(object): 
    def __init__(self, fname): 
     self.fname = fname 
     self.points = [] 
     self.points_mag = [] 
     self.get_data() 

    def get_data(self): 
     reader = csv.reader(open(self.fname, "rb")) 
     for row in reader: 
      if "FID" in row[0]: 
       pass 
      else: 
       longitude = (float(row[3]) - 174) * 10 #de-localises value 
       latitude = (float(row[4]) + 41) * 10 #de-localises value 
       depth = float(row[5]) 
       magnitude = float(row[6]) 
       point = [longitude, latitude, depth] 
       point_and_mag = [[longitude, latitude, depth], magnitude] 
       point = numpy.asarray(point) 
       point_and_mag = numpy.asarray(point_and_mag) 
       self.points.append(point) 
       self.points_mag.append(point_and_mag) 

class VtkPointCloud: 

    def __init__(self, zMin=-0.0, zMax=100.0, maxNumPoints=1e6): #sets colou limits 
     self.maxNumPoints = maxNumPoints 
     self.vtkPolyData = vtk.vtkPolyData() 
     self.clearPoints() 
     mapper = vtk.vtkPolyDataMapper() 
     mapper.SetInput(self.vtkPolyData) 
     mapper.SetColorModeToDefault() 
     mapper.SetScalarRange(zMin, zMax) 
     mapper.SetScalarVisibility(1) 
     self.vtkActor = vtk.vtkActor() 
     self.vtkActor.SetMapper(mapper) 

    def addPoint(self, point): 
     mag = 10 
     if self.vtkPoints.GetNumberOfPoints() < self.maxNumPoints: 
      pointId = self.vtkPoints.InsertNextPoint(point[:]) 
      self.vtkDepth.InsertNextValue(point[2]) 
      self.vtkCells.InsertNextCell(1) 
      self.vtkCells.InsertCellPoint(pointId) 
     self.vtkCells.Modified() 
     self.vtkPoints.Modified() 
     self.vtkDepth.Modified() 


    def clearPoints(self): 
     self.vtkPoints = vtk.vtkPoints() 
     self.vtkCells = vtk.vtkCellArray() 
     self.vtkDepth = vtk.vtkDoubleArray() 
     self.vtkDepth.SetName('DepthArray') 
     self.vtkPolyData.SetPoints(self.vtkPoints) 
     self.vtkPolyData.SetVerts(self.vtkCells) 
     self.vtkPolyData.GetPointData().SetScalars(self.vtkDepth) 
     self.vtkPolyData.GetPointData().SetActiveScalars('DepthArray') 


def main(): 
    pm = Points_Maker("quake.csv") 
    pointCloud = VtkPointCloud() 
    for point_and_mag in pm.points_mag: 
     mag = point_and_mag[1] 
     point = point_and_mag[0] 
     pointCloud.addPoint(point) 
    renderer = vtk.vtkRenderer() 
    renderer.AddActor(pointCloud.vtkActor) 
    renderer.SetBackground(.2, .3, .3) #colour 
    renderer.ResetCamera() 

    # Render Window 
    renderWindow = vtk.vtkRenderWindow() 
    renderWindow.AddRenderer(renderer) 

    # Interactor 
    renderWindowInteractor = vtk.vtkRenderWindowInteractor() 
    renderWindowInteractor.SetRenderWindow(renderWindow) 

    # Begin Interaction 
    renderWindow.Render() 
    renderWindowInteractor.Start() 

if __name__ == '__main__': 
    main() 

points_and_mag數據的片段:

[[4.45699999999988, -5.540999999999983, 10.0391] 2.38] 
[[3.9390000000000214, -5.606999999999971, 17.7148] 3.7352] 
[[4.182999999999879, -5.519999999999996, 11.0938] 2.16] 
[[3.9979999999999905, -5.390999999999977, 8.5713] 2.4826] 
[[3.9560000000000173, -5.568000000000026, 12.1685] 3.5205] 
[[4.41900000000004, -5.381, 15.1953] 2.1109] 
[[4.507000000000119, -5.360999999999976, 14.3164] 2.5587] 
[[3.973000000000013, -5.688999999999993, 14.1406] 2.7651] 
[[4.139999999999873, -5.290000000000035, 10.9766] 2.6873] 
[[7.182999999999993, -3.92000000000003, 11.6797] 2.5306] 
[[4.07999999999987, -5.489999999999995, 17.4805] 5.7216] 
[[4.113000000000113, -5.416000000000025, 15.0195] 2.8919] 
[[3.7520000000000664, -6.462999999999965, 5.8203] 2.0667] 
[[7.727999999999895, -6.178999999999988, 29.0234] 2.0115] 

使用此:http://www.vtk.org/Wiki/VTK/Examples/Python/GeometricObjects/Display/Point

我必須弄清楚如何改變整個集的大小,這使我懷疑的點雲是一個演員,而不是每一個在點雲點的實例: -

def addPoint(self, point, mag): 
    if self.vtkPoints.GetNumberOfPoints() < self.maxNumPoints: 
     pointId = self.vtkPoints.InsertNextPoint(point[:]) 
     self.vtkDepth.InsertNextValue(point[2]) 
     self.vtkCells.InsertNextCell(1) 
     self.vtkCells.InsertCellPoint(pointId) 
     self.vtkActor.GetProperty().SetPointSize(mag*10) 
    self.vtkCells.Modified() 
    self.vtkPoints.Modified() 
    self.vtkDepth.Modified() 
    self.vtkActor.Modified() 

回答

1

啊,我理解了它。

我只需要在for循環內部有pointCloud = VtkPointCloud()的構造函數,該循環遍歷點,然後在該循​​環內步進renderer.AddActor(pointCloud.vtkActor)

相關問題