README.txt in interpolate-0.2.0 vs README.txt in interpolate-0.2.1

- old
+ new

@@ -1,11 +1,186 @@ -== Interpolate += Interpolate -Library for generic interpolation objects. Useful for such things as generating +== Author + +Adam Collins [adam.w.collins@gmail.com] + + +== 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. -== Author -Adam Collins -adam.w.collins@gmail.com +== General Usage +Specify the interpolation as a Hash, where keys represent numeric points +along the gradient and values represent the known values along that gradient. + +Here's an example for determining where, in a range of seven zones, each value +of a set falls into: + + require 'rubygems' + require 'interpolate' + + points = { + 0.000 => 0, + 0.427 => 1, + 1.200 => 2, + 3.420 => 3, + 27.50 => 4, + 45.20 => 5, + 124.4 => 6, + } + + zones = Interpolation.new(points) + + values = [ + -20.2, + 0.234, + 65.24, + 9.234, + 398.4, + 4000 + ] + + values.each do |value| + zone = zones.at(value).floor + puts "A value of #{value} falls into zone #{zone}" + end + + +== Non-Numeric Gradients + +For non-Numeric gradient value objects, you'll need to implement +interpolate+ +for the class in question. Here's an example using an RGB color gradient with +the help of the 'color' gem: + + require 'rubygems' + require 'interpolate' + require 'color' + + # we need to implement +interpolate+ for Color::RGB + # in order for Interpolation to work + class Color::RGB + def interpolate(other, balance) + mix_with(other, balance * 100.0) + end + end + + # a nice weathermap-style color gradient + points = { + 0 => Color::RGB::White, + 1 => Color::RGB::Lime, + # 2 => ? (something between Lime and Yellow) + 3 => Color::RGB::Yellow, + 4 => Color::RGB::Orange, + 5 => Color::RGB::Red, + 6 => Color::RGB::Magenta, + 7 => Color::RGB::DarkGray + } + + gradient = Interpolation.new(points) + + # what are the colors of the gradient from 0 to 7 + # in increments of 0.2? + (0).step(7, 0.2) do |value| + color = gradient.at(value) + puts "A value of #{value} means #{color.html}" + end + + +== Array-based Interpolations + +Aside from single value gradient points, you can interpolate over uniformly sized +arrays. Between two interpolation points, let's say +a+ and +b+, the final result +will be +c+ where <tt>c[0]</tt> is the interpolation of <tt>a[0]</tt> and +<tt>b[0]</tt> and <tt>c[1]</tt> is interpolated between <tt>a[1]</tt> and +<tt>b[1]</tt> and so on up to <tt>c[n]</tt>. + +Here is an example: + + require 'rubygems' + require 'interpolate' + require 'pp' + + # a non-linear set of multi-dimensional points; + # perhaps the location of some actor in relation to time + time_frames = { + 0 => [0, 0, 0], + 1 => [1, 0, 0], + 2 => [0, 1, 0], + 3 => [0, 0, 2], + 4 => [3, 0, 1], + 5 => [1, 2, 3], + 6 => [0, 0, 0] + } + + path = Interpolation.new(time_frames) + + # play the actors positions in time increments of 0.25 + (0).step(6, 0.25) do |time| + position = path.at(time) + puts ">> At #{time}s, actor is at:" + p position + end + + +== Nested Array Interpolations + +As long as each top level array is uniformly sized in the first dimension +and each nested array is uniformly sized in the second dimension (and so +on...), multidimensional interpolation point values will just work. + +Here's an example of a set of 2D points being morphed: + + require 'rubygems' + require 'interpolate' + require 'pp' + + + # a non-linear set of 2D vertexes; + # the shape changes at each frame + time_frames = { + 0 => [[0, 0], [1, 0], [2, 0], [3, 0], [4, 0]], # a horizontal line + 1 => [[0, 0], [1, 0], [3, 0], [0, 4], [0, 0]], # a triangle + 2 => [[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]], # a square + 3 => [[0, 0], [1, 0], [2, 0], [3, 0], [4, 0]], # a horizontal line, again + 4 => [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4]] # a vertical line + } + + + paths = Interpolation.new(time_frames) + + # show the vertex positions in time increments of 0.25 + (0).step(4, 0.25) do |time| + points = paths.at(time) + puts ">> At #{time}s, points are:" + p points + end + + +== License + +(The MIT License) + +Copyright (c) 2008 Adam Collins [adam.w.collins@gmail.com] + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.