Files
orx/orx-kdtree/src/jvmDemo/kotlin/DemoKNearestNeighbour01.kt
2025-01-24 23:05:40 +01:00

43 lines
1.6 KiB
Kotlin

import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.extra.kdtree.kdTree
import org.openrndr.math.Vector2
import org.openrndr.shape.LineSegment
/**
* This demo initializes an interactive graphical application where 1000 randomly distributed points
* are displayed on a 2D canvas. A KD-tree structure is used for spatial querying of the points, enabling
* efficient nearest-neighbor searches based on the user's cursor position. The closest 7 points to the
* cursor are highlighted with circles and lines connecting them to the cursor.
*
* Key features:
* - Generates 1000 random 2D points within the canvas.
* - Builds a KD-tree from the list of points for optimized spatial querying.
* - Visualizes the points and highlights the 7 nearest neighbors to the user's cursor position dynamically.
* - Highlights include red-colored circles around the nearest points and red lines connecting them to the cursor.
*/
fun main() = application {
configure {
width = 720
height = 720
}
program {
val points = MutableList(1000) {
Vector2(Math.random() * width, Math.random() * height)
}
val tree = points.kdTree()
extend {
drawer.circles(points, 5.0)
val kNearest = tree.findKNearest(mouse.position, k = 7)
drawer.fill = ColorRGBa.RED
drawer.stroke = ColorRGBa.RED
drawer.strokeWeight = 2.0
drawer.circles(kNearest, 7.0)
drawer.lineSegments(kNearest.map { LineSegment(mouse.position, it) })
}
}
}