kamelopard 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,16 +1,16 @@
1
+ # encoding: utf-8
1
2
  # vim:ts=4:sw=4:et:smartindent:nowrap
2
3
 
3
4
  # Classes to manage various KML objects. See
4
5
  # http://code.google.com/apis/kml/documentation/kmlreference.html for a
5
6
  # description of KML
6
7
 
7
- # XXX gx:balloonVisibility isn't represented here. Fix that.
8
-
9
8
  module Kamelopard
10
9
  require 'singleton'
11
10
  require 'kamelopard/pointlist'
12
11
  require 'xml'
13
12
  require 'yaml'
13
+ require 'erb'
14
14
 
15
15
  @@sequence = 0
16
16
  @@id_prefix = ''
@@ -396,7 +396,7 @@ module Kamelopard
396
396
  else
397
397
  a = point
398
398
  end
399
- @point = Point.new a.longitude, a.latitude, a.altitude
399
+ @point = Point.new a.longitude, a.latitude, a.altitude, :altitudeMode => a.altitudeMode
400
400
  end
401
401
  end
402
402
 
@@ -707,7 +707,7 @@ module Kamelopard
707
707
  def styleUrl=(a)
708
708
  if a.is_a? String then
709
709
  @styleUrl = a
710
- elsif a.respond_to? 'id' then
710
+ elsif a.respond_to? :kml_id then
711
711
  @styleUrl = "##{ a.kml_id }"
712
712
  else
713
713
  @styleUrl = a.to_s
@@ -870,6 +870,53 @@ module Kamelopard
870
870
  @folders.last
871
871
  end
872
872
 
873
+ # Makes a screenoverlay with a balloon containing links to the tours in this document
874
+ # The erb argument contains ERB to populate the description. It can be left nil
875
+ # The options hash is passed to the ScreenOverlay constructor
876
+ def make_tour_index(erb = nil, options = {})
877
+ options[:name] ||= 'Tour index'
878
+
879
+ options[:screenXY] ||= Kamelopard::XY.new(0.0, 1.0, :fraction, :fraction)
880
+ options[:overlayXY] ||= Kamelopard::XY.new(0.0, 1.0, :fraction, :fraction)
881
+ s = Kamelopard::ScreenOverlay.new options
882
+ t = ERB.new( erb || %{
883
+ <html>
884
+ <body>
885
+ <ul><% @tours.each do |t| %>
886
+ <li><a href="#<%= t.kml_id %>;flyto"><% if t.icon.nil? %><%= t.name %><% else %><img src="<%= t.icon %>" /><% end %></a></li>
887
+ <% end %></ul>
888
+ </body>
889
+ </html>
890
+ })
891
+
892
+ s.description = XML::Node.new_cdata t.result(binding)
893
+ s.balloonVisibility = 1
894
+
895
+ balloon_au = [0, 1].collect do |v|
896
+ au = Kamelopard::AnimatedUpdate.new [], :standalone => true
897
+ a = XML::Node.new 'Change'
898
+ b = XML::Node.new 'ScreenOverlay'
899
+ b.attributes['targetId'] = s.kml_id
900
+ c = XML::Node.new 'gx:balloonVisibility'
901
+ c << XML::Node.new_text(v.to_s)
902
+ b << c
903
+ a << b
904
+ au << a
905
+ au
906
+ end
907
+
908
+ # Handle hiding and displaying the index
909
+ @tours.each do |t|
910
+ q = Wait.new(0.1, :standalone => true)
911
+ t.playlist.unshift balloon_au[0]
912
+ t.playlist.unshift q
913
+ t.playlist << balloon_au[1]
914
+ t.playlist << q
915
+ end
916
+
917
+ s
918
+ end
919
+
873
920
  def get_kml_document
874
921
  k = XML::Document.new
875
922
  # XXX fix this
@@ -1304,7 +1351,7 @@ module Kamelopard
1304
1351
  # Corresponds to KML's Placemark objects. The geometry attribute requires a
1305
1352
  # descendant of Geometry
1306
1353
  class Placemark < Feature
1307
- attr_accessor :name, :geometry
1354
+ attr_accessor :name, :geometry, :balloonVisibility
1308
1355
 
1309
1356
  def initialize(name = nil, options = {})
1310
1357
  super
@@ -1315,6 +1362,11 @@ module Kamelopard
1315
1362
  k = XML::Node.new 'Placemark'
1316
1363
  super k
