[F] Fix slither kt

This commit is contained in:
2024-12-16 05:15:30 -05:00
parent bb7dd271c5
commit 29dea779b5
+17 -13
View File
@@ -6,37 +6,38 @@ import javax.imageio.ImageIO
fun main() { fun main() {
// Read image // Read image
val image = ImageIO.read(File("slither-cat.png")) val image = ImageIO.read(File("slither-cat.png"))
val grid = 40 to 40 val grid = 41 to 41
println("Image size: ${image.width}x${image.height}") println("Image size: ${image.width}x${image.height}")
// Compute the pixel size of each grid // Compute the pixel size of each grid
val pixelSize = image.width / grid.first to image.height / grid.second val pixelSize = image.width.toDouble() / (grid.first - 1) to image.height.toDouble() / (grid.second - 1)
println("Pixel size: ${pixelSize.first}x${pixelSize.second}") println("Pixel size: ${pixelSize.first}x${pixelSize.second}")
fun center(p1: Pair<Int, Int>, p2: Pair<Int, Int>) = Pair((p1.first + p2.first) / 2, (p1.second + p2.second) / 2)
// Function to parse and return lines adjacent to a grid cell // Function to parse and return lines adjacent to a grid cell
fun checkLines(cell: Pair<Int, Int>): List<Pair<Pair<Int, Int>, Pair<Int, Int>>> { fun checkLines(cell: Pair<Int, Int>): List<Pair<Pair<Int, Int>, Pair<Int, Int>>> {
val (sxc, syc) = cell val (sxc, syc) = cell
val (exc, eyc) = sxc + 1 to syc + 1
// Start and end pixel of the cell // Start and end pixel of the cell
val (sxp, syp) = sxc * pixelSize.first to syc * pixelSize.second val (sxp, syp) = sxc * pixelSize.first to syc * pixelSize.second
val (exp, eyp) = exc * pixelSize.first to eyc * pixelSize.second
// Get the edges. The edges are the center between two points // Get the edges. The edges are the center between two points
val edges = mapOf( val edges = mapOf(
(sxc to syc) to center(sxp to syp, exp to syp), (sxc to syc + 1) to (sxp.toInt() to (syp + pixelSize.second / 2).toInt()),
(exc to syc) to center(exp to syp, exp to eyp), (sxc + 1 to syc) to ((sxp + pixelSize.first / 2).toInt() to syp.toInt()),
(sxc to eyc) to center(sxp to eyp, exp to eyp),
(exc to eyc) to center(sxp to eyp, exp to eyp),
) )
// Return edges that are colored black (grayness < 16) // Return edges that are colored black (grayness < 16)
return edges.filter { (_, p) -> return edges.filter { (_, p) ->
val (x, y) = p val (rx, ry) = p
val rgb = image.getRGB(x, y).toUInt().toULong() if (rx >= image.width + 5 || ry >= image.height + 5) return@filter false
val (x, y) = rx.coerceIn(0, image.width - 1) to ry.coerceIn(0, image.height - 1)
val rgb = image.getRGB(x, y).toULong()
val grayness: ULong = (rgb and 0xFFu) + ((rgb shr 8) and 0xFFu) + ((rgb shr 16) and 0xFFu) val grayness: ULong = (rgb and 0xFFu) + ((rgb shr 8) and 0xFFu) + ((rgb shr 16) and 0xFFu)
// Debug : Draw a red point on the image
if (grayness < 16u)
image.setRGB(x, y, 0xFFFF0000.toInt())
grayness < 16u grayness < 16u
}.map { (p, _) -> p }.map { p -> cell to p } }.map { (p, _) -> p }.map { p -> cell to p }
} }
@@ -49,5 +50,8 @@ fun main() {
}.flatten() }.flatten()
// Print the lines // Print the lines
lines.forEach { (p1, p2) -> println("{a: [${p1.first}, ${p1.second}], b: [${p2.first}, ${p2.second}]},") } lines.forEach { (p1, p2) -> println("[${p1.first}, ${p1.second}, ${p2.first}, ${p2.second}],") }
// Debug: Save the image
ImageIO.write(image, "png", File("slither-cat-out.png"))
} }