91 lines
3.4 KiB
Kotlin
91 lines
3.4 KiB
Kotlin
package simplexrange
|
|
|
|
import org.openrndr.application
|
|
import org.openrndr.color.ColorRGBa
|
|
import org.openrndr.draw.isolated
|
|
import kotlin.random.Random
|
|
import org.openrndr.extra.noise.simplexrange.uniformSimplex
|
|
import org.openrndr.math.Polar
|
|
import org.openrndr.math.Vector2
|
|
import kotlin.math.cos
|
|
import kotlin.math.floor
|
|
|
|
/**
|
|
* This demo creates a dynamic graphical output utilizing simplex and
|
|
* linear interpolation-based color ranges.
|
|
*
|
|
* Functionalities:
|
|
* - Defines a list of base colors converted to LAB color space for smooth interpolation.
|
|
* - Constructs a 3D simplex range and a 2D linear range for color sampling.
|
|
* - Randomly populates two sections of the screen with rectangles filled with colors
|
|
* sampled from simplex and linear ranges respectively.
|
|
* - Draws a vertical divider line in the middle of the application window.
|
|
*/
|
|
fun main() {
|
|
application {
|
|
configure {
|
|
width = 720
|
|
height = 720
|
|
}
|
|
program {
|
|
extend {
|
|
val positions = (0 until 3).map { Polar((30.0 + it * 120.0), 180.0).cartesian }
|
|
val colors = listOf(ColorRGBa.PINK, ColorRGBa.RED, ColorRGBa.BLUE).map { it.toLABa() }
|
|
val freq = 1.0
|
|
|
|
drawer.stroke = null
|
|
|
|
val power = cos(floor(seconds*freq)/freq) *16.0 + 16.0
|
|
drawer.isolated {
|
|
drawer.translate(drawer.bounds.position(0.25,0.25) + Vector2(0.0, 40.0))
|
|
val rp = Random((seconds * freq).toInt())
|
|
val rc = Random((seconds * freq).toInt())
|
|
for (i in 0 until 32 * 32) {
|
|
drawer.fill = colors.uniformSimplex(rc, 1, power).toRGBa()
|
|
drawer.circle(positions.uniformSimplex(rp, 1, power), 2.0)
|
|
}
|
|
}
|
|
drawer.isolated {
|
|
drawer.translate(drawer.bounds.position(0.75,0.75) + Vector2(0.0, 40.0))
|
|
val rp = Random((seconds * freq).toInt())
|
|
val rc = Random((seconds * freq).toInt())
|
|
for (i in 0 until 32 * 32) {
|
|
drawer.fill = colors.uniformSimplex(rc, 2, power).toRGBa()
|
|
drawer.circle(positions.uniformSimplex(rp, 2, power), 2.0)
|
|
}
|
|
}
|
|
|
|
|
|
drawer.isolated {
|
|
drawer.stroke = null
|
|
val rc = Random((seconds * freq).toInt())
|
|
drawer.translate(drawer.bounds.position(0.5,0.0) + Vector2(20.0, 20.0))
|
|
|
|
for (i in 0 until 32 * 32) {
|
|
val x = i.mod(32)
|
|
val y = i / 32
|
|
drawer.fill = colors.uniformSimplex(rc, 1, power).toRGBa()
|
|
drawer.rectangle(x * 10.0, y * 10.0, 10.0, 10.0)
|
|
}
|
|
|
|
}
|
|
|
|
drawer.isolated {
|
|
drawer.stroke = null
|
|
val rc = Random((seconds * freq).toInt())
|
|
|
|
drawer.translate(drawer.bounds.position(0.0,0.5) + Vector2(20.0, 20.0))
|
|
|
|
for (i in 0 until 32 * 32) {
|
|
val x = i.mod(32)
|
|
val y = i / 32
|
|
drawer.fill = colors.uniformSimplex(rc, 2, power).toRGBa()
|
|
drawer.rectangle(x * 10.0, y * 10.0, 10.0, 10.0)
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
} |