1317
1364
  @geometry.to_kml(k) unless @geometry.nil?
1365
+ if ! @balloonVisibility.nil? then
1366
+ x = XML::Node.new 'gx:balloonVisibility'
1367
+ x << ( @balloonVisibility ? 1 : 0 )
1368
+ k << x
1369
+ end
1318
1370
  elem << k unless elem.nil?
1319
1371
  k
1320
1372
  end
@@ -1352,9 +1404,14 @@ module Kamelopard
1352
1404
 
1353
1405
  # Abstract class corresponding to KML's gx:TourPrimitive object. Tours are made up
1354
1406
  # of descendants of these.
1407
+ # The :standalone option affects only initialization; there's no point in
1408
+ # doing anything with it after initialization. It determines whether the
1409
+ # TourPrimitive object is added to the current tour or not
1355
1410
  class TourPrimitive < Object
1411
+ attr_accessor :standalone
1412
+
1356
1413
  def initialize(options = {})
1357
- Document.instance.tour << self
1414
+ Document.instance.tour << self unless options[:standalone]
1358
1415
  super
1359
1416
  end
1360
1417
  end
@@ -1526,18 +1583,19 @@ module Kamelopard
1526
1583
 
1527
1584
  # Corresponds to a KML gx:Tour object
1528
1585
  class Tour < Object
1529
- attr_accessor :name, :description, :last_abs_view
1586
+ attr_accessor :name, :description, :last_abs_view, :playlist, :icon
1587
+
1530
1588
  def initialize(name = nil, description = nil)
1531
1589
  super()
1532
1590
  @name = name
1533
1591
  @description = description
1534
- @items = []
1592
+ @playlist = []
1535
1593
  Document.instance.tours << self
1536
1594
  end
1537
1595
 
1538
1596
  # Add another element to this Tour
1539
1597
  def <<(a)
1540
- @items << a
1598
+ @playlist << a
1541
1599
  @last_abs_view = a.view if a.kind_of? FlyTo
1542
1600
  end
1543
1601
 
@@ -1549,7 +1607,7 @@ module Kamelopard
1549
1607
  [ @description, 'description' ],
1550
1608
  ])
1551
1609
  p = XML::Node.new 'gx:Playlist'
1552
- @items.map do |a| a.to_kml p end
1610
+ @playlist.map do |a| a.to_kml p end
1553
1611
  k << p
1554
1612
  elem << k unless elem.nil?
1555
1613
  k
@@ -1580,7 +1638,7 @@ module Kamelopard
1580
1638
 
1581
1639
  # Corresponds to KML's ScreenOverlay object
1582
1640
  class ScreenOverlay < Overlay
1583
- attr_accessor :overlayXY, :screenXY, :rotationXY, :size, :rotation
1641
+ attr_accessor :overlayXY, :screenXY, :rotationXY, :size, :rotation, :balloonVisibility
1584
1642
 
1585
1643
  def to_kml(elem = nil)
1586
1644
  k = XML::Node.new 'ScreenOverlay'
@@ -1594,6 +1652,11 @@ module Kamelopard
1594
1652
  d << @rotation.to_s
1595
1653
  k << d
1596
1654
  end
1655
+ if ! @balloonVisibility.nil? then
1656
+ x = XML::Node.new 'gx:balloonVisibility'
1657
+ x << ( @balloonVisibility ? 1 : 0 )
1658
+ k << x
1659
+ end
1597
1660
  elem << k unless elem.nil?
1598
1661
  k
1599
1662
  end
@@ -1995,10 +2058,10 @@ module Kamelopard
1995
2058
  end
1996
2059
  x << loc
1997
2060
  Kamelopard.add_altitudeMode(@location.altitudeMode, x)
1998
- @link.to_kml x
1999
- @orientation.to_kml x
2000
- @scale.to_kml x
2001
- @resourceMap.to_kml x
2061
+ @link.to_kml x unless @link.nil?
2062
+ @orientation.to_kml x unless @orientation.nil?
2063
+ @scale.to_kml x unless @scale.nil?
2064
+ @resourceMap.to_kml x unless @resourceMap.nil?
2002
2065
  elem << x unless elem.nil?
2003
2066
  x
2004
2067
  end
@@ -2077,12 +2140,12 @@ module Kamelopard
2077
2140
  attr_accessor :refreshVisibility, :flyToView, :link
2078
2141
 
2079
2142
  def initialize(href = '', options = {})
