From ed64b464c8f07b8d0469264000d20c3da01d2eeb Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sun, 6 Jul 2025 03:21:18 +0100 Subject: [PATCH] progress with refactoring --- temp-squares/fcore/ndc.sml | 33 ++++++++++++++++++++++++++++++++ temp-squares/fcore/quad-tree.sml | 26 +++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/temp-squares/fcore/ndc.sml b/temp-squares/fcore/ndc.sml index 79926cd..ec1a180 100644 --- a/temp-squares/fcore/ndc.sml +++ b/temp-squares/fcore/ndc.sml @@ -1,6 +1,7 @@ structure Ndc = struct (* ndc = normalised device coordinates *) + fun ltrbToVertex (left, top, right, bottom) = #[ left, bottom , right, bottom @@ -20,4 +21,36 @@ struct , right, bottom, r, g, b , right, top, r, g, b ] + + fun fromPixelX (xpos, windowWidth, windowHeight) = + let + val halfWidth = (Real32.fromInt windowWidth) / 2.0 + val xpos = xpos - halfWidth + in + if windowWidth > windowHeight then + let + val difference = windowWidth - windowHeight + val offset = Real32.fromInt (difference div 2) + in + xpos / (halfWidth - offset) + end + else + xpos / halfWidth + end + + fun fromPixelY (ypos, windowWidth, windowHeight) = + let + val halfHeight = (Real32.fromInt windowHeight) / 2.0 + val ypos = ~(ypos - halfHeight) + in + if windowHeight > windowWidth then + let + val difference = windowHeight - windowWidth + val offset = Real32.fromInt (difference div 2) + in + ypos / (halfHeight - offset) + end + else + ypos / halfHeight + end end diff --git a/temp-squares/fcore/quad-tree.sml b/temp-squares/fcore/quad-tree.sml index 148eec4..2b7e2af 100644 --- a/temp-squares/fcore/quad-tree.sml +++ b/temp-squares/fcore/quad-tree.sml @@ -225,8 +225,15 @@ struct foldWithDuplicates (f, br, acc) end - fun insertItemIntoTree (item, acc) = - BinTree.insert (item, acc) + fun insertItemIntoTree ignoreData (item, acc) = + if #data item = 0 then + (* ignore specific data by not inserting it into tree. + * May later functorise this quad tree, + * and allow different types of data + * to be ignored/stored in #data field. *) + acc + else + BinTree.insert (item, acc) fun toList qtree = let @@ -234,4 +241,19 @@ struct in BinTree.toList (tree, []) end + + fun toTriangles (windowWidth, windowHeight, squares, acc) = + case squares of + {x, y, ex, ey, data = _} :: tl => + let + val startX = Ndc.fromPixelX (x, windowWidth, windowHeight) + val endX = Ndc.fromPixelX (ex, windowWidth, windowHeight) + val startY = Ndc.fromPixelY (y, windowWidth, windowHeight) + val endY = Ndc.fromPixelY (ey, windowWidth, windowHeight) + + val acc = Ndc.ltrbToVertex (startX, startY, endX, endY) :: acc + in + toTriangles (windowWidth, windowHeight, tl, acc) + end + | [] => Vector.concat acc end