Class: Visualization

Inherits:
Object
  • Object
show all
Defined in:
lib/ip-world-map/visualization.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeVisualization

Returns a new instance of Visualization.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/ip-world-map/visualization.rb', line 6

def initialize
  @map_filename = $visualization_config.map_filename
  @raw_image = Magick::ImageList.new(@map_filename).first
  if $visualization_config.map_width || $visualization_config.map_height
      width  = $visualization_config.map_width  || @raw_image.columns
      height = $visualization_config.map_height || @raw_image.rows
      @raw_image.resize! width, height
  end
  new_frame
  @position_quantization_in_degrees = 0
  @opacity_visibility_threshold = 0.1
  @circle_radius = (map_size[:width] ** 1.25) / (map_size[:width] * $visualization_config.fill_dot_scale).to_f
  @points = {}
end

Instance Attribute Details

#circle_radiusObject

Returns the value of attribute circle_radius.



4
5
6
# File 'lib/ip-world-map/visualization.rb', line 4

def circle_radius
  @circle_radius
end

#position_quantization_in_degreesObject

Returns the value of attribute position_quantization_in_degrees.



4
5
6
# File 'lib/ip-world-map/visualization.rb', line 4

def position_quantization_in_degrees
  @position_quantization_in_degrees
end

Instance Method Details

#circle_parameters(center_x, center_y) ⇒ Object



33
34
35
# File 'lib/ip-world-map/visualization.rb', line 33

def circle_parameters center_x, center_y
  [ center_x, center_y, center_x + circle_radius, center_y ]
end

#displayObject



71
72
73
# File 'lib/ip-world-map/visualization.rb', line 71

def display
  @frame.display
end

#draw_positions(positions_lon_lat) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/ip-world-map/visualization.rb', line 48

def draw_positions positions_lon_lat
  @draw.fill($visualization_config.fill_dot_color)

  new_points = {}
  positions_lon_lat.each do |longitude, latitude|
    x, y = x_y_from_longitude_latitude(longitude, latitude)
    x, y = quantize_position(x, y)
    new_points[[x,y]] = PointInTime.new(x, y, $visualization_config.fill_dot_opacity, $visualization_config.fill_dot_lifetime)
  end

  @points = select_visible_points(@points)
  @points.merge!(new_points)

  @points.each do |key, point|
    @draw.fill_opacity(point.opacity)
    @draw.circle(*circle_parameters(point.x, point.y))
    point.age
  end

  @draw.draw(@frame)
  @frame
end

#map_sizeObject



21
22
23
# File 'lib/ip-world-map/visualization.rb', line 21

def map_size
  @map_size ||= { :width => @frame.columns, :height => @frame.rows }
end

#new_frameObject



75
76
77
78
# File 'lib/ip-world-map/visualization.rb', line 75

def new_frame
  @draw = Magick::Draw.new
  @frame = @raw_image.clone
end

#quantize_position(*position) ⇒ Object



37
38
39
40
# File 'lib/ip-world-map/visualization.rb', line 37

def quantize_position *position
  return position if @position_quantization_in_degrees == 0
  position.collect{ |element| element - element.remainder(@position_quantization_in_degrees) }
end

#scaleObject



25
26
27
# File 'lib/ip-world-map/visualization.rb', line 25

def scale
  @scale ||= { :x => 360.0 / map_size[:width], :y => 180.0 / map_size[:height] }
end

#select_visible_points(points) ⇒ Object



42
43
44
45
46
# File 'lib/ip-world-map/visualization.rb', line 42

def select_visible_points points
  #points.select{ |point| point.opacity >= @opacity_visibility_threshold }
  selected_points = {}
  points.each{ |key, point| selected_points[key] = point if point.opacity >= @opacity_visibility_threshold }
end

#x_y_from_longitude_latitude(longitude, latitude) ⇒ Object



29
30
31
# File 'lib/ip-world-map/visualization.rb', line 29

def x_y_from_longitude_latitude longitude, latitude
  [ (180 + longitude) / scale[:x], (90 - latitude) / scale[:y] ]
end