# File easy_vtk.rb, line 513
  def streamline( point, time, ds, options={} )
    accuracy = false
    method = false
    direction = false
    color = false
    type = false
    width = false
    normal = false
    vary = false
    vary_factor = false
    tube_sides = false
    options.each{ |key, val|
      case key
      when 'accuracy'
        accuracy = val
      when 'method'
        method = val
      when 'direction'
        direction = val
      when 'color'
        color = val
        if !(Array === color) || color.length != 3
          raise "color must be Array whose length is three"
        end
      when 'type'
        type = val
      when 'width'
        width = val
      when 'normal'
        normal = val
      when 'vary'
        vary = val
      when 'vary_factor'
        vary_factor = val
      when 'tube_sides'
        tube_sides = val
      else
        raise "option (#{key}) is invalid"
      end
    }
    stream = Vtk::StreamLine.new
    stream.SetInput( @grid )
    stream.SetStartPosition( *point )
    stream.SetMaximumPropagationTime( time )
    stream.SetStepLength( ds )
    stream.SetIntegrationStepLength( accuracy ) if accuracy
    stream.VorticityOn
    unless color
      stream.SpeedScalarsOn
    end
    if direction
      case direction
      when 'forward'
        stream.SetIntegrationDirectionToForward
      when 'backward'
        stream.SetIntegrationDirectionToBackward
      when 'both'
        stream.SetIntegrationDirectionToIntegrateBothDirections
      else
        raise "options['direction'] must be 'forward', 'backward', or 'both'"
      end
    end
    if method
      case method
      when 'rk2'
        stream.SetIntegrator( Vtk::RungeKutta2.new )
      when 'rk4'
        stream.SetIntegrator( Vtk::RungeKutta4.new )
      when 'rk45'
        stream.SetIntegrator( Vtk::RungeKutta45.new )
      else
        raise "options['direction'] must be 'rk2', 'rk4', or 'rk45'"
      end
    end
    if type
      case type
      when 'line'
        # do nothing
      when 'ribbon'
        filter = Vtk::RibbonFilter.new
        filter.SetInput( stream.GetOutput )
        filter.SetWidth( width ) if width
        filter.SetWidthFactor( 5 )
        if normal
          filter.SetDefaultNormal( *normal )
          filter.UseDefaultNormalOn
        end
        if vary
          case vary
          when 'off'
            filter.VaryWidthOff
          when 'scalar'
            filter.VaryWidthOn
          else
            raise "options['vary'] must be 'off' or 'scalar'"
          end
          filter.SetWidthFactor( vary_factor ) if vary_factor
        end
        stream = filter
      when 'tube'
        filter = Vtk::TubeFilter.new
        filter.SetInput( stream.GetOutput )
        filter.SetRadius( width/2 ) if width
        filter.SetNumberOfSides( tube_sides ) if tube_sides
        if normal
          filter.SetDefaultNormal( *normal )
          filter.UseDefaultNormalOn
        end
        if vary
          case vary
          when 'off'
            filter.SetVaryRadiusToVaryRadiusOff
          when 'scalar'
            filter.SetVaryRadiusToVaryRadiusByScalar
          when 'vector'
            filter.SetVaryRadiusToVaryRadiusByVector
          else
            raise "options['vary'] must be 'off', 'scalar', or 'vector'"
          end
          filter.SetRadiusFactor( vary_factor ) if vary_factor
        end
        stream = filter
      else
        raise "options['type'] must be 'line', 'ribbon', or 'tube'"
      end
    end
    mapper = Vtk::PolyDataMapper.new
    mapper.SetInput( stream.GetOutput )
    if color
      mapper.ScalarVisibilityOff
    end
    actor = Vtk::Actor.new
    actor.SetMapper( mapper )
    if color
      actor.GetProperty.SetColor( *color )
    end
    @ren.AddActor( actor )
    return nil
  end