2080
- @refreshMode = :onChange
2081
- @viewRefreshMode = :never
2082
- super options
2083
- @link = Link.new(href, refreshMode, viewRefreshMode)
2084
- @refreshVisibility = 0
2085
- @flyToView = 0
2143
+ super(( options[:name] || ''), options)
2144
+ @refreshMode ||= :onChange
2145
+ @viewRefreshMode ||= :never
2146
+ @link = Link.new(href, :refreshMode => @refreshMode, :viewRefreshMode => @viewRefreshMode)
2147
+ @refreshVisibility ||= 0
2148
+ @flyToView ||= 0
2086
2149
  end
2087
2150
 
2088
2151
  def refreshMode
@@ -2147,6 +2210,5 @@ module Kamelopard
2147
2210
  e
2148
2211
  end
2149
2212
  end
2150
-
2151
2213
  end
2152
2214
  # End of Kamelopard module
@@ -4,31 +4,63 @@ def fly_to(p, d = 0, r = 100, m = nil)
4
4
  Kamelopard::FlyTo.new p, :range => r, :duration => d, :mode => m
5
5
  end
6
6
 
7
+ def get_document()
8
+ Kamelopard::Document.instance
9
+ end
10
+
7
11
  def set_flyto_mode_to(a)
8
12
  Kamelopard::Document.instance.flyto_mode = a
9
13
  end
10
14
 
11
- def mod_popup_for(p, v)
12
- au = Kamelopard::AnimatedUpdate.new
15
+ def toggle_balloon_for(p, v, options = {})
16
+ au = Kamelopard::AnimatedUpdate.new [], options
17
+ if ! p.kind_of? Kamelopard::Placemark and ! p.kind_of? Kamelopard::ScreenOverlay then
18
+ raise "Can't show balloons for things that aren't Placemarks or ScreenOverlays"
19
+ end
20
+ a = XML::Node.new 'Change'
21
+ # XXX This can probably be more robust, based on just the class's name
22
+ if p.kind_of? Kamelopard::Placemark then
23
+ b = XML::Node.new 'Placemark'
24
+ else
25
+ b = XML::Node.new 'ScreenOverlay'
26
+ end
27
+ b.attributes['targetId'] = p.kml_id
28
+ c = XML::Node.new 'gx:balloonVisibility'
29
+ c << XML::Node.new_text(v.to_s)
30
+ b << c
31
+ a << b
32
+ au << a
33
+ end
34
+
35
+ def hide_balloon_for(p, options = {})
36
+ toggle_balloon_for(p, 0, options)
37
+ end
38
+
39
+ def show_balloon_for(p, options = {})
40
+ toggle_balloon_for(p, 1, options)
41
+ end
42
+
43
+ def fade_balloon_for(p, v, options = {})
44
+ au = Kamelopard::AnimatedUpdate.new [], options
13
45
  if ! p.is_a? Kamelopard::Placemark then
14
- raise "Can't show popups for things that aren't placemarks"
46
+ raise "Can't show balloons for things that aren't placemarks"
15
47
  end
16
48
  a = XML::Node.new 'Change'
17
49
  b = XML::Node.new 'Placemark'
18
50
  b.attributes['targetId'] = p.kml_id
19
- c = XML::Node.new 'visibility'
51
+ c = XML::Node.new 'color'
20
52
  c << XML::Node.new_text(v.to_s)
21
53
  b << c
22
54
  a << b
23
55
  au << a
24
56
  end
25
57
 
26
- def hide_popup_for(p)
27
- mod_popup_for(p, 0)
58
+ def fade_out_balloon_for(p, options = {})
59
+ fade_balloon_for(p, '00ffffff', options)
28
60
  end
29
61
 
30
- def show_popup_for(p)
31
- mod_popup_for(p, 1)
62
+ def fade_in_balloon_for(p, options = {})
63
+ fade_balloon_for(p, 'ffffffff', options)
32
64
  end
33
65
 
34
66
  def point(lo, la, alt=0, mode=nil, extrude = false)
@@ -36,6 +68,10 @@ def point(lo, la, alt=0, mode=nil, extrude = false)
36
68
  Kamelopard::Point.new(lo, la, alt, :altitudeMode => m, :extrude => extrude)
37
69
  end
38
70
 
71
+ def placemark(name = nil, options = {})
72
+ Kamelopard::Placemark.new name, options
73
+ end
74
+
39
75
  # Returns the KML that makes up the current Kamelopard::Document, as a string.
40
76
  def get_kml
