85 lines
2.0 KiB
Kotlin
85 lines
2.0 KiB
Kotlin
package ru.dbotthepony.kstarbound.util.random
|
|
|
|
import ru.dbotthepony.kstarbound.defs.PerlinNoiseParameters
|
|
import kotlin.math.absoluteValue
|
|
|
|
class RidgedNoise(parameters: PerlinNoiseParameters) : AbstractPerlinNoise(parameters) {
|
|
init {
|
|
require(parameters.type == PerlinNoiseParameters.Type.RIDGED_MULTI)
|
|
}
|
|
|
|
override fun get(x: Double): Double {
|
|
checkInit()
|
|
var sum = 0.0
|
|
var p = x * parameters.frequency
|
|
var scale = 1.0
|
|
var weight = 1.0
|
|
|
|
for (i in 0 until parameters.octaves) {
|
|
var value = noise1(p)
|
|
value = parameters.offset - value.absoluteValue
|
|
value *= value
|
|
value *= weight
|
|
|
|
weight = (value * parameters.gain).coerceIn(0.0, 1.0)
|
|
|
|
sum += value / scale
|
|
scale *= parameters.alpha
|
|
p *= parameters.beta
|
|
}
|
|
|
|
return ((sum * 1.25) - 1.0) * parameters.amplitude + parameters.bias
|
|
}
|
|
|
|
override fun get(x: Double, y: Double): Double {
|
|
checkInit()
|
|
var sum = 0.0
|
|
var px = x * parameters.frequency
|
|
var py = y * parameters.frequency
|
|
var scale = 1.0
|
|
var weight = 1.0
|
|
|
|
for (i in 0 until parameters.octaves) {
|
|
var value = noise2(px, py)
|
|
value = parameters.offset - value.absoluteValue
|
|
value *= value
|
|
value *= weight
|
|
|
|
weight = (value * parameters.gain).coerceIn(0.0, 1.0)
|
|
|
|
sum += value / scale
|
|
scale *= parameters.alpha
|
|
px *= parameters.beta
|
|
py *= parameters.beta
|
|
}
|
|
|
|
return ((sum * 1.25) - 1.0) * parameters.amplitude + parameters.bias
|
|
}
|
|
|
|
override fun get(x: Double, y: Double, z: Double): Double {
|
|
checkInit()
|
|
var sum = 0.0
|
|
var px = x * parameters.frequency
|
|
var py = y * parameters.frequency
|
|
var pz = z * parameters.frequency
|
|
var scale = 1.0
|
|
var weight = 1.0
|
|
|
|
for (i in 0 until parameters.octaves) {
|
|
var value = noise3(px, py, pz)
|
|
value = parameters.offset - value.absoluteValue
|
|
value *= value
|
|
value *= weight
|
|
|
|
weight = (value * parameters.gain).coerceIn(0.0, 1.0)
|
|
|
|
sum += value / scale
|
|
scale *= parameters.alpha
|
|
px *= parameters.beta
|
|
py *= parameters.beta
|
|
pz *= parameters.beta
|
|
}
|
|
|
|
return ((sum * 1.25) - 1.0) * parameters.amplitude + parameters.bias
|
|
}
|
|
} |