noise :: PerlinNoise
InterpolatedNoiseGet values at any coordinates with [].
The behavior of this generator can be customized using its attributes min,
max, period and seed.
This noise is more realistic and less smooth than the InterpolatedNoise.
Due to implementation logic, the full amplitude cannot be reached.
In practice, only amplitude * (1.0 - 1.0 / n_levels) is covered.
This implementation uses a custom deterministic pseudo random number
generator to set InterpolatedNoise::seed of the layers.
It is seeded with the local seed and can be further customized by
redefining pseudo_random.
This process do not require any state, so this class only holds the
attributes of the generator and does not keep any generated data.
var map = new PerlinNoise
map.min = 0.0
map.max = 16.0
map.period = 20.0
map.seed = 0
var max = 0.0
var min = 100.0
for y in 30.times do
for x in 70.times do
# Get a value at x, y
var val = map[x.to_f, y.to_f]
printn val.to_i.to_hex
max = max.max(val)
min = min.min(val)
end
print ""
end
assert max <= map.max
assert min >= map.min
76666555444322234567789abbcbbaabbaa98777766665665566667888987655444444
776665554443322234567789abbbbbbbbba98777766666665556666788998654444444
777766544443322234566789abbbbbbbbaa99877777776665556666788888655444444
777776444443322244556679abbbccbbbaa99877777776655556666688888655444444
777766444444332244555678abbbccbbbaa99887787877655556666678888654444444
8887654344443333444456789abcccbbaa999877888886555555666688777654444455
8887654344443333444456789abbcdcbaa999887889887655555566677777654444456
7876654434444444444456778abbcccaaa999888899888655555566677777654444556
78765544344445544444567789bbccca99999888899988765555566666667654445566
77765444344455554445567889bbccba99999998999988765555566555666654445667
7765444334555665445556788abbbba988998999999988765555566545556554456677
87654444334556655455567899bbbba998888899999887766555566544556555456777
87655444334566665555567899bbbbba98888899988888776555566544556555556777
97655544334566665555567899abbbba98888899988888776555655544456555667777
97655544444566665556667899aaaaba98888999877777776555555444456666667777
866555444456666666566789999aaaaa98889998877777766556544443456667777777
976555445556776666666789aa99aaaa98889998876777666555544444456677887777
9765554556667777776667899999aaaa98889988876676666555443444446678888888
87655555666777788766678999899aaa99889988776666666554433344446789998888
876555566777788888766889998899a999889987776666666543333334456899a99899
766556677877889998877888888889a99998888777666666653222233345799aaa999a
6665556777777899998878988888899999999887777656666543222233446899aa999a
6655456777777899999888988888889999a988887776566666532222233457899a999a
665555677777789999998998888878899aa9888887765666655322222234578899aa9a
665555677777789999a98888888877899aa9888887766666655322222234467899aa9a
65666677667778999aaa988878877789aaa9888887776676654322222344467889aa9a
55566677767788899aaa987777777789aaa9888887776666654322222344567889aaa9
5566767777788889aaaa987777777789aaaa988887777666555432122344556899aaa9
5567777777788889aaaa977777777789aaaa99888777766555543212234555689aaaaa
5667877777889989aaa9876677777889aaaa99888777765554443212334555689aaaaa
noise :: PerlinNoise :: _layers
Layers ofInterpolatedNoise composing self
noise :: PerlinNoise :: defaultinit
noise :: PerlinNoise :: layers
Layers ofInterpolatedNoise composing self
noise :: PerlinNoise :: layers=
Layers ofInterpolatedNoise composing self
noise :: PerlinNoise :: pseudo_random
Deterministic pseudo random number generatornoise $ PerlinNoise :: SELF
Type of this instance, automatically specialized in every classnoise $ PerlinNoise :: core_serialize_to
Actual serialization ofself to serializer
noise $ PerlinNoise :: from_deserializer
Create an instance of this class from thedeserializer
noise :: PerlinNoise :: _layers
Layers ofInterpolatedNoise composing self
serialization :: Serializable :: accept_inspect_serializer_core
serialization :: Serializable :: accept_json_serializer
Refinable service to customize the serialization of this class to JSONserialization :: Serializable :: accept_msgpack_attribute_counter
Hook to customize the behavior of theAttributeCounter
serialization :: Serializable :: accept_msgpack_serializer
Hook to customize the serialization of this class to MessagePackserialization :: Serializable :: add_to_bundle
Called by[]= to dynamically choose the appropriate method according
noise :: Noise :: amplitude=
Set the desired amplitude of the values returned by[]
core :: Object :: class_factory
Implementation used byget_class to create the specific class.
serialization :: Serializable :: core_serialize_to
Actual serialization ofself to serializer
noise :: PerlinNoise :: defaultinit
noise :: Noise :: defaultinit
core :: Object :: defaultinit
serialization :: Serializable :: from_deserializer
Create an instance of this class from thedeserializer
core :: Object :: is_same_instance
Return true ifself and other are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself the same as other in a serialization context?
core :: Object :: is_same_type
Return true ifself and other have the same dynamic type.
noise :: PerlinNoise :: layers
Layers ofInterpolatedNoise composing self
noise :: PerlinNoise :: layers=
Layers ofInterpolatedNoise composing self
serialization :: Serializable :: msgpack_extra_array_items
Hook to request a larger than usual metadata arraycore :: Object :: native_class_name
The class name of the object in CString format.core :: Object :: output_class_name
Display class name on stdout (debug only).noise :: PerlinNoise :: pseudo_random
Deterministic pseudo random number generatorserialization :: Serializable :: serialize_msgpack
Serializeself to MessagePack bytes
serialization :: Serializable :: serialize_to
Serializeself to serializer
serialization :: Serializable :: serialize_to_json
Serializeself to JSON
serialization :: Serializable :: serialize_to_or_delay
Accept references or force direct serialization (usingserialize_to)
serialization :: Serializable :: to_pretty_json
Serializeself to plain pretty JSON
Serializer::serialize
# 2D Perlin noise generator using layered `InterpolatedNoise`
#
# Get values at any coordinates with `[]`.
# The behavior of this generator can be customized using its attributes `min`,
# `max`, `period` and `seed`.
#
# This noise is more realistic and less smooth than the `InterpolatedNoise`.
#
# Due to implementation logic, the full amplitude cannot be reached.
# In practice, only `amplitude * (1.0 - 1.0 / n_levels)` is covered.
#
# This implementation uses a custom deterministic pseudo random number
# generator to set `InterpolatedNoise::seed` of the `layers`.
# It is seeded with the local `seed` and can be further customized by
# redefining `pseudo_random`.
# This process do not require any state, so this class only holds the
# attributes of the generator and does not keep any generated data.
#
# ## Usage example
#
# ~~~
# var map = new PerlinNoise
# map.min = 0.0
# map.max = 16.0
# map.period = 20.0
# map.seed = 0
#
# var max = 0.0
# var min = 100.0
# for y in 30.times do
# for x in 70.times do
# # Get a value at x, y
# var val = map[x.to_f, y.to_f]
# printn val.to_i.to_hex
#
# max = max.max(val)
# min = min.min(val)
# end
# print ""
# end
# assert max <= map.max
# assert min >= map.min
# ~~~
#
# ## Result at seed == 0
#
# ~~~raw
# 76666555444322234567789abbcbbaabbaa98777766665665566667888987655444444
# 776665554443322234567789abbbbbbbbba98777766666665556666788998654444444
# 777766544443322234566789abbbbbbbbaa99877777776665556666788888655444444
# 777776444443322244556679abbbccbbbaa99877777776655556666688888655444444
# 777766444444332244555678abbbccbbbaa99887787877655556666678888654444444
# 8887654344443333444456789abcccbbaa999877888886555555666688777654444455
# 8887654344443333444456789abbcdcbaa999887889887655555566677777654444456
# 7876654434444444444456778abbcccaaa999888899888655555566677777654444556
# 78765544344445544444567789bbccca99999888899988765555566666667654445566
# 77765444344455554445567889bbccba99999998999988765555566555666654445667
# 7765444334555665445556788abbbba988998999999988765555566545556554456677
# 87654444334556655455567899bbbba998888899999887766555566544556555456777
# 87655444334566665555567899bbbbba98888899988888776555566544556555556777
# 97655544334566665555567899abbbba98888899988888776555655544456555667777
# 97655544444566665556667899aaaaba98888999877777776555555444456666667777
# 866555444456666666566789999aaaaa98889998877777766556544443456667777777
# 976555445556776666666789aa99aaaa98889998876777666555544444456677887777
# 9765554556667777776667899999aaaa98889988876676666555443444446678888888
# 87655555666777788766678999899aaa99889988776666666554433344446789998888
# 876555566777788888766889998899a999889987776666666543333334456899a99899
# 766556677877889998877888888889a99998888777666666653222233345799aaa999a
# 6665556777777899998878988888899999999887777656666543222233446899aa999a
# 6655456777777899999888988888889999a988887776566666532222233457899a999a
# 665555677777789999998998888878899aa9888887765666655322222234578899aa9a
# 665555677777789999a98888888877899aa9888887766666655322222234467899aa9a
# 65666677667778999aaa988878877789aaa9888887776676654322222344467889aa9a
# 55566677767788899aaa987777777789aaa9888887776666654322222344567889aaa9
# 5566767777788889aaaa987777777789aaaa988887777666555432122344556899aaa9
# 5567777777788889aaaa977777777789aaaa99888777766555543212234555689aaaaa
# 5667877777889989aaa9876677777889aaaa99888777765554443212334555689aaaaa
# ~~~
class PerlinNoise
super Noise
# Desired number of `layers`
#
# This attribute must be assigned before any call to `layers` or `[]`.
#
# By default, it is the highest integer under the logarithm base 2
# of `amplitude`, or 4, whichever is the highest.
var n_layers: Int = 4.max(amplitude.abs.log_base(2.0).to_i) is lazy, writable
# Layers of `InterpolatedNoise` composing `self`
var layers: Array[InterpolatedNoise] is lazy do
var layers = new Array[InterpolatedNoise]
var max = max
var min = min
var period = period
var seed = seed
for l in n_layers.times do
min = min / 2.0
max = max / 2.0
seed = pseudo_random(seed)
var layer = new InterpolatedNoise
layer.min = min
layer.max = max
layer.period = period
layer.seed = seed
layers.add layer
period = period / 2.0
end
return layers
end
redef fun [](x, y)
do
var val = 0.0
for layer in layers do
val += layer[x, y]
end
return val
end
# Deterministic pseudo random number generator
#
# Used to get seeds for layers from the previous layers or `seed`.
protected fun pseudo_random(value: Int): Int
do
return (value * 3537391).mask % 1291377
end
end
lib/noise/noise.nit:72,1--202,3