41
77
  Kamelopard::Document.instance.get_kml_document
@@ -49,11 +85,19 @@ def pause(p)
49
85
  Kamelopard::Wait.new p
50
86
  end
51
87
 
88
+ def get_tour()
89
+ Kamelopard::Document.instance.tour
90
+ end
91
+
52
92
  def name_tour(a)
53
93
  Kamelopard::Document.instance.tour.name = a
54
94
  end
55
95
 
56
- def new_folder(name)
96
+ def get_folder()
97
+ Kamelopard::Document.instance.folders.last
98
+ end
99
+
100
+ def folder(name)
57
101
  Kamelopard::Folder.new(name)
58
102
  end
59
103
 
@@ -62,6 +106,11 @@ def name_folder(a)
62
106
  return Kamelopard::Document.instance.folder
63
107
  end
64
108
 
109
+ def name_document(a)
110
+ Kamelopard::Document.instance.name = a
111
+ return Kamelopard::Document.instance
112
+ end
113
+
65
114
  def zoom_out(dist = 1000, dur = 0, mode = nil)
66
115
  l = Kamelopard::Document.instance.tour.last_abs_view
67
116
  raise "No current position to zoom out from\n" if l.nil?
@@ -135,7 +184,8 @@ def set_prefix_to(a)
135
184
  end
136
185
 
137
186
  def write_kml_to(file = 'doc.kml')
138
- File.open(file, 'w') do |f| f.write get_kml.to_s.gsub(/balloonVis/, 'gx:balloonVis') end
187
+ File.open(file, 'w') do |f| f.write get_kml.to_s end
188
+ #File.open(file, 'w') do |f| f.write get_kml.to_s.gsub(/balloonVis/, 'gx:balloonVis') end
139
189
  end
140
190
 
141
191
  def fade_overlay(ov, show, options = {})
@@ -150,20 +200,6 @@ def fade_overlay(ov, show, options = {})
150
200
  k
151
201
  end
152
202
 
153
- def mod_balloon_for(a, val)
154
- c = a.change('gx:balloonVisibility', val).to_s
155
- STDERR.puts c
156
- Kamelopard::AnimatedUpdate.new c
157
- end
158
-
159
- def show_balloon_for(a)
160
- Kamelopard::AnimatedUpdate.new %{<Change><Placemark targetId="#{a.kml_id}"><balloonVisibility>1</balloonVisibility></Placemark></Change>}
161
- end
162
-
163
- def hide_balloon_for(a)
164
- Kamelopard::AnimatedUpdate.new %{<Change><Placemark targetId="#{a.kml_id}"><balloonVisibility>0</balloonVisibility></Placemark></Change>}
165
- end
166
-
167
203
  module TelemetryProcessor
168
204
  Pi = 3.1415926535
169
205
 
@@ -281,3 +317,104 @@ def tour_from_points(points, options = {})
281
317
  TelemetryProcessor::add_flyto points[i,3]
282
318
  end
283
319
  end
