Clean-up and add simplexQuintic, simplexHermite
This commit is contained in:
@@ -1,7 +1,11 @@
|
|||||||
package org.openrndr.extra.noise
|
package org.openrndr.extra.noise
|
||||||
|
|
||||||
|
fun cubicLinear(seed: Int, x: Double, y: Double) = cubic(seed, x, y, ::linear)
|
||||||
|
fun cubicQuintic(seed: Int, x: Double, y: Double) = cubic(seed, x, y, ::quintic)
|
||||||
|
fun cubicHermite(seed: Int, x: Double, y: Double) = cubic(seed, x, y, ::hermite)
|
||||||
|
|
||||||
private const val CUBIC_2D_BOUNDING = 1 / (1.5 * 1.5).toFloat()
|
private const val CUBIC_2D_BOUNDING = 1 / (1.5 * 1.5).toFloat()
|
||||||
fun cubic(seed: Int, x: Double, y: Double): Double {
|
fun cubic(seed: Int, x: Double, y: Double, interpolator: (Double) -> Double = ::linear): Double {
|
||||||
val x1 = x.fastFloor()
|
val x1 = x.fastFloor()
|
||||||
val y1 = y.fastFloor()
|
val y1 = y.fastFloor()
|
||||||
|
|
||||||
@@ -12,8 +16,8 @@ fun cubic(seed: Int, x: Double, y: Double): Double {
|
|||||||
val x3 = x1 + 2
|
val x3 = x1 + 2
|
||||||
val y3 = y1 + 2
|
val y3 = y1 + 2
|
||||||
|
|
||||||
val xs = x - x1.toDouble()
|
val xs = interpolator(x - x1.toDouble())
|
||||||
val ys = y - y1.toDouble()
|
val ys = interpolator(y - y1.toDouble())
|
||||||
|
|
||||||
return cubic(
|
return cubic(
|
||||||
cubic(valCoord2D(seed, x0, y0), valCoord2D(seed, x1, y0), valCoord2D(seed, x2, y0), valCoord2D(seed, x3, y0),
|
cubic(valCoord2D(seed, x0, y0), valCoord2D(seed, x1, y0), valCoord2D(seed, x2, y0), valCoord2D(seed, x3, y0),
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package org.openrndr.extra.noise
|
package org.openrndr.extra.noise
|
||||||
|
|
||||||
|
|
||||||
private const val CUBIC_3D_BOUNDING = 1 / (1.5 * 1.5 * 1.5).toFloat()
|
private const val CUBIC_3D_BOUNDING = 1 / (1.5 * 1.5 * 1.5).toFloat()
|
||||||
|
|
||||||
fun cubic(seed: Int, x: Double, y: Double, z: Double): Double {
|
fun cubic(seed: Int, x: Double, y: Double, z: Double) = cubic(seed, x, y, z, ::linear)
|
||||||
|
fun cubicLinear(seed: Int, x: Double, y: Double, z: Double) = cubic(seed, x, y, z, ::linear)
|
||||||
|
fun cubicQuintic(seed: Int, x: Double, y: Double, z: Double) = cubic(seed, x, y, z, ::quintic)
|
||||||
|
fun cubicHermite(seed: Int, x: Double, y: Double, z: Double) = perlin(seed, x, y, z, ::hermite)
|
||||||
|
|
||||||
|
fun cubic(seed: Int, x: Double, y: Double, z: Double, interpolator: (Double) -> Double): Double {
|
||||||
val x1 = x.fastFloor()
|
val x1 = x.fastFloor()
|
||||||
val y1 = y.fastFloor()
|
val y1 = y.fastFloor()
|
||||||
val z1 = z.fastFloor()
|
val z1 = z.fastFloor()
|
||||||
@@ -18,9 +22,9 @@ fun cubic(seed: Int, x: Double, y: Double, z: Double): Double {
|
|||||||
val y3 = y1 + 2
|
val y3 = y1 + 2
|
||||||
val z3 = z1 + 2
|
val z3 = z1 + 2
|
||||||
|
|
||||||
val xs = x - x1.toFloat()
|
val xs = interpolator(x - x1.toFloat())
|
||||||
val ys = y - y1.toFloat()
|
val ys = interpolator(y - y1.toFloat())
|
||||||
val zs = z - z1.toFloat()
|
val zs = interpolator(z - z1.toFloat())
|
||||||
|
|
||||||
return cubic(
|
return cubic(
|
||||||
cubic(
|
cubic(
|
||||||
|
|||||||
@@ -3,19 +3,16 @@ package org.openrndr.extra.noise
|
|||||||
import org.openrndr.math.Vector2
|
import org.openrndr.math.Vector2
|
||||||
import org.openrndr.math.Vector3
|
import org.openrndr.math.Vector3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private const val X_PRIME = 1619
|
private const val X_PRIME = 1619
|
||||||
private const val Y_PRIME = 31337
|
private const val Y_PRIME = 31337
|
||||||
private const val Z_PRIME = 6971
|
private const val Z_PRIME = 6971
|
||||||
private const val W_PRIME = 1013
|
private const val W_PRIME = 1013
|
||||||
|
|
||||||
|
private val GRAD_2D = arrayOf(
|
||||||
private val GRAD_2D = arrayOf(Vector2(-1.0, -1.0), Vector2(1.0, -1.0), Vector2(-1.0, 1.0),
|
Vector2(-1.0, -1.0), Vector2(1.0, -1.0), Vector2(-1.0, 1.0),
|
||||||
Vector2(1.0, 1.0), Vector2(0.0, -1.0), Vector2(-1.0, 0.0),
|
Vector2(1.0, 1.0), Vector2(0.0, -1.0), Vector2(-1.0, 0.0),
|
||||||
Vector2(0.0, 1.0), Vector2(1.0, 0.0))
|
Vector2(0.0, 1.0), Vector2(1.0, 0.0))
|
||||||
|
|
||||||
|
|
||||||
private val GRAD_3D = arrayOf(
|
private val GRAD_3D = arrayOf(
|
||||||
Vector3(1.0, 1.0, 0.0), Vector3(-1.0, 1.0, 0.0), Vector3(1.0, -1.0, 0.0), Vector3(-1.0, -1.0, 0.0),
|
Vector3(1.0, 1.0, 0.0), Vector3(-1.0, 1.0, 0.0), Vector3(1.0, -1.0, 0.0), Vector3(-1.0, -1.0, 0.0),
|
||||||
Vector3(1.0, 0.0, 1.0), Vector3(-1.0, 0.0, 1.0), Vector3(1.0, 0.0, -1.0), Vector3(-1.0, 0.0, -1.0),
|
Vector3(1.0, 0.0, 1.0), Vector3(-1.0, 0.0, 1.0), Vector3(1.0, 0.0, -1.0), Vector3(-1.0, 0.0, -1.0),
|
||||||
@@ -49,7 +46,6 @@ fun gradCoord3D(seed: Int, x: Int, y: Int, z: Int, xd: Double, yd: Double, zd: D
|
|||||||
return xd * g.x + yd * g.y + zd * g.z
|
return xd * g.x + yd * g.y + zd * g.z
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun gradCoord4D(seed: Int, x: Int, y: Int, z: Int, w: Int, xd: Double, yd: Double, zd: Double, wd: Double): Double {
|
fun gradCoord4D(seed: Int, x: Int, y: Int, z: Int, w: Int, xd: Double, yd: Double, zd: Double, wd: Double): Double {
|
||||||
var hash = seed
|
var hash = seed
|
||||||
hash = hash xor X_PRIME * x
|
hash = hash xor X_PRIME * x
|
||||||
@@ -124,6 +120,12 @@ fun hash4D(seed: Int, x: Int, y: Int, z: Int, w: Int): Int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun valCoord1D(seed: Int, x: Int): Double {
|
||||||
|
var n = seed
|
||||||
|
n = n xor X_PRIME * x
|
||||||
|
return n * n * n * 60493 / 2147483648.0
|
||||||
|
}
|
||||||
|
|
||||||
fun valCoord2D(seed: Int, x: Int, y: Int): Double {
|
fun valCoord2D(seed: Int, x: Int, y: Int): Double {
|
||||||
var n = seed
|
var n = seed
|
||||||
n = n xor X_PRIME * x
|
n = n xor X_PRIME * x
|
||||||
@@ -141,7 +143,6 @@ fun valCoord3D(seed: Int, x: Int, y: Int, z: Int): Double {
|
|||||||
return n * n * n * 60493 / 2147483648.0
|
return n * n * n * 60493 / 2147483648.0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun valCoord4D(seed: Int, x: Int, y: Int, z: Int, w: Int): Double {
|
private fun valCoord4D(seed: Int, x: Int, y: Int, z: Int, w: Int): Double {
|
||||||
var n = seed
|
var n = seed
|
||||||
n = n xor X_PRIME * x
|
n = n xor X_PRIME * x
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package org.openrndr.extra.noise
|
package org.openrndr.extra.noise
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fun hermite(t: Double): Double {
|
fun hermite(t: Double): Double {
|
||||||
return t * t * (3 - 2 * t)
|
return t * t * (3 - 2 * t)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package org.openrndr.extra.noise
|
package org.openrndr.extra.noise
|
||||||
|
|
||||||
|
fun perlin(seed: Int, x: Double, y: Double) = perlin(seed, x, y, ::linear)
|
||||||
fun perlinLinear(seed: Int, x: Double, y: Double) = perlin(seed, x, y, ::linear)
|
fun perlinLinear(seed: Int, x: Double, y: Double) = perlin(seed, x, y, ::linear)
|
||||||
fun perlinQuintic(seed: Int, x: Double, y: Double) = perlin(seed, x, y, ::quintic)
|
fun perlinQuintic(seed: Int, x: Double, y: Double) = perlin(seed, x, y, ::quintic)
|
||||||
fun perlinHermite(seed: Int, x: Double, y: Double) = perlin(seed, x, y, ::hermite)
|
fun perlinHermite(seed: Int, x: Double, y: Double) = perlin(seed, x, y, ::hermite)
|
||||||
|
|
||||||
private fun perlin(seed: Int, x: Double, y: Double, interpolator: (Double) -> Double): Double {
|
inline fun perlin(seed: Int, x: Double, y: Double, crossinline interpolator: (Double) -> Double): Double {
|
||||||
val x0 = x.fastFloor()
|
val x0 = x.fastFloor()
|
||||||
val y0 = y.fastFloor()
|
val y0 = y.fastFloor()
|
||||||
val x1 = x0 + 1
|
val x1 = x0 + 1
|
||||||
@@ -13,7 +14,6 @@ private fun perlin(seed: Int, x: Double, y: Double, interpolator: (Double) -> Do
|
|||||||
val xs = interpolator(x - x0)
|
val xs = interpolator(x - x0)
|
||||||
val ys = interpolator(y - y0)
|
val ys = interpolator(y - y0)
|
||||||
|
|
||||||
|
|
||||||
val xd0 = x - x0
|
val xd0 = x - x0
|
||||||
val yd0 = y - y0
|
val yd0 = y - y0
|
||||||
val xd1 = xd0 - 1
|
val xd1 = xd0 - 1
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
package org.openrndr.extra.noise
|
package org.openrndr.extra.noise
|
||||||
|
|
||||||
|
private const val G2 = 1.0 / 4.0
|
||||||
|
private const val F2 = 1.0 / 2.0
|
||||||
|
|
||||||
private val G2 = 1.0 / 4.0
|
fun simplexLinear(seed: Int, x: Double, y: Double) = simplex(seed, x, y, ::linear)
|
||||||
private val F2 = 1.0 / 2.0
|
fun simplexQuintic(seed: Int, x: Double, y: Double) = simplex(seed, x, y, ::quintic)
|
||||||
|
fun simplexHermite(seed: Int, x: Double, y: Double) = simplex(seed, x, y, ::hermite)
|
||||||
|
|
||||||
fun simplex(seed: Int, x: Double, y: Double): Double {
|
fun simplex(seed: Int, x: Double, y: Double, interpolator: (Double) -> Double = ::linear): Double {
|
||||||
var t = (x + y) * F2
|
var t = (x + y) * F2
|
||||||
val i = (x + t).fastFloor()
|
val i = (x + t).fastFloor()
|
||||||
val j = (y + t).fastFloor()
|
val j = (y + t).fastFloor()
|
||||||
@@ -13,8 +16,8 @@ fun simplex(seed: Int, x: Double, y: Double): Double {
|
|||||||
val X0 = i - t
|
val X0 = i - t
|
||||||
val Y0 = j - t
|
val Y0 = j - t
|
||||||
|
|
||||||
val x0 = x - X0
|
val x0 = interpolator(x - X0)
|
||||||
val y0 = y - Y0
|
val y0 = interpolator(y - Y0)
|
||||||
|
|
||||||
val i1: Int
|
val i1: Int
|
||||||
val j1: Int
|
val j1: Int
|
||||||
|
|||||||
@@ -1,16 +1,20 @@
|
|||||||
package org.openrndr.extra.noise
|
package org.openrndr.extra.noise
|
||||||
|
|
||||||
fun simplex(seed: Int, x: Double, y: Double, z: Double): Double {
|
fun simplexLinear(seed: Int, x: Double, y: Double, z: Double) = simplex(seed, x, y, z, ::linear)
|
||||||
|
fun simplexQuintic(seed: Int, x: Double, y: Double, z: Double) = simplex(seed, x, y, z, ::quintic)
|
||||||
|
fun simplexHermite(seed: Int, x: Double, y: Double, z: Double) = simplex(seed, x, y, z, ::hermite)
|
||||||
|
|
||||||
var t = (x + y + z) / 3.0
|
fun simplex(seed: Int, x: Double, y: Double, z: Double, interpolator: (Double) -> Double = ::linear): Double {
|
||||||
|
|
||||||
|
val t = (x + y + z) / 3.0
|
||||||
val i = (x + t).fastFloor()
|
val i = (x + t).fastFloor()
|
||||||
val j = (y + t).fastFloor()
|
val j = (y + t).fastFloor()
|
||||||
val k = (z + t).fastFloor()
|
val k = (z + t).fastFloor()
|
||||||
|
|
||||||
val t2 = (i + j + k) / 6.0
|
val t2 = (i + j + k) / 6.0
|
||||||
val x0 = x - (i - t2)
|
val x0 = interpolator(x - (i - t2))
|
||||||
val y0 = y - (j - t2)
|
val y0 = interpolator(y - (j - t2))
|
||||||
val z0 = z - (k - t2)
|
val z0 = interpolator(z - (k - t2))
|
||||||
|
|
||||||
val i1: Int
|
val i1: Int
|
||||||
val j1: Int
|
val j1: Int
|
||||||
|
|||||||
@@ -11,10 +11,14 @@ private val SIMPLEX_4D = byteArrayOf(
|
|||||||
2, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, 0, 0, 0, 0, 3, 2, 0, 1, 3, 2, 1, 0
|
2, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, 0, 0, 0, 0, 3, 2, 0, 1, 3, 2, 1, 0
|
||||||
)
|
)
|
||||||
|
|
||||||
private val F4 = ((2.23606797 - 1.0) / 4.0)
|
private const val F4 = ((2.23606797 - 1.0) / 4.0)
|
||||||
private val G4 = ((5.0 - 2.23606797) / 20.0)
|
private const val G4 = ((5.0 - 2.23606797) / 20.0)
|
||||||
|
|
||||||
fun simplex(seed: Int, x: Double, y: Double, z: Double, w: Double): Double {
|
fun simplexLinear(seed: Int, x: Double, y: Double, z: Double, w: Double) = simplex(seed, x, y, z, w, ::linear)
|
||||||
|
fun simplexQuintic(seed: Int, x: Double, y: Double, z: Double, w: Double) = simplex(seed, x, y, z, w, ::quintic)
|
||||||
|
fun simplexHermite(seed: Int, x: Double, y: Double, z: Double, w: Double) = simplex(seed, x, y, z, w, ::hermite)
|
||||||
|
|
||||||
|
fun simplex(seed: Int, x: Double, y: Double, z: Double, w: Double, interpolator: (Double) -> Double = ::linear): Double {
|
||||||
|
|
||||||
var t = (x + y + z + w) * F4
|
var t = (x + y + z + w) * F4
|
||||||
val i = (x + t).fastFloor()
|
val i = (x + t).fastFloor()
|
||||||
@@ -23,10 +27,10 @@ fun simplex(seed: Int, x: Double, y: Double, z: Double, w: Double): Double {
|
|||||||
val l = (w + t).fastFloor()
|
val l = (w + t).fastFloor()
|
||||||
|
|
||||||
val t2 = (i + j + k + l) * G4
|
val t2 = (i + j + k + l) * G4
|
||||||
val x0 = x - (i - t2)
|
val x0 = interpolator(x - (i - t2))
|
||||||
val y0 = y - (j - t2)
|
val y0 = interpolator(y - (j - t2))
|
||||||
val z0 = z - (k - t2)
|
val z0 = interpolator(z - (k - t2))
|
||||||
val w0 = w - (l - t2)
|
val w0 = interpolator(w - (l - t2))
|
||||||
|
|
||||||
var c = if (x0 > y0) 32 else 0
|
var c = if (x0 > y0) 32 else 0
|
||||||
c += if (x0 > z0) 16 else 0
|
c += if (x0 > z0) 16 else 0
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ import org.openrndr.math.Vector3
|
|||||||
import org.openrndr.math.Vector4
|
import org.openrndr.math.Vector4
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
|
fun random(min: Double = -1.0, max: Double = 1.0, random: Random = Random.Default): Double {
|
||||||
|
return (random.nextDouble() * (max - min)) + min
|
||||||
|
}
|
||||||
|
|
||||||
fun Double.Companion.uniform(min: Double = -1.0, max: Double = 1.0, random: Random = Random.Default): Double {
|
fun Double.Companion.uniform(min: Double = -1.0, max: Double = 1.0, random: Random = Random.Default): Double {
|
||||||
return (random.nextDouble() * (max - min)) + min
|
return (random.nextDouble() * (max - min)) + min
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ fun valueLinear(seed: Int, x:Double, y:Double) = value(seed, x, y, ::linear)
|
|||||||
fun valueQuintic(seed: Int, x: Double, y: Double) = value(seed, x, y, ::quintic)
|
fun valueQuintic(seed: Int, x: Double, y: Double) = value(seed, x, y, ::quintic)
|
||||||
fun valueHermite(seed: Int, x: Double, y: Double) = value(seed, x, y, ::hermite)
|
fun valueHermite(seed: Int, x: Double, y: Double) = value(seed, x, y, ::hermite)
|
||||||
|
|
||||||
|
|
||||||
inline fun value(seed: Int, x: Double, y: Double, crossinline interpolation: (Double) -> Double = ::linear): Double {
|
inline fun value(seed: Int, x: Double, y: Double, crossinline interpolation: (Double) -> Double = ::linear): Double {
|
||||||
val x0 = x.fastFloor()
|
val x0 = x.fastFloor()
|
||||||
val y0 = y.fastFloor()
|
val y0 = y.fastFloor()
|
||||||
|
|||||||
Reference in New Issue
Block a user