mruby port of Ruby-implementation of N-dimension Perlin noise: https://github.com/junegunn/perlin_noise
Add
conf.gem github: 'dabroz/mruby-perlin-noise'
to your build_config.rb
.
n1d = Perlin::Noise.new 1
0.step(100, 0.01) do |x|
puts n1d[x]
end
n2d = Perlin::Noise.new 2
0.step(100, 0.01) do |x|
0.step(100, 0.01) do |y|
puts n2d[x, y]
end
end
n3d = Perlin::Noise.new 3
n3d[rand, rand, rand]
n5d = Perlin::Noise.new 5
n5d[rand, rand, rand, rand, rand]
A gradient noise repeats itself at certain interval. (Default interval is 256) You can change the interval of the noise generator but keep in mind that longer interval requires more pseudo-random gradient vectors to be maintained in memory.
n3d = Perlin::Noise.new 3, :interval => 100
n3d[0.1, 0.2, 0.3]
n3d[0.1, 0.2, 100.3]
You can optionally specify a seed value for the random number generator. (Caveat: seed value is set globally in Ruby 1.8)
noises = Perlin::Noise.new 1, :seed => 12345
While the original algorithm outputs a number between -1.0 and 1.0, Perlin::Noise#[] manipulates this output and returns a number between 0.0 and 1.0 for ease of use. Thus, noise values at all of the integer lattice points should be 0.5, not 0.
Even though the range of the noise function is from 0 to 1, you'll rarely see a noise value close to either end, as most of the values are distributed around the center. You might want to apply S-shaped curve functions defined in Perlin::Curve module one or more times to push away those "grey" values to either end, achiving more contrasted output.
noise = Perlin::Noise.new 1
n = noise[0.1]
3.times do
n = Perlin::Curve::CUBIC.call n
end
There's a shortcut for this specific process.
contrast = Perlin::Curve.contrast(Perlin::Curve::CUBIC, 3)
n = contrast.call n
noise = Perlin::Noise.new 1, :interval => 200
0.step(300, 0.1).each do |x|
puts '#' * (noise[x] * 60).floor
end
##############################
################################
##################################
##################################
################################
##############################
###########################
#########################
#########################
###########################
##############################
#################################
#####################################
########################################
###########################################
#############################################
###########################################
########################################
#####################################
#################################
##############################
###########################
#########################
#########################
###########################
##############################
################################
##################################
##################################
################################
##############################
##########################
######################
###################
################
###############
################
###################
######################
##########################
##############################
#################################
#####################################
########################################
###########################################
#############################################
###########################################
########################################
#####################################
#################################
##############################
##########################
######################
###################
################
###############
################
###################
######################
##########################
##############################
#################################
#####################################
########################################
###########################################
#############################################
###########################################
########################################
#####################################
#################################
##############################
##########################
######################
###################
################
###############
################
###################
######################
##########################
##############################
################################
##################################
##################################
################################
##############################
###########################
#########################
#########################
###########################
##############################
#################################
#####################################
########################################
###########################################
#############################################
###########################################
########################################
#####################################
#################################
##############################
###########################
#########################
#########################
###########################
##############################
################################
##################################
##################################
################################
##############################
##########################
######################
###################
################
###############
################
###################
######################
##########################
##############################
#################################
#####################################
########################################
###########################################
#############################################
###########################################
########################################
#####################################
#################################
##############################
##########################
######################
###################
################
noises = Perlin::Noise.new(2)
contrast = Perlin::Curve.contrast(Perlin::Curve::CUBIC, 2)
bars = " βββββ
βββ".each_char.to_a
bar = lambda { |n|
bars[ (bars.length * n).floor ]
}
100.times do |i|
70.times do |y|
n = noises[i * 0.1, y * 0.1]
n = contrast.call n
print bar.call(n)
end
puts
end
βββββββββββββ
β
ββββ
β
β
β
β
β
ββββββββββββββββββ
β
ββββββββ
ββββ βββββ
βββββββ
β
ββββββββββββββ
ββββββββββ
β
βββββββββββββ
β
β
ββββββββββ
ββββ βββββ
ββββββββ
ββββββββββββββ
β
βββββββββββ
ββββββββββ
β
βββββββββββββ
ββββ ββββββ
βββββββ
β βββββββββββ
β
ββββββββββββ
ββββββββ
ββββββββββββββββ
ββββ βββββββ
ββββββ
βββββββββββββ
β
ββββββββββββ
ββββββ
β
ββββββββββββββββ
β
ββββββββββββ
ββββββ
ββββββββ
β
β
β
ββββββ
β
βββββββββββ
β
β
β
β
β
ββββββββββββββββββ
ββββββββββββββββββ
ββββββ
ββββ
β
β
βββββββ
ββββββββββββ
β
β
β
ββββββββββββββββββ
β
ββββββββββββ
βββββ
βββββ
ββββββ
βββββββββ
βββββββββββ
β
β
β
β
βββββββ
β
β
β
β
ββββββ
βββββββββββββ
βββββ
βββ
β
ββββββ
β
ββββββββββ
β
ββββββββ
β
ββββ
β
ββββ
β
ββββββ
β
β
β
β
βββββββββββββ
β
βββββ
ββ
β
βββββββ
ββββββββββββ
βββββββ
β
βββββββ
β
β
β
βββββββββββββββββββββββ
β
β
ββ
β
β
β
β
β
βββββββ
ββββββ βββββββ
βββββ
ββββββββββββββββββββββββββββββββ
β
β
βββββ
β
ββ
β
βββββββ
ββββββ ββββββ
β
βββ
ββββββββββββββββββββββββββββββββ
β
βββββββ
βββ
β
ββββββ
ββββββ ββββββ
β
β
β
ββββββββββββββββββββββββββββββββ
ββββββββ
β
βββ
β
β
ββββ
ββββββ βββββββ
β
β
βββββ βββββββββββββββββ ββββββ
ββββββββ
β
βββ
ββ
β
β
β
ββββββββ ββββββββ
β
β
β
ββββ βββββ
β
β
ββββββ βββββ
ββββββ
β
β
β
β
β
β
β
βββββββββββββββββββββ
ββββ
ββββ βββββ
β
β
β
β
βββββ βββββ
βββββ
β
βββββ
β
β
β
ββββββββββββββββββββ
β
ββββ
βββββββββββ
β
ββββ
β
ββββββββββββββ
βββββ
βββββββ
β
β
ββββββββββββββββββββ
β
ββββ
β
ββββββββββ
βββββ
β
βββββββββββββ
βββββ
ββββββββ
β
β
βββββββββββββββββββββ
β
βββ
β
βββββββββ
βββββ
β
βββββββββββββ
ββββββ
βββββββββ
β
ββ
β
β
β
βββββββ
β
β
ββββββββ
β
β
β
β
β
ββββββ
β
βββββ
β
ββββββββββββ
β
βββββββ
ββββββββββ
β
β
βββ
β
β
ββββ
β
β
β
β
βββββββββ
β
β
β
β
β
β
β
β
ββββββ
βββββββββββββ
β
ββββββββ
ββββββββββ
βββββββ
β
β
β
βββββ
ββββββββββ
β
βββββββββββ
βββββββββββββ
β
ββββββββββ
βββββββββ
βββββββββββββββ
βββββββββββ
βββββββββββ
βββββββββββββ
β
ββββββββββ
βββββββββ
ββββββββββββββββββββββββββ
βββββββββββ
βββββ ββββββ
β
β
ββββββββββ
ββββββββ
ββββββββββββββββ
βββ βββββ
βββββββββββ
ββββ βββββββββ
β
βββββββββ
βββββββ
ββββββββ
β
βββββββ
ββββββββββ
βββββββββββ
βββββ βββββββββββ
ββββββββ
βββββββ
β
ββββββ
β
β
β
ββββββββββββββββ
βββββββββββ
βββββββββββββββββββ
βββββββ
βββββββ
β
βββββ
βββββ
ββββββ
ββββββββββ
ββββββ
β
β
β
β
β
βββββββββββββββββββ
βββββ
β
βββββββ
ββ
βββ
βββββββ
ββββββ
βββββββββ
β
ββ
β
β
ββ
β
β
β
β
β
βββββββββββββββββββ
β
β
β
βββββββββ
ββ
β
β
β
βββββββ
βββββββ
ββββββββ
β
β
βββββββ
β
ββ
β
ββββββββ
β
β
ββββββββββββββββββββ
ββ
β
β
β
βββββββ
ββββββββ
β
β
ββββββββββββββ
ββββ
β
ββββββ
β
ββ
β
βββββββββββββββββββ
βββ
β
ββββββββ
βββββββββ
β
β
β
β
βββββββββββ
βββββ
βββββ
ββββββ
β
ββββββββββββ ββββ
ββββββββββββ
ββββββββββ
β
β
β
βββββββββββ
ββββββ
β
ββ
β
ββββββββ
βββββββββ ββββ
βββββββββββ
ββββββββββ
β
β
ββββββββββββ
βββββββ
β
β
β
β
βββββββββββββββ βββββ
βββββββββ
β
ββββββββββ
β
βββββββ
β
β
ββββ
βββββββββ
βββ
β
ββββββββ
ββββ βββββββ
βββββββ
β
β
ββββββββββ
β
ββββββββ
β
β
β
β
β
β
ββββββββ
ββββββ
βββββββ
ββββ ββββββββββ
ββββββ
β
β
βββββββββββ
βββββββββ
β
ββ
β
β
βββββββββ
βββββββ
ββββββ
βββββββββββββββ
βββββ
β
β
β
ββββββββββ
β
βββββββββ
β
ββ
β
β
ββββββββ
βββββββββ
βββββ
βββββββββββββββ
ββββ
β
β
β
β
β
β
β
β
β
ββββββ
ββββββββββ
β
β
β
β
β
ββββββ
βββββββββββ
β
βββ
βββββββββββββββ
βββ
β
β
β
β
βββββββ
β
ββββ
β
ββββββββββββββ
β
βββββ
ββββββββββββ
β
β
β
βββββββ
β
β
β
βββββ
β
β
βββ
β
βββββββββ
βββββ
β
βββββββββββββββ
βββ
β
ββββ βββββββ
β
ββββββ
β
β
β
β
βββββ
ββββββ
βββββββββ
ββββββ
β
βββββββββββββββ
β
β
βββββ βββββββββββββ
β
ββββ
βββββ
ββββββ
βββββββββ
β
ββββββ
β
ββββββββββββββββββββββ ββββββββββββ
β
ββββ
β
ββββ
ββββββ
βββββββββ
β
βββββββ
β
ββββββ ββββββββββββββ ββββββββββββ
β
ββββ
ββββ
βββββββββββββββ
β
β
β
ββββββ
β
ββββ ββββββββββββββββββββββββββββ
β
ββββ
β
ββ
βββββββββββββ
β
β
β
β
β
β
β
β
βββββ
ββββ βββββββ
β
β
βββββββββ ββββββββ
β
βββββ
β
ββββββ
ββββββ
β
β
β
β
βββββ
ββββββ
βββββ βββββββ
ββββ
ββββββββ βββββββ
β
ββββββ
β
βββββ
βββββ
β
ββ
β
βββββββ
ββββββββββββββββββββ
βββββββββββββ ββββββββ
ββββββ
ββ
βββ
β
ββββββ
ββ
β
βββββββ
ββββββ
ββββββββββββββ
βββββββ
ββββββββββββββ
βββββββ
ββ
β
β
β
βββββββ
β
β
ββββββββ
βββββββ
β
ββββββββββββ
βββββββ
β
ββββββββββββ
β
ββββββ
β
βββ
β
β
ββββββββ
β
ββββββββ
ββββββββ
β
βββββββββββ
ββββββββ
β
ββββββββββ
β
ββββββ
ββ
ββββ
ββββββββββββββββββ
βββββββββββ
ββββββββββ
ββββββββ
β
ββββββββ
βββββββ
βββ
βββββββββββββββββββββ
βββββββββββββ
βββββββββ
βββββββ
β
β
βββββββ
β
βββββββ
βββ
βββββββββββββββββββββ
βββββββββββββββ
ββββββ
β
β
βββββ
β
βββββββββ
βββββββββββ
βββββ
β
β
βββββββββββββ
ββββββββββββββββββ
β
β
β
β
β
β
β
β
β
ββββββββββββ
βββββββ
βββ
ββββ
β
ββββ
β
ββββββββββ
ββββββββββββββββββββ
β
β
ββββββββββββββββββ
ββββββ
βββ
ββββ
ββββββ
β
βββββββββ
βββββββββββββββββββββ
β
βββββββββββββββββββ
βββββ
ββββ
βββ
βββββββ
β
βββββββββ
β
ββββββββββββββββββββ
ββββββββββββββββββββ
βββββ
ββββ
βββ
βββββββ
βββββββββββ
β
βββββ
β
β
β
β
β
ββββββββ
β
βββββββββββββββββββββ
ββββ
β
βββ
ββ
ββββββββ
ββββββββββββ
β
β
β
β
βββββββ
βββββββ
ββββββββββββββββββββββ
βββββ
β
ββ
β
β
ββββββββ
ββββ βββββββ
β
βββββββββ
βββββ
βββββββββββ
β
β
β
βββββββββ
ββββββ
β
β
β
ββββββββ
βββββ ββββββββββββββββββ
β
β
β
βββββββββββ
β
β
β
β
ββββββββββ
βββββββ
βββββββββ
ββββ ββββββββββββββββββββββββββββββββ
β
β
β
β
βββββββββββ
ββββββ
βββββββββββββ ββββββ
β
β
β
ββββββββββββββββ ββββββ
β
β
ββββββββββββ
ββββββ
βββββββββββββ βββββ
β
ββββ
β
βββββββββββββ βββββββββββββββββββββββββ
βββββββββββββ βββββ
β
βββββββ
β
ββββββββββββ βββββββββββββββββββββββββ
βββββββββ
ββββ βββββ
βββββββββ
β
βββββββββββββββββββββββββββββββββββββββ
β
ββββββββ
βββββ ββββββ
ββββββββββ
β
ββββββββββββββββββββββββββββββββ
ββββββ
β
β
ββββββββ
βββββββββββ
β
ββββββββ
β
βββββββββββββββββββββββββββββββββ
ββββββ
ββ
ββββββββ
ββββββββββββ
βββββββ
β
βββββββββ
ββββββββββββββββββββββββ
ββββββ
β
βββ
βββββββ
βββββββββββββ
ββββββ
ββββββββ
β
β
β
β
βββββββ
β
β
β
β
β
ββββββββ
β
ββββββ
ββ
βββ
ββββββββ
βββββββββββββ
βββ
β
βββββββββ
ββββββ
β
β
β
β
ββββββββ
β
β
β
β
β
ββββββββ
ββ
βββββββββββ
βββββββββββββ
β
β
ββββββββββ
βββββββββββββββββββββ
β
ββββββββββ
ββ
ββββ
βββββββ
ββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββ
β
ββββ
βββββββ
βββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββ
β
βββββ
ββββββ
ββββββββ
β
β
ββββββββββββ
ββββββββββββββββββββββββ
β
β
βββββββββββ
ββββββ
ββββ
ββββββββ
β
β
β
β
ββββββββββ
βββββββββββββββββββββββ
βββββ
ββββββββββ
ββββββ
β
βββ
ββββββββ
βββ
βββββββββββ
ββββββββββββββββββββββ
βββββββ
βββββββββ
βββββββ
β
β
β
ββββββββ
β
β
β
βββββββββββ
ββββββββ
β
β
β
βββ
β
β
β
β
β
β
ββββββββββ
ββββββββ
βββββββ
β
β
β
ββββββββ
β
β
ββββββββββββ
βββββββ
βββββββββββββββββββββββ
βββββββ
β
βββββββ
β
ββ
ββββββββββββββ βββββ
ββββββ
ββββββββββββββββββββββββ
β
ββββ
β
ββ
βββββββ
βββ
β
ββββββββββββ ββββββ
ββββ
ββββββββββββββββββββββββββ
β
ββ
ββββ
βββββββ
ββββ
βββββββββββ ββββββ
β
β
β
β
βββββββββββββββββ βββββββ
β
βββββ
ββββββ
ββββββ
β
βββββββββ ββββββββ
β
β
β
βββββββββ βββββ ββββββββββββ
ββββββ
βββββββ
β
βββββββ βββββββββββ
β
β
ββββββββ βββββ βββββββββββ
β
βββββ
ββββββββ
β
βββββββ βββββββββββββ
β
β
β
ββββββ βββββββββββββββββββββ
β
ββββββ
ββββββββ
β
βββββββββββββ
β
βββββββ
β
ββ
β
βββββ βββββββββββββββββ
βββββ
β
ββββββ
β
ββββββ
β
β
β
ββββββββββ
β
β
β
βββββββ
β
βββ
β
ββββββββββββββββββββββ
β
β
β
βββ
β
ββββββββ
β
β
β
β
β
β
β
β
β
βββββββββ
βββ
ββββββββ
β
β
β
ββββββββββββββββββββββ
βββββ
ββ
βββββββββββββββ
β
β
β
β
β
ββββββ
β
βββ
βββββββββ
βββββββββββββ
β
β
β
βββββββ
βββββββ
β
ββββββββββββββββ
ββββ
β
ββββ
β
ββββ
βββββββββββββββββββββ
β
βββ
β
βββββ
β
ββββββββ
ββββββββββββββββ
ββββββ
β
β
β
ββββ
β
βββββββββββββββββββββ
βββββ
β
βββ
β
βββββββββ
ββββββββββββββββ
βββββββββββββ
β
ββββββββββββββββββββ
ββββββ
β
β
β
βββββββββββ
βββββββββ ββββββββββββββββ
ββββββββββββββββββββ
ββββββ
β
β
β
β
βββββββββββ
βββββββ ββββββββββββββββ
ββββββββββ
βββββββββ
βββββ
β
β
βββ
β
βββββββββββ
ββββββββββ ββββ
βββββββββββββββββββββ
β
β
β
βββββ
β
βββββ
β
ββββββ
βββββββββββ
βββββββββββββββββ
βββββββββββββ
ββββββββ
βββ
β
βββ
β
βββββ
βββββββββ
ββββββββββ
β
βββββββββββββββββ
ββββββββββββ
ββββββββ
βββ
β
ββ
β
βββββ
β
βββββββββ
β
βββββββββ
βββββββββββββββββββ
β
β
β
ββββββββ
ββββββββ
β
β
β
ββββ
β
ββββ
βββββββββββ
β
βββββ
β
β
β
βββββββββββββββββββββββ
β
ββββββ
βββββββββ
β
ββββββ
ββββ
ββββ ββββββ
β
ββ
β
β
βββ
Noise looks much more interesting when combined.
noises = Perlin::Noise.new(2)
contrast = Perlin::Curve.contrast(Perlin::Curve::QUINTIC, 3)
100.times do |x|
n = 0
[[0.02, 10], [0.04, 10], [0.1, 20], [0.2, 15]].each_with_index do |step_scale, idx|
step, scale = step_scale
n += contrast.call( noises[idx, x * step] ) * scale
end
puts '=' * n.floor
end
================================
=========================================
===============================================
===============================================
========================================
===========================
===================
=====================
========================
===========================
============================
=============================
==============================
==============================
==============================
===========================
=======================
======================
======================
========================
==========================
============================
===============================
=================================
==================================
=================================
================================
=================================
==================================
=====================================
======================================
=========================================
================================================
=========================================================
===========================================================
=====================================================
==============================================
===============================================
=====================================================
=================================================
=================================
==================
=============
=============
====================
============================
=====================================
==============================================
================================================
=============================================
================================
==================
============
===========
===========
==================
=========================
==========================
===========================
================================
================================
==================================
=========================================
==================================================
====================================================
===============================================
=========================================
==========================================
==============================================
============================================
===============================
================
==========
========
==========
=============
===================
==========================
===============================
================================
=========================
================
===========
=======
======
=============
====================
======================
========================
=============================
===============================
==================================
=======================================
========================================
=========================================
================================================
======================================================
======================================================
===============================================
======================================
================================
- Matthew Johnston
- Tomasz DΔ browski (mruby port)
- Texturing & modeling: a procedural approach by David S. Ebert et al.
- Improving Noise by Ken Perlin (http://mrl.nyu.edu/~perlin/paper445.pdf)
- http://webstaff.itn.liu.se/~stegu/TNM022-2005/perlinnoiselinks/perlin-noise-math-faq.html#algorithm
- http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
- http://burtleburtle.net/bob/rand/unitvec.html
- http://briansharpe.wordpress.com/2011/11/14/two-useful-interpolation-functions-for-noise-development/
- http://http.developer.nvidia.com/GPUGems/gpugems_ch05.html
- http://www.java-gaming.org/index.php?topic=22796.0