From aca7acc23243a4feef3ca6ac3d0aa4a9d3d68c97 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Tue, 8 Jul 2025 00:42:46 +0100 Subject: [PATCH] done writing merge function --- dotscape | Bin 978656 -> 978656 bytes fcore/quad-tree.sml | 67 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/dotscape b/dotscape index 05f0f4e1b5ca990b8006ad7f1588739390118236..22c0ee3feb94bc88533aec40e5c5e6cd3dfe1f8c 100755 GIT binary patch delta 10235 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 delta 10272 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 diff --git a/fcore/quad-tree.sml b/fcore/quad-tree.sml index c7efdb9..df17a27 100644 --- a/fcore/quad-tree.sml +++ b/fcore/quad-tree.sml @@ -481,4 +481,71 @@ struct let val {x, ex, data, y = _, ey = _} = item in {y = newY, ey = newEy, x = x, ex = ex, data = data} end + + local + fun mergePass (qx, qy, size, tree, rootSize, rootTree) = + case tree of + EMPTY => (EMPTY, false) + | LEAF item => + let + val mergeDir = getMergeDir (rootSize, rootTree, item) + in + case mergeDir of + NO_MERGE => (LEAF item, false) + | VERTICAL {up, down} => + (LEAF (mergeVertical (item, up, down)), true) + | HORIZONTAL {left, right} => + (LEAF (mergeHorizontal (item, left, right)), true) + end + | NODE {tl, tr, bl, br} => + if size = 1 orelse size mod 2 = 0 then + let + val halfSize = size div 2 + + val (tl, didMergeTl) = mergePass + (qx, qy, halfSize, tl, rootSize, rootTree) + val (tr, didMergeTr) = mergePass + (qx + halfSize, qy, halfSize, tr, rootSize, rootTree) + val (bl, didMergeBl) = mergePass + (qx, qy + halfSize, halfSize, bl, rootSize, rootTree) + val (br, didMergeBr) = mergePass + (qx + halfSize, qy + halfSize, halfSize, br, rootSize, rootTree) + + val didMergeAny = + didMergeTl orelse didMergeTr orelse didMergeBl orelse didMergeBr + val node = NODE {tl = tl, tr = tr, bl = bl, br = br} + in + (node, didMergeAny) + end + else + let + val halfSizeBefore = size div 2 + val halfSizeAfter = (size + 1) div 2 + val qmx = qx + halfSizeBefore + val qmy = qy + halfSizeAfter + + val (tl, didMergeTl) = mergePass + (qx, qy, halfSizeAfter, tl, rootSize, rootTree) + val (tr, didMergeTr) = mergePass + (qmx, qy, halfSizeAfter, tr, rootSize, rootTree) + val (bl, didMergeBl) = mergePass + (qx, qmy, halfSizeAfter, bl, rootSize, rootTree) + val (br, didMergeBr) = mergePass + (qmx, qmy, halfSizeAfter, br, rootSize, rootTree) + + val didMergeAny = + didMergeTl orelse didMergeTr orelse didMergeBl orelse didMergeBr + val node = NODE {tl = tl, tr = tr, bl = bl, br = br} + in + (node, didMergeAny) + end + in + fun merge (rootSize, rootTree) = + let + val (newTree, didMerge) = mergePass + (0, 0, rootSize, rootTree, rootSize, rootTree) + in + if didMerge then merge (rootSize, newTree) else newTree + end + end end