From 2098a4eda71d4e5b0c92de11ed7fb237d9d75621 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Fri, 20 Sep 2024 21:33:35 +0100 Subject: [PATCH] add 'numClickPoints' field to app type, and add parameter with same name to ClickPoints.generate function --- dotscape | Bin 1049264 -> 1049312 bytes functional-core/app/app-init.sml | 45 ++++++++++++++++++++++----- functional-core/app/app-type.sml | 3 +- functional-core/app/app-with.sml | 24 ++++++++++++-- functional-core/app/click-points.sml | 9 +++--- imperative-shell/constants.sml | 1 + imperative-shell/shell.sml | 8 +++-- 7 files changed, 72 insertions(+), 18 deletions(-) diff --git a/dotscape b/dotscape index 19c91ad965b5f74516b93aaca1b6b3e8a02b579a..2fb74ea93edf49cd152f8c2c5bc446830933b015 100755 GIT binary patch delta 31360 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 delta 31268 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�J0eUQa*#T07qB+2;9SMc*b}Z~mx* zqFhG$Ez-c`>&?F+?Sixp=?J84Ix5OEq(-Dmk#1CwTkOrn)Z+;1> z9qD$YDXG_+zeBnYX(Q58NCP{;W29YgPUxf*DG7M!g@Qpyhag>w)Qa>+q_dDVB3*@4 z?Qp&MQ=~Sezakwm^7{YR)!B!%dBk!2xyQssJ?}}TqS?|l)l4H(qg$Z5*%z5Zx3*MQ z$Lz4If}^v@Y)6@9*jYiS1OJ%J?G)OnOt9U=8e=^j!gL6mC~M1P7P>M)#W>uH)EP%* z+4s~y_T-<>^L&5zd%1g(XfF5Uf*Dyz43>Z!U=_Fp)`N!E1Ho3%1a^ZI90u*+9OwZ3 zS&gU=2Z~Ek++aLd20FniFdwW3OTcdM0yqjbgZIG>&=2;5@uvd8SH@5pdAP0U@uq$4ue;~DX<-!18;y!-~{*=I0tTne$Z5gp#^QAIR_mA z9iSV`1&@l@7WyDH(VvMo_yTtJI{hN%yi|IX=}hCiQhMD*iyED2 z30ghxff?(yZ+mGP?n8PgfqhqoXj;PX_GU0N@gQq!HeslE!4Qo*G^aE5!?dK+CZKIV zE8gp#{4_oX&B@z_Xd)@+H;3qcQo*N(=yRk6zs-!ZcAns)MOaaJ#z#{~2XFErSxZVF z82V>Q*0C0ax}nj%z*1A9@ygM)i-&fW-$Mwjv03)f{h5VfEo3Lz=F^9=Ga4$k+I>St|vo>6U@WFtzQ;-|FjjzkB@o)*hP!%|#I_&~91GLci$?BS=#tTL; zaNEiM577_PhEAJ+ws!UM2o;w{Vi!+fNqnV&9VE4Kid766*cqF6=>V%G{BAOf7Zb^B zA(be&pNS<}mBHOP;Lub350s%Qv5JG=gPAn&)mPa(mLN^O#_I4y0&rW~F;+~d=sd<& zPT|?w)W!OUQ>1sZwksq0qY;{~{O}`1c@m>R`GFN=^Yfk+3}Xei_~E-CR{gSsR#E*M z3*Z|)QMtxW5;7{hzq7sw@btRuYOBb5B)k5unEaawBXJAQV-{42LwNpWCk==*t!lMK zk}L8|+7XrHa!<52Pks@lF AppType.app_type + val fromWindowWidthAndHeight: int * int * int -> AppType.app_type end structure AppInit :> APP_INIT = @@ -8,15 +8,23 @@ struct open AppType fun helpFromWidthAndHeight - (windowWidth, windowHeight, wStart, wFinish, hStart, hFinish) : app_type = + ( windowWidth + , windowHeight + , wStart + , wFinish + , hStart + , hFinish + , numClickPoints + ) : app_type = let - val xClickPoints = ClickPoints.generate (wStart, wFinish) - val yClickPoints = ClickPoints.generate (hStart, hFinish) + val xClickPoints = ClickPoints.generate (wStart, wFinish, numClickPoints) + val yClickPoints = ClickPoints.generate (hStart, hFinish, numClickPoints) in { triangles = [] , triangleStage = NO_TRIANGLE , windowWidth = windowWidth , windowHeight = windowHeight + , numClickPoints = numClickPoints , xClickPoints = xClickPoints , yClickPoints = yClickPoints , undo = [] @@ -29,10 +37,17 @@ struct } end - fun fromWindowWidthAndHeight (windowWidth, windowHeight) = + fun fromWindowWidthAndHeight (windowWidth, windowHeight, numClickPoints) = if windowWidth = windowHeight then helpFromWidthAndHeight - (windowWidth, windowHeight, 0, windowWidth, 0, windowHeight) + ( windowWidth + , windowHeight + , 0 + , windowWidth + , 0 + , windowHeight + , numClickPoints + ) else if windowWidth > windowHeight then let val difference = windowWidth - windowHeight @@ -40,7 +55,14 @@ struct val wFinish = wStart + windowHeight in helpFromWidthAndHeight - (windowWidth, windowHeight, wStart, wFinish, 0, windowHeight) + ( windowWidth + , windowHeight + , wStart + , wFinish + , 0 + , windowHeight + , numClickPoints + ) end else let @@ -49,6 +71,13 @@ struct val hFinish = hStart + windowWidth in helpFromWidthAndHeight - (windowWidth, windowHeight, 0, windowWidth, hStart, hFinish) + ( windowWidth + , windowHeight + , 0 + , windowWidth + , hStart + , hFinish + , numClickPoints + ) end end diff --git a/functional-core/app/app-type.sml b/functional-core/app/app-type.sml index 50150ba..f6044bb 100644 --- a/functional-core/app/app-type.sml +++ b/functional-core/app/app-type.sml @@ -15,12 +15,12 @@ sig , y3: Real32.real } - type app_type = { triangles: triangle list , triangleStage: triangle_stage , windowWidth: int , windowHeight: int + , numClickPoints: int , xClickPoints: Real32.real vector , yClickPoints: Real32.real vector , undo: (Real32.real * Real32.real) list @@ -63,6 +63,7 @@ struct , triangleStage: triangle_stage , windowWidth: int , windowHeight: int + , numClickPoints: int , xClickPoints: Real32.real vector , yClickPoints: Real32.real vector , undo: (Real32.real * Real32.real) list diff --git a/functional-core/app/app-with.sml b/functional-core/app/app-with.sml index a2c75dc..e2e6ab8 100644 --- a/functional-core/app/app-with.sml +++ b/functional-core/app/app-with.sml @@ -65,6 +65,7 @@ struct val { triangleStage = _ , triangles + , numClickPoints , xClickPoints , yClickPoints , windowWidth @@ -84,6 +85,7 @@ struct , undo = newUndo , redo = [] , triangles = triangles + , numClickPoints = numClickPoints , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth @@ -103,6 +105,7 @@ struct val { triangles , triangleStage = _ + , numClickPoints , xClickPoints , yClickPoints , windowWidth @@ -124,6 +127,7 @@ struct , triangles = newTriangles , undo = newUndo , redo = [] + , numClickPoints = numClickPoints , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth @@ -141,6 +145,7 @@ struct val { xClickPoints , yClickPoints + , numClickPoints , windowWidth , windowHeight , triangles @@ -156,6 +161,7 @@ struct in { xClickPoints = xClickPoints , yClickPoints = yClickPoints + , numClickPoints = numClickPoints , triangles = triangles , triangleStage = triangleStage , windowWidth = windowWidth @@ -175,6 +181,7 @@ struct val { xClickPoints , yClickPoints + , numClickPoints , windowWidth , windowHeight , triangles @@ -190,6 +197,7 @@ struct in { xClickPoints = xClickPoints , yClickPoints = yClickPoints + , numClickPoints = numClickPoints , triangles = triangles , triangleStage = triangleStage , windowWidth = windowWidth @@ -211,6 +219,7 @@ struct val { xClickPoints = _ , yClickPoints = _ + , numClickPoints , windowWidth = _ , windowHeight = _ , triangles @@ -224,11 +233,12 @@ struct , arrowY } = app - val xClickPoints = ClickPoints.generate (wStart, wFinish) - val yClickPoints = ClickPoints.generate (hStart, hFinish) + val xClickPoints = ClickPoints.generate (wStart, wFinish, numClickPoints) + val yClickPoints = ClickPoints.generate (hStart, hFinish, numClickPoints) in { xClickPoints = xClickPoints , yClickPoints = yClickPoints + , numClickPoints = numClickPoints , triangles = triangles , triangleStage = triangleStage , windowWidth = windowWidth @@ -273,6 +283,7 @@ struct , mouseY = _ , triangles , triangleStage + , numClickPoints , xClickPoints , yClickPoints , windowWidth @@ -288,6 +299,7 @@ struct , mouseY = mouseY , triangles = triangles , triangleStage = triangleStage + , numClickPoints = numClickPoints , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth @@ -306,6 +318,7 @@ struct val { triangleStage = _ , triangles = _ + , numClickPoints , xClickPoints , yClickPoints , windowWidth @@ -330,6 +343,7 @@ struct , triangles = newTriangles , undo = newUndo , redo = newRedo + , numClickPoints = numClickPoints , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth @@ -348,6 +362,7 @@ struct val { triangleStage = _ , triangles = _ + , numClickPoints , xClickPoints , yClickPoints , windowWidth @@ -371,6 +386,7 @@ struct , triangles = newTriangles , undo = newUndo , redo = newRedo + , numClickPoints = numClickPoints , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth @@ -388,6 +404,7 @@ struct val { triangleStage , triangles + , numClickPoints , xClickPoints , yClickPoints , windowWidth @@ -406,6 +423,7 @@ struct , triangles = triangles , undo = undo , redo = redo + , numClickPoints = numClickPoints , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth @@ -422,6 +440,7 @@ struct val { xClickPoints , yClickPoints + , numClickPoints , windowWidth , windowHeight , undo @@ -442,6 +461,7 @@ struct , undo = [] , redo = [] , showGraph = showGraph + , numClickPoints = numClickPoints , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth diff --git a/functional-core/app/click-points.sml b/functional-core/app/click-points.sml index dd77aa7..66428c9 100644 --- a/functional-core/app/click-points.sml +++ b/functional-core/app/click-points.sml @@ -1,6 +1,6 @@ signature CLICK_POINTS = sig - val generate: int * int -> Real32.real vector + val generate: int * int * int -> Real32.real vector val getClickPositionFromMouse: AppType.app_type -> (int * int) option val getDrawDot: Real32.real @@ -18,13 +18,14 @@ end structure ClickPoints :> CLICK_POINTS = struct - fun generate (start, finish) = + fun generate (start, finish, numPoints) = let val difference = finish - start - val increment = Real32.fromInt difference / 40.0 + val increment = Real32.fromInt difference / Real32.fromInt numPoints val start = Real32.fromInt start in - Vector.tabulate (41, fn idx => (Real32.fromInt idx * increment) + start) + Vector.tabulate (numPoints + 1, fn idx => + (Real32.fromInt idx * increment) + start) end (* diff --git a/imperative-shell/constants.sml b/imperative-shell/constants.sml index ea3626e..1c19805 100644 --- a/imperative-shell/constants.sml +++ b/imperative-shell/constants.sml @@ -2,6 +2,7 @@ structure Constants = struct val windowWidth = 1000 val windowHeight = 900 + val initialNumClickPoints = 26 val graphVertexShaderString = "#version 300 es\n\ diff --git a/imperative-shell/shell.sml b/imperative-shell/shell.sml index 07017cc..5920ac1 100644 --- a/imperative-shell/shell.sml +++ b/imperative-shell/shell.sml @@ -15,9 +15,11 @@ struct val _ = Glfw.makeContextCurrent window val _ = Gles3.loadGlad () - val initialModel = - AppInit.fromWindowWidthAndHeight - (Constants.windowWidth, Constants.windowHeight) + val initialModel = AppInit.fromWindowWidthAndHeight + ( Constants.windowWidth + , Constants.windowHeight + , Constants.initialNumClickPoints + ) val graphLines = GraphLines.generate initialModel val graphDrawObject = AppDraw.initGraphLines ()