interpolate 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/History.txt +4 -0
- data/LICENSE.txt +1 -1
- data/Manifest.txt +3 -3
- data/README.txt +7 -12
- data/examples/arrays.rb +0 -1
- data/examples/colors.rb +6 -11
- data/lib/interpolate.rb +3 -3
- data/lib/interpolate/{ruby_array.rb → add/array.rb} +0 -0
- data/lib/interpolate/{interpolation.rb → add/core.rb} +23 -16
- data/lib/interpolate/{ruby_numeric.rb → add/numeric.rb} +0 -0
- data/test/test_all.rb +32 -9
- metadata +18 -9
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
data/LICENSE.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -8,7 +8,7 @@ examples/colors.rb
|
|
8
8
|
examples/nested.rb
|
9
9
|
examples/zones.rb
|
10
10
|
lib/interpolate.rb
|
11
|
-
lib/interpolate/
|
12
|
-
lib/interpolate/
|
13
|
-
lib/interpolate/
|
11
|
+
lib/interpolate/add/array.rb
|
12
|
+
lib/interpolate/add/core.rb
|
13
|
+
lib/interpolate/add/numeric.rb
|
14
14
|
test/test_all.rb
|
data/README.txt
CHANGED
@@ -53,21 +53,13 @@ of a set falls into:
|
|
53
53
|
== Non-Numeric Gradients
|
54
54
|
|
55
55
|
For non-Numeric gradient value objects, you'll need to implement +interpolate+
|
56
|
-
for the class in question
|
57
|
-
the help of the 'color' gem:
|
56
|
+
for the class in question or provide a block to the new Interpolation object.
|
57
|
+
Here's an example using an RGB color gradient with the help of the 'color' gem:
|
58
58
|
|
59
59
|
require 'rubygems'
|
60
60
|
require 'interpolate'
|
61
61
|
require 'color'
|
62
62
|
|
63
|
-
# we need to implement +interpolate+ for Color::RGB
|
64
|
-
# in order for Interpolation to work
|
65
|
-
class Color::RGB
|
66
|
-
def interpolate(other, balance)
|
67
|
-
mix_with(other, balance * 100.0)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
63
|
# a nice weathermap-style color gradient
|
72
64
|
points = {
|
73
65
|
0 => Color::RGB::White,
|
@@ -80,7 +72,9 @@ the help of the 'color' gem:
|
|
80
72
|
7 => Color::RGB::DarkGray
|
81
73
|
}
|
82
74
|
|
83
|
-
gradient = Interpolation.new(points)
|
75
|
+
gradient = Interpolation.new(points) do |left, right, balance|
|
76
|
+
left.mix_with(right, balance * 100.0)
|
77
|
+
end
|
84
78
|
|
85
79
|
# what are the colors of the gradient from 0 to 7
|
86
80
|
# in increments of 0.2?
|
@@ -90,6 +84,7 @@ the help of the 'color' gem:
|
|
90
84
|
end
|
91
85
|
|
92
86
|
|
87
|
+
|
93
88
|
== Array-based Interpolations
|
94
89
|
|
95
90
|
Aside from single value gradient points, you can interpolate over uniformly sized
|
@@ -164,7 +159,7 @@ Here's an example of a set of 2D points being morphed:
|
|
164
159
|
|
165
160
|
(The MIT License)
|
166
161
|
|
167
|
-
Copyright (c) 2008 Adam Collins [adam.w.collins@gmail.com]
|
162
|
+
Copyright (c) 2008-2009 Adam Collins [adam.w.collins@gmail.com]
|
168
163
|
|
169
164
|
Permission is hereby granted, free of charge, to any person obtaining
|
170
165
|
a copy of this software and associated documentation files (the
|
data/examples/arrays.rb
CHANGED
data/examples/colors.rb
CHANGED
@@ -2,15 +2,6 @@ require 'rubygems'
|
|
2
2
|
require 'interpolate'
|
3
3
|
require 'color'
|
4
4
|
|
5
|
-
|
6
|
-
# we need to implement :interpolate for Color::RGB
|
7
|
-
# in order for Interpolation to work
|
8
|
-
class Color::RGB
|
9
|
-
def interpolate(other, balance)
|
10
|
-
mix_with(other, balance * 100.0)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
5
|
# a nice weathermap-style color gradient
|
15
6
|
points = {
|
16
7
|
0 => Color::RGB::White,
|
@@ -23,8 +14,12 @@ points = {
|
|
23
14
|
7 => Color::RGB::DarkGray
|
24
15
|
}
|
25
16
|
|
26
|
-
|
27
|
-
|
17
|
+
# Color objects can't interpolate themselves right out of the box,
|
18
|
+
# so rather than monkey patch the :interpolate method, you can pass
|
19
|
+
# a block with the instantiation of a new Interpolation object
|
20
|
+
gradient = Interpolation.new(points) do |left, right, balance|
|
21
|
+
left.mix_with(right, balance * 100.0)
|
22
|
+
end
|
28
23
|
|
29
24
|
# what are the colors of the gradient from 0 to 7
|
30
25
|
# in increments of 0.2?
|
data/lib/interpolate.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
require 'interpolate/
|
2
|
-
require 'interpolate/
|
3
|
-
require 'interpolate/
|
1
|
+
require 'interpolate/add/core'
|
2
|
+
require 'interpolate/add/array'
|
3
|
+
require 'interpolate/add/numeric'
|
File without changes
|
@@ -2,18 +2,15 @@
|
|
2
2
|
# linear motion between points (or arrays of points), multi-channel color
|
3
3
|
# gradients, piecewise functions, or even just placing values within intervals.
|
4
4
|
#
|
5
|
-
# The only requirement is that each interpolation point value must be able to
|
6
|
-
# figure out how to interpolate itself to its neighbor value(s). Numeric
|
7
|
-
# objects and uniformly sized arrays are automatically endowed with this
|
8
|
-
# ability by this gem, but other classes will require an implementation
|
9
|
-
# of +interpolate+. See the example color.rb in the examples directory for
|
10
|
-
# a brief demonstration using Color objects provided by the 'color' gem.
|
11
|
-
#
|
12
5
|
# Interpolation objects are constructed with a Hash object, wherein each key
|
13
|
-
# is a real number value and each value
|
6
|
+
# is a real number value and each value can respond to +interpolate+ to
|
14
7
|
# determine the resulting value based on its neighbor value and the balance
|
15
8
|
# ratio between the two points.
|
16
9
|
#
|
10
|
+
# For objects which can't respond to +interpolate+ (or to override the default
|
11
|
+
# behaviour), a block can be passed to +new+ which will be called whenever two
|
12
|
+
# values need to be interpolated.
|
13
|
+
#
|
17
14
|
# At or below the lower bounds of the interpolation, the result will be equal to
|
18
15
|
# the value of the lower bounds interpolation point. At or above the upper
|
19
16
|
# bounds of the graient, the result will be equal to the value of the upper
|
@@ -31,18 +28,26 @@
|
|
31
28
|
#
|
32
29
|
|
33
30
|
class Interpolation
|
34
|
-
VERSION = '0.2.
|
31
|
+
VERSION = '0.2.3'
|
35
32
|
|
36
33
|
# creates an Interpolation object with Hash object that specifies
|
37
34
|
# each point location (Numeric) and value (up to you)
|
38
|
-
|
35
|
+
#
|
36
|
+
# the optional+block+ can be used to interpolate objects that can't
|
37
|
+
# respond to +interpolate+ on their own
|
38
|
+
#
|
39
|
+
# +block+ will receive the following arguments: "left" (lower) side
|
40
|
+
# value, "right" (higher) side value, and the balance ratio from 0.0
|
41
|
+
# to 1.0
|
42
|
+
def initialize(points = {}, &block)
|
39
43
|
@points = {}
|
44
|
+
@block = block
|
40
45
|
merge!(points)
|
41
46
|
end
|
42
47
|
|
43
48
|
# creates an Interpolation object from the receiver object,
|
44
49
|
# merged with the interpolated points you specify
|
45
|
-
def merge(points = {})
|
50
|
+
def merge(points = {})
|
46
51
|
Interpolation.new(points.merge(@points))
|
47
52
|
end
|
48
53
|
|
@@ -52,7 +57,7 @@ class Interpolation
|
|
52
57
|
normalize_data
|
53
58
|
end
|
54
59
|
|
55
|
-
# returns the interpolated value of the receiver object at the point specified
|
60
|
+
# returns the interpolated value of the receiver object at the point specified
|
56
61
|
def at(point)
|
57
62
|
# deal with the two out-of-bounds cases first
|
58
63
|
if (point <= @min_point)
|
@@ -87,8 +92,13 @@ class Interpolation
|
|
87
92
|
return left_value if (balance == 0.0)
|
88
93
|
return right_value if (balance == 1.0)
|
89
94
|
|
95
|
+
# given block should be called
|
96
|
+
return @block.call(left_value, right_value, balance) if @block
|
97
|
+
|
90
98
|
# otherwise, we need to interpolate
|
91
|
-
return left_value.interpolate(right_value, balance)
|
99
|
+
return left_value.interpolate(right_value, balance) if left_value.respond_to?(:interpolate)
|
100
|
+
|
101
|
+
raise ArgumentError, "no block given and interpolation point doesn't respond to :interpolate"
|
92
102
|
end
|
93
103
|
end
|
94
104
|
|
@@ -106,9 +116,6 @@ class Interpolation
|
|
106
116
|
# make sure that all values respond_to? :interpolate
|
107
117
|
@data.each do |point|
|
108
118
|
value = point.last
|
109
|
-
unless value.respond_to?(:interpolate)
|
110
|
-
raise ArgumentError, "found an interpolation point that doesn't respond to :interpolate"
|
111
|
-
end
|
112
119
|
end
|
113
120
|
end
|
114
121
|
|
File without changes
|
data/test/test_all.rb
CHANGED
@@ -9,7 +9,7 @@ class InterpolationTest < Test::Unit::TestCase
|
|
9
9
|
DELTA = 1e-7
|
10
10
|
|
11
11
|
def setup
|
12
|
-
decimal_points = {
|
12
|
+
@decimal_points = {
|
13
13
|
0 => 0,
|
14
14
|
1 => 0.1,
|
15
15
|
2 => 0.2,
|
@@ -23,29 +23,28 @@ class InterpolationTest < Test::Unit::TestCase
|
|
23
23
|
10 => 1
|
24
24
|
}.freeze
|
25
25
|
|
26
|
-
array_points = {
|
26
|
+
@array_points = {
|
27
27
|
100 => [1, 10, 100],
|
28
28
|
200 => [5, 50, 500],
|
29
29
|
500 => [10, 100, 1000]
|
30
30
|
}.freeze
|
31
31
|
|
32
|
-
@dec_gradient = Interpolation.new(decimal_points).freeze
|
33
|
-
@array_gradient = Interpolation.new(array_points).freeze
|
32
|
+
@dec_gradient = Interpolation.new(@decimal_points).freeze
|
33
|
+
@array_gradient = Interpolation.new(@array_points).freeze
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
def test_bad_points
|
36
|
+
def test_bad_point
|
38
37
|
bad_points = {
|
39
38
|
0 => 4.2,
|
40
39
|
1 => "hello", # not allowed by default
|
41
40
|
2 => 3.4,
|
42
41
|
3 => 4.8
|
43
42
|
}
|
43
|
+
gradient = Interpolation.new(bad_points)
|
44
44
|
|
45
45
|
assert_raise ArgumentError do
|
46
|
-
gradient
|
46
|
+
gradient.at(1.5)
|
47
47
|
end
|
48
|
-
|
49
48
|
end
|
50
49
|
|
51
50
|
def test_lower_bounds
|
@@ -133,7 +132,31 @@ class InterpolationTest < Test::Unit::TestCase
|
|
133
132
|
assert_equal(@array_gradient.at(200), [5, 50, 500])
|
134
133
|
assert_equal(@array_gradient.at(350), [7.5, 75, 750])
|
135
134
|
end
|
136
|
-
|
135
|
+
|
136
|
+
def test_given_block_left
|
137
|
+
gradient = Interpolation.new(@decimal_points) {|l, r, bal| l}
|
138
|
+
assert_in_delta(gradient.at(1.5), 0.1, DELTA)
|
139
|
+
assert_in_delta(gradient.at(2.5), 0.2, DELTA)
|
140
|
+
assert_in_delta(gradient.at(3.5), 0.3, DELTA)
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_given_block_right
|
144
|
+
gradient = Interpolation.new(@decimal_points) {|l, r, bal| r}
|
145
|
+
assert_in_delta(gradient.at(1.5), 0.2, DELTA)
|
146
|
+
assert_in_delta(gradient.at(2.5), 0.3, DELTA)
|
147
|
+
assert_in_delta(gradient.at(3.5), 0.4, DELTA)
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_given_block_mean_squared
|
151
|
+
# squared balance, not linear
|
152
|
+
gradient = Interpolation.new(@decimal_points) do |l, r, bal|
|
153
|
+
l + ((r - l).to_f * bal * bal)
|
154
|
+
end
|
155
|
+
assert_in_delta(gradient.at(1.5), 0.12500, DELTA)
|
156
|
+
assert_in_delta(gradient.at(2.75), 0.25625, DELTA)
|
157
|
+
assert_in_delta(gradient.at(3.99), 0.39801, DELTA)
|
158
|
+
end
|
159
|
+
|
137
160
|
def test_frozen_points
|
138
161
|
a = @array_gradient.at(200)
|
139
162
|
assert_nothing_raised RuntimeError do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: interpolate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Collins
|
@@ -30,19 +30,26 @@ cert_chain:
|
|
30
30
|
xJc09X9KG2jBdxa4tp+uy7KZ
|
31
31
|
-----END CERTIFICATE-----
|
32
32
|
|
33
|
-
date:
|
33
|
+
date: 2009-10-27 00:00:00 -07:00
|
34
34
|
default_executable:
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: hoe
|
38
|
+
type: :development
|
38
39
|
version_requirement:
|
39
40
|
version_requirements: !ruby/object:Gem::Requirement
|
40
41
|
requirements:
|
41
42
|
- - ">="
|
42
43
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
44
|
+
version: 2.3.3
|
44
45
|
version:
|
45
|
-
description:
|
46
|
+
description: |
|
47
|
+
Description
|
48
|
+
|
49
|
+
Library for generic Interpolation objects. Useful for such things as generating
|
50
|
+
linear motion between points (or arrays of points), multi-channel color
|
51
|
+
gradients, piecewise functions, or even just placing values within intervals.
|
52
|
+
|
46
53
|
email: adam.w.collins@gmail.com
|
47
54
|
executables: []
|
48
55
|
|
@@ -64,12 +71,14 @@ files:
|
|
64
71
|
- examples/nested.rb
|
65
72
|
- examples/zones.rb
|
66
73
|
- lib/interpolate.rb
|
67
|
-
- lib/interpolate/
|
68
|
-
- lib/interpolate/
|
69
|
-
- lib/interpolate/
|
74
|
+
- lib/interpolate/add/array.rb
|
75
|
+
- lib/interpolate/add/core.rb
|
76
|
+
- lib/interpolate/add/numeric.rb
|
70
77
|
- test/test_all.rb
|
71
78
|
has_rdoc: true
|
72
79
|
homepage: http://interpolate.rubyforge.org
|
80
|
+
licenses: []
|
81
|
+
|
73
82
|
post_install_message:
|
74
83
|
rdoc_options:
|
75
84
|
- --main
|
@@ -91,9 +100,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
100
|
requirements: []
|
92
101
|
|
93
102
|
rubyforge_project: interpolate
|
94
|
-
rubygems_version: 1.
|
103
|
+
rubygems_version: 1.3.5
|
95
104
|
signing_key:
|
96
|
-
specification_version:
|
105
|
+
specification_version: 3
|
97
106
|
summary: Description Library for generic Interpolation objects. Useful for such things as generating linear motion between points (or arrays of points), multi-channel color gradients, piecewise functions, or even just placing values within intervals.
|
98
107
|
test_files:
|
99
108
|
- test/test_all.rb
|
metadata.gz.sig
CHANGED
Binary file
|