[orx-triangulation] Add smoothScatter

This commit is contained in:
Edwin Jakobs
2022-10-28 08:52:36 +02:00
parent 0a77411406
commit 0a7b4b7add
8 changed files with 283 additions and 112 deletions

View File

@@ -14,28 +14,43 @@ class DelaunayTriangulation(val points: List<Vector2>) {
fun voronoiDiagram(bounds: Rectangle) = VoronoiDiagram(this, bounds)
fun neighbors(pointIndex: Int) : Sequence<Int> {
fun neighbors(pointIndex: Int): Sequence<Int> {
return delaunay.neighbors(pointIndex)
}
fun neighborPoints(pointIndex: Int) : List<Vector2> {
fun neighborPoints(pointIndex: Int): List<Vector2> {
return neighbors(pointIndex).map { points[it] }.toList()
}
fun triangles(): List<Triangle> {
fun triangleIndices(): List<IntArray> {
val list = mutableListOf<IntArray>()
for (i in delaunay.triangles.indices step 3) {
list.add(
intArrayOf(
delaunay.triangles[i],
delaunay.triangles[i + 1],
delaunay.triangles[i + 2]
)
)
}
return list
}
fun triangles(filterPredicate: (Int, Int, Int) -> Boolean = { _, _, _ -> true }): List<Triangle> {
val list = mutableListOf<Triangle>()
for (i in delaunay.triangles.indices step 3 ) {
for (i in delaunay.triangles.indices step 3) {
val t0 = delaunay.triangles[i]
val t1 = delaunay.triangles[i + 1]
val t2 = delaunay.triangles[i + 2]
val p1 = points[t0]
val p2 = points[t1]
val p3 = points[t2]
// originally they are defined *counterclockwise*
list.add(Triangle(p3, p2, p1))
if (filterPredicate(t2, t1, t0)) {
val p1 = points[t0]
val p2 = points[t1]
val p3 = points[t2]
list.add(Triangle(p3, p2, p1))
}
}
return list
}
@@ -61,11 +76,11 @@ class DelaunayTriangulation(val points: List<Vector2>) {
close()
}
fun nearest(query: Vector2) : Int = delaunay.find(query.x, query.y)
fun nearest(query: Vector2): Int = delaunay.find(query.x, query.y)
fun nearestPoint(query: Vector2) : Vector2 = points[nearest(query)]
fun nearestPoint(query: Vector2): Vector2 = points[nearest(query)]
}
fun List<Vector2>.delaunayTriangulation() : DelaunayTriangulation {
fun List<Vector2>.delaunayTriangulation(): DelaunayTriangulation {
return DelaunayTriangulation(this)
}