320
+
321
+ def make_view_from(options = {})
322
+ o = {}
323
+ o.merge! options
324
+ options.each do |k, v|
325
+ o[k.to_sym] = v unless k.kind_of? Symbol
326
+ end
327
+
328
+ # Set defaults
329
+ [
330
+ [ :altitude, 0 ],
331
+ [ :altitudeMode, :relativeToGround ],
332
+ [ :latitude, 0 ],
333
+ [ :longitude, 0 ],
334
+ [ :tilt, 0 ],
335
+ [ :heading, 0 ],
336
+ ].each do |a|
337
+ o[a[0]] = a[1] unless o.has_key? a[0]
338
+ end
339
+
340
+ p = point o[:longitude], o[:latitude], o[:altitude], o[:altitudeMode]
341
+
342
+ if o.has_key? :roll then
343
+ view = Kamelopard::Camera.new p
344
+ else
345
+ view = Kamelopard::LookAt.new p
346
+ end
347
+
348
+ [ :altitudeMode, :tilt, :heading, :timestamp, :timespan, :timestamp, :range, :roll, :viewerOptions ].each do |a|
349
+ view.method("#{a.to_s}=").call(o[a]) if o.has_key? a
350
+ end
351
+
352
+ view
353
+ end
354
+
355
+ def screenoverlay(options = {})
356
+ Kamelopard::ScreenOverlay.new options
357
+ end
358
+
359
+ def xy(x = 0.5, y = 0.5, xt = :fraction, yt = :fraction)
360
+ Kamelopard::XY.new x, y, xt, yt
361
+ end
362
+
363
+ def iconstyle(href = nil, options = {})
364
+ Kamelopard::IconStyle.new href, options
365
+ end
366
+
367
+ def labelstyle(scale = 1, options = {})
368
+ Kamelopard::LabelStyle.new scale, options
369
+ end
370
+
371
+ def style(options = {})
372
+ Kamelopard::Style.new options
373
+ end
374
+
375
+ def look_at(point = nil, options = {})
376
+ Kamelopard::LookAt.new point, options
377
+ end
378
+
379
+ def camera(point = nil, options = {})
380
+ Kamelopard::Camera.new point, options
381
+ end
382
+
383
+ def fly_to(view = nil, options = {})
384
+ Kamelopard::FlyTo.new view, options
385
+ end
386
+
387
+ # k = an XML::Document containing KML
388
+ # Pulls the Placemarks from the KML document and flys to each one in turn
389
+ def each_placemark(d)
390
+ i = 0
391
+ d.find('//kml:Placemark').each do |p|
392
+ all_values = {}
393
+
394
+ # These fields are part of the abstractview
395
+ view_fields = %w{ latitude longitude heading range tilt roll altitude altitudeMode gx:altitudeMode }
396
+ # These are other field I'm interested in
397
+ other_fields = %w{ description name }
398
+ all_fields = view_fields.clone
399
+ all_fields.concat(other_fields.clone)
400
+ all_fields.each do |k|
401
+ if k == 'gx:altitudeMode' then
402
+ ix = k
403
+ next unless p.find_first('kml:altitudeMode').nil?
404
+ else
405
+ ix = "kml:#{k}"
406
+ end
407
+ r = k == "gx:altitudeMode" ? :altitudeMode : k.to_sym
408
+ tmp = p.find_first("descendant::#{ix}")
409
+ next if tmp.nil?
410
+ all_values[k == "gx:altitudeMode" ? :altitudeMode : k.to_sym ] = tmp.content
411
+ end
412
+ view_values = {}
413
+ view_fields.each do |v| view_values[v] = all_values[v].clone if all_values.has_key? v end
414
+ yield make_view_from(view_values), all_values
415
+ end
416
+ end
417
+
418
+ def make_tour_index(erb = nil, options = {})
419
+ get_document.make_tour_index(erb, options)
420
+ end
@@ -2,72 +2,54 @@
2
2
  require 'matrix'
3
3
  #require 'kamelopard_classes'
4
4
 
5
- class NDPointList
6
- # Contains a list of N-dimensional numeric arrays
7
-
8
- attr_reader :dim
9
-
10
- def initialize(num)
11
- raise "Can't have an NDPointList with #{num} dimensions -- must be 1 or more" if num < 1
12
- @dim = num
13
- @points = []
14
- end
5
+ # XXX Right now I'm changing this to handle one-dimensional lists of numbers,
6
+ # that can be added together. We'll probably want a way to add points, or other
7
+ # numeric sets, to a set of pointlists easily. So for instance we can have
8
+ # lists for altitude, longitude, and latitude, and add a single point to them
9
+ # in one easy command.
10
+
11
+ module Kamelopard
12
+ class NumberList
13
+ # Contains a list of numbers
14
+
15
+ def initialize(init = [])
16
+ raise "Constructor argument needs to be an array" unless init.kind_of? Array
17
+ @points = init
18
+ end
15
19
 
16
- def size
17
- return @points.size
18
- end
20
+ def size
21
+ return @points.size
22
+ end
19
23
 
20
- def <<(a)
21
- # Append points to our list
22
- if a.kind_of? Kamelopard::Point then
23
- if self.dim == 3 then
24
- @points << [a.longitude, a.latitude, a.altitude]
25
- else
26
- @points << [a.longitude, a.latitude]
27
- end
28
- elsif a.respond_to? 'dim' and @dim != a.dim then
29
- raise "Argument's dimension #{a.dim} must agree with our dimension #{@dim} to append to an NDPointList"
30
- else
24
+ def <<(a)
31
25
  @points << a
32
26
  end
33
- end
34
-
35
- def last
36
- @points.last
37
- end
38
27
 
39
- def [](i)
40
- @points[i]
41
- end
42
-
43
- def x
44
- @points.collect do |a| a[0] end
45
- end
28
+ def last
29
+ @points.last
30
+ end
46
31
 
