I would like to create an interactive grid, whereby one number from a grid is selected by the cursor ("3" in the example below), and all other numbers in the grid are highlighted that are related to the chosen number, and each successive number after that. In the example below, "3" is the selected number, and the highlighted numbers are double the previous one.
I am not sure whether a loop, or a direct function (in this case, clearly multiplying by powers of 2) would be the best approach - I assume the function-apply approach would be the quickest for large grids.
Below is an example:
generated with:
m = 10;(*size of the grid*)
premade = Transpose@Partition[Range@100, m];
col[n_] := Table[{n - 0.5, i - 0.5}, {i, 1, m}]
Graphics[{
{Red, Opacity[0.3], Rectangle[{0, 2}, {01, 3}]},
{Red, Opacity[0.3], Rectangle[{0, 5}, {01, 6}]},
{Red, Opacity[0.3], Rectangle[{1, 1}, {02, 2}]},
{Red, Opacity[0.3], Rectangle[{2, 3}, {03, 4}]},
{Red, Opacity[0.3], Rectangle[{4, 7}, {05, 8}]},
{Red, Opacity[0.3], Rectangle[{9, 5}, {10, 6}]},
Table[Text[Style[premade[[#, i]], Large, FontFamily -> "Times"],col[i][[#]]] &
/@ Range@m, {i, 1, m}]},
GridLines -> {Range@m, Range@m}, PlotRange -> {{0, m}, {0, m}},
Axes -> False, Frame -> True,
GridLinesStyle -> Directive[GrayLevel[0.8], Dashed]]
NOTE: All columns will be separate lists.
Answer
Here is what I would propose related to the use of Graphics
:
DynamicModule[{color = Red, m = 10, premade, col, posnum, posFriends,
unSortedPos, posMouse = {0, 0}, positionColor = {{0, 0}}},
(*Initialization code*)
premade = Transpose@Partition[Range@(m*m), m];
col[n_] := Table[{n - 0.5, i - 0.5}, {i, 1, m}];
EventHandler[
Graphics[
{
Dynamic@{Opacity@0.2, Red, Rectangle /@ positionColor},
Table[Text[Style[premade[[#, i]], Large, FontFamily -> "Times"],
col[i][[#]]] & /@ Range@m, {i, 1, m}]
},
GridLines -> {Range@m, Range@m}, PlotRange -> {{0, m}, {0, m}}, Axes -> False,
Frame -> True, GridLinesStyle -> Directive[GrayLevel[0.8], Dashed], ImageSize -> 350],
{"MouseDown" :> (posMouse = Floor[MousePosition["Graphics", Graphics], 1];
posFriends[premade, posnum@premade];)}],
Initialization :>
(
posFriends[list_, start_] :=
(unSortedPos = (# - {1, 1} & /@
Flatten[Position[list, #]&/@ Select[Table[start*2^(i-1), {i, 1, 10}], # <= m*m&], 1]);
positionColor = Reverse@unSortedPos[[#]] & /@ Range@Length@unSortedPos;
);
posnum[list_] := list[[Last@posMouse + 1, First@posMouse + 1]];
)
]
Comments
Post a Comment