From 1fb6b43ac3b25e4f908fc6682b47088f00a6d4a2 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 12 Jul 2025 18:52:30 +0100 Subject: [PATCH] progress coding function to create an export string --- dotscape | Bin 1049192 -> 1049192 bytes fcore/quad-tree.sml | 298 +++++++++++++++++++++++++------------------- 2 files changed, 172 insertions(+), 126 deletions(-) diff --git a/dotscape b/dotscape index a7fc07a1e16830e6cfae4cb6c7e145465b96c4da..5feee0da5516bb1534e844fbde16c9803adbfa84 100755 GIT binary patch delta 11044 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 p%a#^p - NODE - { x = x - , y = y - , ex = ex - , ey = ey - , data = data - , left = LEAF - , right = LEAF - } - | NODE {x = ox, y = oy, ex = oex, ey = oey, data = oldData, left, right} => - let - val dir = - if x < ox then - LESS - else if x > ox then - GREATER - else - (if y < oy then - LESS - else if y > oy then - GREATER - else - (if ex < oex then - LESS - else if ex > oex then - GREATER - else - (if ey < oey then LESS - else if ey > oey then GREATER - else EQUAL))) - in - case dir of - LESS => - NODE - { left = insert (newItem, left) - , right = right - , x = ox - , y = oy - , ex = oex - , ey = oey - , data = oldData - } - | GREATER => - NODE - { right = insert (newItem, right) - , left = left - , x = ox - , y = oy - , ex = oex - , ey = oey - , data = oldData - } - | EQUAL => - NODE - { left = left - , right = right - , x = x - , y = y - , ex = ex - , ey = ey - , data = data - } - end - - fun foldr (f, tree, acc) = - case tree of - NODE {x, y, ex, ey, data, left, right} => - let - val acc = foldr (f, right, acc) - val item = {x = x, y = y, ex = ex, ey = ey, data = data} - val acc = f (item, acc) - in - foldr (f, left, acc) - end - | LEAF => acc - - fun toList tree = - foldr (fn (item, acc) => item :: acc, tree, []) -end - structure CollisionTree = struct + structure BinTree = + struct + datatype 'a bintree = + NODE of + { x: int + , y: int + , ex: int + , ey: int + , data: 'a + , left: 'a bintree + , right: 'a bintree + } + | LEAF + + val empty = LEAF + + fun insert (newItem as {x, y, ex, ey, data}, tree) = + case tree of + LEAF => + NODE + { x = x + , y = y + , ex = ex + , ey = ey + , data = data + , left = LEAF + , right = LEAF + } + | NODE {x = ox, y = oy, ex = oex, ey = oey, data = oldData, left, right} => + let + val dir = + if x < ox then + LESS + else if x > ox then + GREATER + else + (if y < oy then + LESS + else if y > oy then + GREATER + else + (if ex < oex then + LESS + else if ex > oex then + GREATER + else + (if ey < oey then LESS + else if ey > oey then GREATER + else EQUAL))) + in + case dir of + LESS => + NODE + { left = insert (newItem, left) + , right = right + , x = ox + , y = oy + , ex = oex + , ey = oey + , data = oldData + } + | GREATER => + NODE + { right = insert (newItem, right) + , left = left + , x = ox + , y = oy + , ex = oex + , ey = oey + , data = oldData + } + | EQUAL => + NODE + { left = left + , right = right + , x = x + , y = y + , ex = ex + , ey = ey + , data = data + } + end + + fun foldr (f, tree, acc) = + case tree of + NODE {x, y, ex, ey, data, left, right} => + let + val acc = foldr (f, right, acc) + val item = {x = x, y = y, ex = ex, ey = ey, data = data} + val acc = f (item, acc) + in + foldr (f, left, acc) + end + | LEAF => acc + + fun toList tree = + foldr (fn (item, acc) => item :: acc, tree, []) + end + fun shouldIgnoreData {a, r = _, g = _, b = _} = a = 0 local @@ -457,33 +457,6 @@ struct toBintree tree end - fun toTrianglesMerged - ( windowWidth - , windowHeight - , squares - , size - , canvasWidth - , canvasHeight - , xClickPoints - , yClickPoints - ) = - let - val qtree = buildTree (0, 0, size, squares) - val bintree = merge (qtree, squares) - - val f = folder - ( windowWidth - , windowHeight - , canvasWidth - , canvasHeight - , xClickPoints - , yClickPoints - ) - val vec = BinTree.foldr (f, bintree, []) - in - Vector.concat vec - end - fun toStringFolder ({x, ex, y, ey, data = {r, g, b, a}}, acc) = let val item = String.concat @@ -524,4 +497,77 @@ struct in String.concat acc end + + fun intToRealString num = + let + val result = Real32.fromInt num + val result = Real32.toString result + in + if String.isSubstring "." result then result else result ^ ".0" + end + + fun colToRealString col = + let + val result = Real32.fromInt col / 255.0 + val result = Real32.toString result + in + if String.isSubstring "." result then result else result ^ ".0" + end + + fun toExportStringFolder ({x, ex, y, ey, data = {r, g, b, a}}, acc) = + let + val x = intToRealString x + val y = intToRealString y + val ex = intToRealString ex + val ey = intToRealString ey + val r = colToRealString r + val g = colToRealString g + val b = colToRealString b + + val x = String.concat ["((", x, " - halfWidth) / halfWidth)"] + val y = String.concat ["(~(", y, " - halfHeight) / halfHeight)"] + + val ex = String.concat + [ "(((((" + , ex + , " - " + , x + , ") " + , "* scale) + " + , x + , ") - halfWidth) / halfWidth)" + ] + + val ey = String.concat + [ "(" + , "(" + , "(" + , "(" + , "(" + , ey + , " - " + , y + , ")" + , "* scale) + " + , y + , ") - halfHeight) / halfHeight)" + ] + in + x :: y :: ex :: ex :: y :: ey :: r :: g :: b :: acc + end + + fun toExportString (squares, canvasWidth, canvasHeight) = + let + val size = Int.max (canvasWidth, canvasHeight) + val qtree = buildTree (0, 0, size, squares) + val bintree = merge (qtree, squares) + + val coords = BinTree.foldr (toExportStringFolder, bintree, []) + val coords = String.concatWith "," coords + + val header = "" + val footer = "" + in + String.concat [header, coords, footer] + end end