class Noisy::Noisy

Public Class Methods

new(seed = 1, octaves = 4) click to toggle source
# File lib/noisy/noisy.rb, line 3
def initialize(seed = 1, octaves = 4)
  @seed = seed
  @octaves = octaves
  @persistence = 0.25
end

Public Instance Methods

cosine_interpolate(a, b, x) click to toggle source
# File lib/noisy/noisy.rb, line 38
def cosine_interpolate(a, b, x)
  f = (1 - Math.cos(x * Math::PI)) / 2
  a * (1 - f) + b * f
end
Also aliased as: interpolate
interpolate(a, b, x)

alias interpolate linear_interpolate

Alias for: cosine_interpolate
interpolate_noise(x) click to toggle source
# File lib/noisy/noisy.rb, line 46
def interpolate_noise(x)
  interpolate(smooth_noise(x.floor), smooth_noise(x.floor + 1), x - x.floor)
end
interpolate_noise_2d(x, y) click to toggle source
# File lib/noisy/noisy.rb, line 50
def interpolate_noise_2d(x, y)
  a = interpolate(smooth_noise_2d(x.floor, y.floor), smooth_noise_2d(x.floor + 1, y.floor), x - x.floor)
  b = interpolate(smooth_noise_2d(x.floor, y.floor + 1), smooth_noise_2d(x.floor + 1, y.floor + 1), x - x.floor)
  interpolate(a, b, y - y.floor)
end
linear_interpolate(a, b, x) click to toggle source
# File lib/noisy/noisy.rb, line 34
def linear_interpolate(a, b, x)
  a * (1 - x) + b * x
end
perlin_noise(x) click to toggle source
# File lib/noisy/noisy.rb, line 56
def perlin_noise(x)
  total = 0.0
  (0...@octaves).each do |i|
    frequency = 2.0 ** i
    amplitude = @persistence ** i
    total += interpolate_noise(x * frequency) * amplitude
  end
  total
end
perlin_noise_2d(x, y) click to toggle source
# File lib/noisy/noisy.rb, line 66
def perlin_noise_2d(x, y)
  total = 0.0
  (0...@octaves).each do |i|
    frequency = 2.0 ** i
    amplitude = @persistence ** i
    total += interpolate_noise_2d(x * frequency, y * frequency) * amplitude
  end
  total
end
perlin_noise_map(width, height) click to toggle source
# File lib/noisy/noisy.rb, line 76
def perlin_noise_map(width, height)
  noise = Array.new(width)
  noise.map! { Array.new(height) }
  (0...width).each do |x|
    (0...height).each do |y|
      noise[x][y] = perlin_noise_2d(x, y)
    end
  end
  noise
end
raw_noise(x) click to toggle source
# File lib/noisy/noisy.rb, line 9
def raw_noise(x)
  n = (x.to_i << 13) ^ x.to_i
  (1.0 - ((n * (n * n * 15731 * @seed + 789221 * @seed) + 1376312589 * @seed) & 0x7fffffff) / 1073741824.0)
end
raw_noise_2d(x, y) click to toggle source
# File lib/noisy/noisy.rb, line 14
def raw_noise_2d(x, y)
  n = (x + y * 57).to_i
  n = (n << 13) ^ n
  (1.0 - ((n * (n * n * 15731 * @seed + 789221 * @seed) + 1376312589 * @seed) & 0x7fffffff) / 1073741824.0)
end
smooth_noise(x) click to toggle source
# File lib/noisy/noisy.rb, line 20
def smooth_noise(x)
  left = raw_noise(x - 1.0)
  right = raw_noise(x + 1.0)
  raw_noise(x)/2.0 + left/4.0 + right/4.0
end
smooth_noise_2d(x, y) click to toggle source
# File lib/noisy/noisy.rb, line 26
def smooth_noise_2d(x, y)
  corners = raw_noise_2d(x - 1, y - 1) + raw_noise_2d(x - 1, y + 1) + raw_noise_2d(x + 1, y - 1) + raw_noise_2d(x + 1, y + 1)
  sides = raw_noise_2d(x, y - 1) + raw_noise_2d(x, y + 1) + raw_noise_2d(x - 1, y) + raw_noise_2d(x + 1, y)
  center = raw_noise_2d(x, y)

  center / 4 + sides / 8 + corners / 16
end