47
- def y
48
- if @dim >= 2 then
49
- @points.collect do |a| a[1] end
50
- else
51
- raise "NDPointList of size #{@dim} has no Y element"
32
+ def [](i)
33
+ @points[i]
52
34
  end
53
- end
54
35
 
55
- def z
56
- if @dim >= 2 then
57
- @points.collect do |a| a[2] end
58
- else
59
- raise "NDPointList of size #{@dim} has no Z element"
36
+ def each(&blk)
37
+ @points.each(&blk)
60
38
  end
61
39
  end
62
-
63
- def each(&blk)
64
- @points.each(&blk)
40
+
41
+ def Kamelopard.lists_at(lists, i)
42
+ # The modulus ensures lists will repeat if they're not the same size
43
+ lists.collect { |l| l[i % l.size] }
65
44
  end
66
45
 
67
- def interpolate(resolution = [10])
46
+ def Kamelopard.interpolate(lists = [], resolution = [10])
68
47
  # Ruby implementation of Catmull-Rom splines (http://www.cubic.org/docs/hermite.htm)
69
48
  # Return NDPointList interpolating a path along all points in this list
70
49
 
50
+ size = lists.collect { |l| l.size }.max
51
+ STDERR.puts size
52
+
71
53
  h = Matrix[
72
54
  [ 2, -2, 1, 1 ],
73
55
  [-3, 3, -2, -1 ],
@@ -75,19 +57,20 @@ class NDPointList
75
57
  [ 1, 0, 0, 0 ],
76
58
  ]
77
59
 
78
- result = NDPointList.new(@dim)
60
+ # XXX This needs to be fixed
61
+ result = []
79
62
 
80
63
  idx = 0
81
- resolution = [resolution] if ! resolution.respond_to? []
64
+ resolution = [resolution] if ! resolution.respond_to? :[]
82
65
 
83
66
  # Calculate spline between every two points
84
- (0..(self.size-2)).each do |i|
85
- p1 = self[i]
86
- p2 = self[i+1]
67
+ (0..(size-2)).each do |i|
68
+ p1 = lists_at(lists, i)
69
+ p2 = lists_at(lists, i+1)
87
70
 
88
71
  # Get surrounding points for calculating tangents
89
- if i <= 0 then pt1 = p1 else pt1 = self[i-1] end
90
- if i == self.size - 2 then pt2 = p2 else pt2 = self[i+2] end
72
+ if i <= 0 then pt1 = p1 else pt1 = lists_at(lists, i-1) end
73
+ if i >= size - 2 then pt2 = p2 else pt2 = lists_at(lists, i+2) end
91
74
 
92
75
  # Build tangent points into matrices to calculate tangents.
93
76
  t1 = 0.5 * ( Matrix[p2] - Matrix[pt1] )
@@ -97,7 +80,8 @@ class NDPointList
97
80
  c = Matrix[p1, p2, t1.row(0), t2.row(0)]
98
81
 
99
82
  # Make a set of points
100
- point_count = (resolution[idx] * 1.0 / self.size).to_i
83
+ point_count = (resolution[idx] * 1.0 / size).to_i
84
+ STDERR.puts point_count
101
85
  (0..point_count).each do |t|
102
86
  r = t/10.0
103
87
  s = Matrix[[r**3, r**2, r, 1]]
@@ -112,20 +96,11 @@ class NDPointList
112
96
  end
113
97
  end
114
98
 
115
- class OneDPointList < NDPointList
116
- def initialize
117
- super 1
118
- end
119
- end
120
-
121
- class TwoDPointList < NDPointList
122
- def initialize
123
- super 2
124
- end
125
- end
126
-
127
- class ThreeDPointList < NDPointList
128
- def initialize
129
- super 3
130
- end
131
- end
99
+ #a = Kamelopard::NumberList.new [1, 2, 3]
100
+ #b = Kamelopard::NumberList.new [5, 6, 10]
101
+ #
102
+ #i = 0
103
+ #Kamelopard.interpolate([a, b], [100]).each do |f|
104
+ # i += 1
105
+ # puts "#{i}\t#{f.inspect}"
106
+ #end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kamelopard
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- version: 0.0.6
9
+ - 7
10
+ version: 0.0.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joshua Tolley
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-05-04 00:00:00 Z
19
+ date: 2012-07-12 00:00:00 Z
20
20
  dependencies: []
21
21
 
22
22
  description: Various classes and functions used to ease development of KML files, in particular for development of Google Earth tours