import io.data2viz.color.*
import io.data2viz.geom.*
import io.data2viz.math.*
import io.data2viz.timer.*
import io.data2viz.force.*
import io.data2viz.viz.*
import io.data2viz.random.*
fun main() {
val vizSize = 200.0
val randPos = RandomDistribution.uniform(.0, vizSize)
data class LayeredPoint(val position:Point, val layer:Int)
val items = (0..500).map { LayeredPoint(point(randPos(), randPos()), it%12 ) }
lateinit var viz:Viz
val viewCenter = point(vizSize / 2, vizSize / 2)
val simulation1 = forceSimulation<LayeredPoint> {
initForceNode = {
position = domain.position
}
forceRadial {
centerGet = { viewCenter }
radiusGet = { domain.layer * 7.0 }
}
domainObjects = items
intensityMin = 10.pct
intensityDecay = 1.pct
}
val simulation2 = forceSimulation<LayeredPoint> {
initForceNode = {
position = domain.position
}
forceRadial {
centerGet = { viewCenter }
radiusGet = { domain.layer * 7.0 }
}
domainObjects = items
intensityMin = 10.pct
intensityDecay = 1.pct
friction = 50.pct
}
val simulation3 = forceSimulation<LayeredPoint> {
initForceNode = {
position = domain.position
}
forceRadial {
centerGet = { viewCenter }
radiusGet = { domain.layer * 7.0 }
}
domainObjects = items
intensityMin = 10.pct
intensityDecay = 1.pct
friction = 5.pct
on(SimulationEvent.END, "End of simulation", { viz.stopAnimations() })
}
val particles1 = mutableListOf<CircleNode>()
val particles2 = mutableListOf<CircleNode>()
val particles3 = mutableListOf<CircleNode>()
viz = viz {
size = size(600, 200)
simulation1.nodes.forEach { forceNode ->
particles1 += circle {
radius = 2.0
fill = Colors.hsl((forceNode.domain.layer * 30).deg, 100.pct, 50.pct)
}
}
simulation2.nodes.forEach { forceNode ->
particles2 += circle {
radius = 2.0
fill = Colors.hsl((forceNode.domain.layer * 30).deg, 100.pct, 50.pct)
}
}
simulation3.nodes.forEach { forceNode ->
particles3 += circle {
radius = 2.0
fill = Colors.hsl((forceNode.domain.layer * 30).deg, 100.pct, 50.pct)
}
}
animation {
simulation1.nodes.forEach { forceNode ->
particles1[forceNode.index].apply {
x = forceNode.x
y = forceNode.y
}
}
simulation2.nodes.forEach { forceNode ->
particles2[forceNode.index].apply {
x = 200 + forceNode.x
y = forceNode.y
}
}
simulation3.nodes.forEach { forceNode ->
particles3[forceNode.index].apply {
x = 400 + forceNode.x
y = forceNode.y
}
}
}
}
viz.bindRendererOnNewCanvas()
}