import io.data2viz.color.*
import io.data2viz.geom.*
import io.data2viz.math.*
import io.data2viz.viz.*
import io.data2viz.hierarchy.*
import io.data2viz.shape.link.*
data class TNode(val value: String, val childs: List<TNode>? = null)
val tNodes = listOf(
TNode("Root", listOf(
TNode("1"),
TNode("2"),
TNode("3", listOf(
TNode("31"),
TNode("32"),
TNode("33", listOf(
TNode("331")
))
))
))
)
private val linkBuilder = linkBuilderV<TreeNode<TNode>> {
x0 = { it.parent?.x ?: .0 }
x1 = { it.x }
y0 = { it.parent?.y ?: .0 }
y1 = { it.y }
}
private fun GroupNode.drawNodeRecursive(node: TreeNode<TNode>) {
node.children.forEach { child ->
val p = path {
strokeColor = Colors.Web.darkred
}
linkBuilder.link(child, p)
drawNodeRecursive(child)
}
circle {
x = node.x
y = node.y
radius = 16.0
fill = Colors.Web.floralwhite
strokeColor = Colors.Web.darkred
}
text {
x = node.x
y = node.y
textContent = node.data!!.value
hAlign = TextHAlign.MIDDLE
vAlign = TextVAlign.MIDDLE
}
}
val vizWidth = 400.0
val vizHeight = 400.0
fun main() {
viz {
// create the Viz
size = size(vizWidth, vizHeight)
// build a hierarchy
val hierarchy = hierarchy(tNodes.first(), { it.childs })
// use this hierarchy to create a TreeLayout
val treeLayout = TreeLayout<TNode>()
treeLayout.size(300.0, 300.0)
// use this TreeLayout to generate the visual information to draw the tree
val tree = treeLayout.tree(hierarchy)
group {
transform {
translate(50.0, 50.0)
}
// recursive function that draw every node and its children
drawNodeRecursive(tree)
}
}.bindRendererOnNewCanvas()
}