## to protect against loss of information whilst constructing patterns ${{ var workIsDone = false; window.onbeforeunload = confirmBrowseAway; function confirmBrowseAway() { if (!workIsDone) { return "Reloading this page will discard the current script."; } }; }}$; ## This is a JS-EDEN script automatically generated using the environment's script generator feature. ## JS-EDEN is an open source empirical modelling environment based on research, principles and work ## conducted at University of Warwick. ## Web site: https://github.com/EMGroup/js-eden ## Firstly, turn off automatic calculation until the construal is fully loaded. autocalc = 0; ## Include Files: ## Observable Assignments: _menubar_status = "Output: [{150, 10}, {150, 110}, {150, 210}, {150, 310}, {250, 310}, {350, 310}, {350, 210}, {450, 210}, {450, 310}, {550, 310}]"; randomSeed = @; startPos = {100, 60}; scaleHeight = 100; scaleWidth = 100; mirrorGrid = [[-1, 1, -1, 0], [1, 1, -1, 0], [-1, 1, 0, 0], [1, 0, 0, 0]]; inl1_toggle = 0; inl2_toggle = 0; inl3_toggle = 0; inl4_toggle = 0; inu1_toggle = 0; inu2_toggle = 0; inu3_toggle = 1; inu4_toggle = 0; inu1_clicked = @; inu2_clicked = @; inu3_clicked = false; inu4_clicked = @; inl1_clicked = false; inl2_clicked = @; inl3_clicked = @; inl4_clicked = @; h = ""; inr = 5; inc = 1; ic = 3; ir = 0; dir = "S"; newrcurr = 0; newccurr = 3; outdircurr = "S"; inr1_toggle = 0; inr2_toggle = 0; inr3_toggle = 0; inr4_toggle = 0; ind1_toggle = 1; ind2_toggle = 0; ind3_toggle = 1; ind4_toggle = 0; ind1_clicked = false; ind2_clicked = false; ind3_clicked = false; ind4_clicked = @; inr1_clicked = false; inr2_clicked = @; inr3_clicked = @; inr4_clicked = @; rix = 1; cix = 2; rayN11col = "red"; rayN12col = "red"; rayN13col = "red"; rayN14col = "red"; rayW11col = "green"; rayW21col = "green"; rayW31col = "green"; rayW41col = "green"; rayE14col = "black"; rayE24col = "black"; rayE34col = "black"; rayE44col = "black"; rayS41col = "orange"; rayS42col = "orange"; rayS43col = "orange"; rayS44col = "orange"; onE23 = @; reset_clicked = false; gridVisible = true; subsetrays = @; cell11 = @; cell12 = @; cell13 = @; cell14 = @; cell21 = @; cell22 = @; cell23 = @; cell24 = @; cell31 = @; cell32 = @; cell33 = @; cell34 = @; cell41 = @; cell42 = @; cell43 = @; cell44 = @; mirrorcol = "blue"; near = 1000; ## Observable Definitions: cell11_clicked is mousePressed && ((visraypt(1,1)[1] - mousePosition.x) * (visraypt(1,1)[1] - mousePosition.x) + (visraypt(1,1)[2] - mousePosition.y) * (visraypt(1,1)[2] - mousePosition.y) < near); cell21_clicked is mousePressed && ((visraypt(2,1)[1] - mousePosition.x) * (visraypt(2,1)[1] - mousePosition.x) + (visraypt(2,1)[2] - mousePosition.y) * (visraypt(2,1)[2] - mousePosition.y) < near); cell31_clicked is mousePressed && ((visraypt(3,1)[1] - mousePosition.x) * (visraypt(3,1)[1] - mousePosition.x) + (visraypt(3,1)[2] - mousePosition.y) * (visraypt(3,1)[2] - mousePosition.y) < near); cell41_clicked is mousePressed && ((visraypt(4,1)[1] - mousePosition.x) * (visraypt(4,1)[1] - mousePosition.x) + (visraypt(4,1)[2] - mousePosition.y) * (visraypt(4,1)[2] - mousePosition.y) < near); cell12_clicked is mousePressed && ((visraypt(1,2)[1] - mousePosition.x) * (visraypt(1,2)[1] - mousePosition.x) + (visraypt(1,2)[2] - mousePosition.y) * (visraypt(1,2)[2] - mousePosition.y) < near); cell22_clicked is mousePressed && ((visraypt(2,2)[1] - mousePosition.x) * (visraypt(2,2)[1] - mousePosition.x) + (visraypt(2,2)[2] - mousePosition.y) * (visraypt(2,2)[2] - mousePosition.y) < near); cell32_clicked is mousePressed && ((visraypt(3,2)[1] - mousePosition.x) * (visraypt(3,2)[1] - mousePosition.x) + (visraypt(3,2)[2] - mousePosition.y) * (visraypt(3,2)[2] - mousePosition.y) < near); cell42_clicked is mousePressed && ((visraypt(4,2)[1] - mousePosition.x) * (visraypt(4,2)[1] - mousePosition.x) + (visraypt(4,2)[2] - mousePosition.y) * (visraypt(4,2)[2] - mousePosition.y) < near); cell13_clicked is mousePressed && ((visraypt(1,3)[1] - mousePosition.x) * (visraypt(1,3)[1] - mousePosition.x) + (visraypt(1,3)[2] - mousePosition.y) * (visraypt(1,3)[2] - mousePosition.y) < near); cell23_clicked is mousePressed && ((visraypt(2,3)[1] - mousePosition.x) * (visraypt(2,3)[1] - mousePosition.x) + (visraypt(2,3)[2] - mousePosition.y) * (visraypt(2,3)[2] - mousePosition.y) < near); cell33_clicked is mousePressed && ((visraypt(3,3)[1] - mousePosition.x) * (visraypt(3,3)[1] - mousePosition.x) + (visraypt(3,3)[2] - mousePosition.y) * (visraypt(3,3)[2] - mousePosition.y) < near); cell43_clicked is mousePressed && ((visraypt(4,3)[1] - mousePosition.x) * (visraypt(4,3)[1] - mousePosition.x) + (visraypt(4,3)[2] - mousePosition.y) * (visraypt(4,3)[2] - mousePosition.y) < near); cell14_clicked is mousePressed && ((visraypt(1,4)[1] - mousePosition.x) * (visraypt(1,4)[1] - mousePosition.x) + (visraypt(1,4)[2] - mousePosition.y) * (visraypt(1,4)[2] - mousePosition.y) < near); cell24_clicked is mousePressed && ((visraypt(2,4)[1] - mousePosition.x) * (visraypt(2,4)[1] - mousePosition.x) + (visraypt(2,4)[2] - mousePosition.y) * (visraypt(2,4)[2] - mousePosition.y) < near); cell34_clicked is mousePressed && ((visraypt(3,4)[1] - mousePosition.x) * (visraypt(3,4)[1] - mousePosition.x) + (visraypt(3,4)[2] - mousePosition.y) * (visraypt(3,4)[2] - mousePosition.y) < near); cell44_clicked is mousePressed && ((visraypt(4,4)[1] - mousePosition.x) * (visraypt(4,4)[1] - mousePosition.x) + (visraypt(4,4)[2] - mousePosition.y) * (visraypt(4,4)[2] - mousePosition.y) < near); board is Rectangle(startPos.x,startPos.y,4*scaleWidth,4*scaleHeight,"black"); inl1 is Button("inl1","InL1",startPos.x - 90, startPos.y + 50,true); inl2 is Button("inl2","InL2",startPos.x - 90, startPos.y + 150,true); inl3 is Button("inl3","InL3",startPos.x - 90, startPos.y + 250,true); inl4 is Button("inl4","InL4",startPos.x - 90, startPos.y + 350,true); inu1 is Button("inu1","InU1",startPos.x + 50, startPos.y + 450,true); inu2 is Button("inu2","InU2",startPos.x + 150, startPos.y + 450,true); inu3 is Button("inu3","InU3",startPos.x + 250, startPos.y + 450,true); inu4 is Button("inu4","InU4",startPos.x + 350, startPos.y + 450,true); inputslu is [inl1_toggle, inl2_toggle, inl3_toggle, inl4_toggle, inu1_toggle, inu2_toggle, inu3_toggle, inu4_toggle]; inputsrd is [inr1_toggle, inr2_toggle, inr3_toggle, inr4_toggle, ind1_toggle, ind2_toggle, ind3_toggle, ind4_toggle]; inputs is inputslu // inputsrd; inputsAndMirrors is [inputs, mirrorGrid]; ixmirrors is [[mirrorGrid[1][1],mirrorGrid[2][1],mirrorGrid[3][1],mirrorGrid[4][1]],[mirrorGrid[1][2],mirrorGrid[2][2],mirrorGrid[3][2],mirrorGrid[4][2]],[mirrorGrid[1][3],mirrorGrid[2][3],mirrorGrid[3][3],mirrorGrid[4][3]],[mirrorGrid[1][4],mirrorGrid[2][4],mirrorGrid[3][4],mirrorGrid[4][4]]]; mirrors is mkmirrors(ixmirrors); mirror is mirrors[ic][ir]; outdir is nextdir(mirror)[indexdir(dir)]; newr is ir + incrc(outdir)[2]; newc is ic + incrc(outdir)[1]; newmirror is mirrors[newc][newr]; initdir is (inr==0) ? "W" : ((inr==5) ? "E": ((inc==0) ? "N" : ((inc==5) ? "S" : @))); ray11N is makeray(1,1,"N",mirrors); ray12N is makeray(1,2,"N",mirrors); ray13N is makeray(1,3,"N",mirrors); ray14N is makeray(1,4,"N",mirrors); ray11W is makeray(1,1,"W",mirrors); ray21W is makeray(2,1,"W",mirrors); ray31W is makeray(3,1,"W",mirrors); ray41W is makeray(4,1,"W",mirrors); ray41S is makeray(4,1,"S",mirrors); ray42S is makeray(4,2,"S",mirrors); ray43S is makeray(4,3,"S",mirrors); ray44S is makeray(4,4,"S",mirrors); ray44E is makeray(4,4,"E",mirrors); ray34E is makeray(3,4,"E",mirrors); ray24E is makeray(2,4,"E",mirrors); ray14E is makeray(1,4,"E",mirrors); alltherays is [ray11N, ray12N, ray13N, ray14N, ray11W, ray21W, ray31W, ray41W, ray41S, ray42S, ray43S, ray44S, ray14E, ray24E, ray34E, ray44E]; raysselected is [ind1_toggle, ind2_toggle, ind3_toggle, ind4_toggle, inl1_toggle,inl2_toggle,inl3_toggle,inl4_toggle,inu1_toggle,inu2_toggle,inu3_toggle,inu4_toggle, inr1_toggle, inr2_toggle, inr3_toggle, inr4_toggle]; rays is subsetrays(alltherays, raysselected); inr1 is Button("inr1","InR1",startPos.x +450, startPos.y + 50,true); inr2 is Button("inr2","InR2",startPos.x +450, startPos.y + 150,true); inr3 is Button("inr3","InR3",startPos.x + 450, startPos.y + 250,true); inr4 is Button("inr4","InR4",startPos.x + 450, startPos.y + 350,true); ind1 is Button("ind1","InD1",startPos.x + 50, startPos.y - 50,true); ind2 is Button("ind2","InD2",startPos.x + 150, startPos.y - 50,true); ind3 is Button("ind3","InD3",startPos.x + 250, startPos.y - 50,true); ind4 is Button("ind4","InD4",startPos.x + 350, startPos.y - 50,true); testPt is Circle(visraypt(rix,cix)[1], visraypt(rix,cix)[2], 10); testLS is LineSequence(rayloctovis(ray11N), "blue"); onRadius = 4; onN11col is (ind1_toggle==1) ? rayN11col : "white"; onN11 is Circle(visraypt(0,1)[1], visraypt(0,1)[2], onRadius, onN11col, onN11col); onN12col is (ind2_toggle==1) ? rayN12col : "white"; onN12 is Circle(visraypt(0,2)[1], visraypt(0,2)[2], onRadius, onN12col, onN12col); onN13col is (ind3_toggle==1) ? rayN13col : "white"; onN13 is Circle(visraypt(0,3)[1], visraypt(0,3)[2], onRadius, onN13col, onN13col); onN14col is (ind4_toggle==1) ? rayN14col : "white"; onN14 is Circle(visraypt(0,4)[1], visraypt(0,4)[2], onRadius, onN14col, onN14col); onW11col is (inl1_toggle==1) ? rayW11col : "white"; onW11 is Circle(visraypt(1,0)[1], visraypt(1,0)[2], onRadius, onW11col, onW11col); onW21col is (inl2_toggle==1) ? rayW21col : "white"; onW21 is Circle(visraypt(2,0)[1], visraypt(2,0)[2], onRadius, onW21col, onW21col); onW31col is (inl3_toggle==1) ? rayW31col : "white"; onW31 is Circle(visraypt(3,0)[1], visraypt(3,0)[2], onRadius, onW31col, onW31col); onW41col is (inl4_toggle==1) ? rayW41col : "white"; onW41 is Circle(visraypt(4,0)[1], visraypt(4,0)[2], onRadius, onW41col, onW41col); onE14col is (inr1_toggle==1) ? rayE14col : "white"; onE14 is Circle(visraypt(1,5)[1], visraypt(1,4)[2], onRadius, onE14col, onE14col); onE24col is (inr2_toggle==1) ? rayE24col : "white"; onE24 is Circle(visraypt(2,5)[1], visraypt(2,4)[2], onRadius, onE24col, onE24col); onE34col is (inr3_toggle==1) ? rayE34col : "white"; onE34 is Circle(visraypt(3,5)[1], visraypt(3,4)[2], onRadius, onE34col, onE34col); onE44col is (inr4_toggle==1) ? rayE44col : "white"; onE44 is Circle(visraypt(4,5)[1], visraypt(4,4)[2], onRadius, onE44col, onE44col); onS41col is (inu1_toggle==1) ? rayS41col : "white"; onS41 is Circle(visraypt(5,1)[1], visraypt(5,1)[2], onRadius, onS41col, onS41col); onS42col is (inu2_toggle==1) ? rayS42col : "white"; onS42 is Circle(visraypt(5,2)[1], visraypt(5,2)[2], onRadius, onS42col, onS42col); onS43col is (inu3_toggle==1) ? rayS43col : "white"; onS43 is Circle(visraypt(5,3)[1], visraypt(5,3)[2], onRadius, onS43col, onS43col); onS44col is (inu4_toggle==1) ? rayS44col : "white"; onS44 is Circle(visraypt(5,4)[1], visraypt(5,4)[2], onRadius, onS44col, onS44col); resetButt is Button("reset", "RESET", 5, 5, true); ray11Nvis is LineSequence(rayloctovis(ray11N), onN11col); ray12Nvis is LineSequence(rayloctovis(ray12N), onN12col); ray13Nvis is LineSequence(rayloctovis(ray13N), onN13col); ray14Nvis is LineSequence(rayloctovis(ray14N), onN14col); ray11Wvis is LineSequence(rayloctovis(ray11W), onW11col); ray21Wvis is LineSequence(rayloctovis(ray21W), onW21col); ray31Wvis is LineSequence(rayloctovis(ray31W), onW31col); ray41Wvis is LineSequence(rayloctovis(ray41W), onW41col); ray14Evis is LineSequence(rayloctovis(ray14E), onE14col); ray24Evis is LineSequence(rayloctovis(ray24E), onE24col); ray34Evis is LineSequence(rayloctovis(ray34E), onE34col); ray44Evis is LineSequence(rayloctovis(ray44E), onE44col); ray41Svis is LineSequence(rayloctovis(ray41S), onS41col); ray42Svis is LineSequence(rayloctovis(ray42S), onS42col); ray43Svis is LineSequence(rayloctovis(ray43S), onS43col); ray44Svis is LineSequence(rayloctovis(ray44S), onS44col); LBcoverSize is (gridVisible) ? 0 : 4; LBcover is Rectangle(startPos.x,startPos.y,scaleWidth*LBcoverSize,scaleHeight*LBcoverSize, mirrorcol); mirrorvis is [mirror11, mirror21, mirror31, mirror41, mirror12, mirror22, mirror32, mirror42, mirror13, mirror23, mirror33, mirror43, mirror14, mirror24, mirror34, mirror44]; mirror11 is Line(visraypt(1,1)[1] - size11, visraypt(1,1)[2] + size11*mirrorGrid[1][1], visraypt(1,1)[1] + size11, visraypt(1,1)[2] - size11*mirrorGrid[1][1], mirrorcol); mirror21 is Line(visraypt(2,1)[1] - size21, visraypt(2,1)[2] + size21*mirrorGrid[2][1], visraypt(2,1)[1] + size21, visraypt(2,1)[2] - size21*mirrorGrid[2][1], mirrorcol); mirror31 is Line(visraypt(3,1)[1] - size31, visraypt(3,1)[2] + size31*mirrorGrid[3][1], visraypt(3,1)[1] + size31, visraypt(3,1)[2] - size31*mirrorGrid[3][1], mirrorcol); mirror41 is Line(visraypt(4,1)[1] - size41, visraypt(4,1)[2] + size41*mirrorGrid[4][1], visraypt(4,1)[1] + size41, visraypt(4,1)[2] - size41*mirrorGrid[4][1], mirrorcol); size11 is (mirrorGrid[1][1]==0) ? 0 : 50; size21 is (mirrorGrid[2][1]==0) ? 0 : 50; size31 is (mirrorGrid[3][1]==0) ? 0 : 50; size41 is (mirrorGrid[4][1]==0) ? 0 : 50; size12 is (mirrorGrid[1][2]==0) ? 0 : 50; mirror12 is Line(visraypt(1,2)[1] - size12, visraypt(1,2)[2] + size11*mirrorGrid[1][2], visraypt(1,2)[1] + size12, visraypt(1,2)[2] - size12*mirrorGrid[1][2], mirrorcol); size22 is (mirrorGrid[2][2]==0) ? 0 : 50; mirror22 is Line(visraypt(2,2)[1] - size22, visraypt(2,2)[2] + size22*mirrorGrid[2][2], visraypt(2,2)[1] + size22, visraypt(2,2)[2] - size22*mirrorGrid[2][2], mirrorcol); size32 is (mirrorGrid[3][2]==0) ? 0 : 50; mirror32 is Line(visraypt(3,2)[1] - size32, visraypt(3,2)[2] + size32*mirrorGrid[3][2], visraypt(3,2)[1] + size32, visraypt(3,2)[2] - size32*mirrorGrid[3][2], mirrorcol); size42 is (mirrorGrid[4][2]==0) ? 0 : 50; mirror42 is Line(visraypt(4,2)[1] - size42, visraypt(4,2)[2] + size42*mirrorGrid[4][2], visraypt(4,2)[1] + size42, visraypt(4,2)[2] - size42*mirrorGrid[4][2], mirrorcol); size13 is (mirrorGrid[1][3]==0) ? 0 : 50; mirror13 is Line(visraypt(1,3)[1] - size13, visraypt(1,3)[2] + size13*mirrorGrid[1][3], visraypt(1,3)[1] + size13, visraypt(1,3)[2] - size13*mirrorGrid[1][3], mirrorcol); size23 is (mirrorGrid[2][3]==0) ? 0 : 50; mirror23 is Line(visraypt(2,3)[1] - size23, visraypt(2,3)[2] + size23*mirrorGrid[2][3], visraypt(2,3)[1] + size23, visraypt(2,3)[2] - size23*mirrorGrid[2][3], mirrorcol); size33 is (mirrorGrid[3][3]==0) ? 0 : 50; mirror33 is Line(visraypt(3,3)[1] - size33, visraypt(3,3)[2] + size33*mirrorGrid[3][3], visraypt(3,3)[1] + size33, visraypt(3,3)[2] - size33*mirrorGrid[3][3], mirrorcol); size43 is (mirrorGrid[4][3]==0) ? 0 : 50; mirror43 is Line(visraypt(4,3)[1] - size43, visraypt(4,3)[2] + size43*mirrorGrid[4][3], visraypt(4,3)[1] + size43, visraypt(4,3)[2] - size43*mirrorGrid[4][3], mirrorcol); mirror14 is Line(visraypt(1,4)[1] - size14, visraypt(1,4)[2] + size14*mirrorGrid[1][4], visraypt(1,4)[1] + size14, visraypt(1,4)[2] - size14*mirrorGrid[1][4], mirrorcol); mirror24 is Line(visraypt(2,4)[1] - size24, visraypt(2,4)[2] + size24*mirrorGrid[2][4], visraypt(2,4)[1] + size24, visraypt(2,4)[2] - size24*mirrorGrid[2][4], mirrorcol); mirror34 is Line(visraypt(3,4)[1] - size34, visraypt(3,4)[2] + size34*mirrorGrid[3][4], visraypt(3,4)[1] + size34, visraypt(3,4)[2] - size34*mirrorGrid[3][4], mirrorcol); mirror44 is Line(visraypt(4,4)[1] - size44, visraypt(4,4)[2] + size44*mirrorGrid[4][4], visraypt(4,4)[1] + size44, visraypt(4,4)[2] - size44*mirrorGrid[4][4], mirrorcol); size14 is (mirrorGrid[1][4]==0) ? 0 : 50; size24 is (mirrorGrid[2][4]==0) ? 0 : 50; size34 is (mirrorGrid[3][4]==0) ? 0 : 50; size44 is (mirrorGrid[4][4]==0) ? 0 : 50; ## Action Definitions: proc inu1_click : inu1_clicked { if(inu1_clicked){ inu1_toggle = inu1_toggle != 1 ? 1 : 0; } } proc inu2_click : inu2_clicked { if(inu2_clicked){ inu2_toggle = inu2_toggle != 1 ? 1 : 0; } } proc inu3_click : inu3_clicked { if(inu3_clicked){ inu3_toggle = inu3_toggle != 1 ? 1 : 0; } } proc inu4_click : inu4_clicked { if(inu4_clicked){ inu4_toggle = inu4_toggle != 1 ? 1 : 0; } } proc inl1_click : inl1_clicked { if(inl1_clicked){ inl1_toggle = inl1_toggle != 1 ? 1 : 0; } } proc inl2_click : inl2_clicked { if(inl2_clicked){ inl2_toggle = inl2_toggle != 1 ? 1 : 0; } } proc inl3_click : inl3_clicked { if(inl3_clicked){ inl3_toggle = inl3_toggle != 1 ? 1 : 0; } } proc inl4_click : inl4_clicked { if(inl4_clicked){ inl4_toggle = inl4_toggle != 1 ? 1 : 0; } } proc cell11_click : cell11_clicked{ if(cell11_clicked){ mirrorGrid[1][1] = ((mirrorGrid[1][1] == 1) ? -1 : (mirrorGrid[1][1] == -1) ? 0 : 1); } } proc cell21_click : cell21_clicked{ if(cell21_clicked){ mirrorGrid[2][1] = ((mirrorGrid[2][1] == 1) ? -1 : (mirrorGrid[2][1] == -1) ? 0 : 1); } } proc cell31_click : cell31_clicked{ if(cell31_clicked){ mirrorGrid[3][1] = ((mirrorGrid[3][1] == 1) ? -1 : (mirrorGrid[3][1] == -1) ? 0 : 1); } } proc cell41_click : cell41_clicked{ if(cell41_clicked){ mirrorGrid[4][1] = ((mirrorGrid[4][1] == 1) ? -1 : (mirrorGrid[4][1] == -1) ? 0 : 1); } } proc cell12_click : cell12_clicked{ if(cell12_clicked){ mirrorGrid[1][2] = ((mirrorGrid[1][2] == 1) ? -1 : (mirrorGrid[1][2] == -1) ? 0 : 1); } } proc cell22_click : cell22_clicked{ if(cell22_clicked){ mirrorGrid[2][2] = ((mirrorGrid[2][2] == 1) ? -1 : (mirrorGrid[2][2] == -1) ? 0 : 1); } } proc cell32_click : cell32_clicked{ if(cell32_clicked){ mirrorGrid[3][2] = ((mirrorGrid[3][2] == 1) ? -1 : (mirrorGrid[3][2] == -1) ? 0 : 1); } } proc cell42_click : cell42_clicked{ if(cell42_clicked){ mirrorGrid[4][2] = ((mirrorGrid[4][2] == 1) ? -1 : (mirrorGrid[4][2] == -1) ? 0 : 1); } } proc cell13_click : cell13_clicked{ if(cell13_clicked){ mirrorGrid[1][3] = ((mirrorGrid[1][3] == 1) ? -1 : (mirrorGrid[1][3] == -1) ? 0 : 1); } } proc cell23_click : cell23_clicked{ if(cell23_clicked){ mirrorGrid[2][3] = ((mirrorGrid[2][3] == 1) ? -1 : (mirrorGrid[2][3] == -1) ? 0 : 1); } } proc cell33_click : cell33_clicked{ if(cell33_clicked){ mirrorGrid[3][3] = ((mirrorGrid[3][3] == 1) ? -1 : (mirrorGrid[3][3] == -1) ? 0 : 1); } } proc cell43_click : cell43_clicked{ if(cell43_clicked){ mirrorGrid[4][3] = ((mirrorGrid[4][3] == 1) ? -1 : (mirrorGrid[4][3] == -1) ? 0 : 1); } } proc cell14_click : cell14_clicked{ if(cell14_clicked){ mirrorGrid[1][4] = ((mirrorGrid[1][4] == 1) ? -1 : (mirrorGrid[1][4] == -1) ? 0 : 1); } } proc cell24_click : cell24_clicked{ if(cell24_clicked){ mirrorGrid[2][4] = ((mirrorGrid[2][4] == 1) ? -1 : (mirrorGrid[2][4] == -1) ? 0 : 1); } } proc cell34_click : cell34_clicked{ if(cell34_clicked){ mirrorGrid[3][4] = ((mirrorGrid[3][4] == 1) ? -1 : (mirrorGrid[3][4] == -1) ? 0 : 1); } } proc cell44_click : cell44_clicked{ if(cell44_clicked){ mirrorGrid[4][4] = ((mirrorGrid[4][4] == 1) ? -1 : (mirrorGrid[4][4] == -1) ? 0 : 1); } } proc ind1_click : ind1_clicked { if(ind1_clicked){ ind1_toggle = ind1_toggle != 1 ? 1 : 0; } } proc ind2_click : ind2_clicked { if(ind2_clicked){ ind2_toggle = ind2_toggle != 1 ? 1 : 0; } } proc ind3_click : ind3_clicked { if(ind3_clicked){ ind3_toggle = ind3_toggle != 1 ? 1 : 0; } } proc ind4_click : ind4_clicked { if(ind4_clicked){ ind4_toggle = ind4_toggle != 1 ? 1 : 0; } } proc inr1_click : inr1_clicked { if(inr1_clicked){ inr1_toggle = inr1_toggle != 1 ? 1 : 0; } } proc inr2_click : inr2_clicked { if(inr2_clicked){ inr2_toggle = inr2_toggle != 1 ? 1 : 0; } } proc inr3_click : inr3_clicked { if(inr3_clicked){ inr3_toggle = inr3_toggle != 1 ? 1 : 0; } } proc inr4_click : inr4_clicked { if(inr4_clicked){ inr4_toggle = inr4_toggle != 1 ? 1 : 0; } } proc reset : reset_clicked { autocalc = 0; if (reset_clicked) { ind1_toggle = ind2_toggle = ind3_toggle = ind4_toggle = inl1_toggle = inl2_toggle = inl3_toggle = inl4_toggle = inu1_toggle = inu2_toggle = inu3_toggle = inu4_toggle = inr1_toggle = inr2_toggle = inr3_toggle = inr4_toggle = 0; } autocalc=1; } ## Function Definitions: func mkmirrors { para ixmirr; auto result, sublist, i, j; result = []; for (i=1; i<=ixmirr#; i++) { sublist = []; for (j=1; j<=ixmirr[i]#; j++) { sublist = sublist // [selmirror(ixmirr[i][j])]; } result = result // [sublist]; } return result; } func nextdir { para mirror; if (mirror=='f') return ['E','N','W','S']; if (mirror=='b') return ['W','S','E','N']; if (mirror=='n') return ['N','E','S','W']; } func indexdir { para dir; if (dir=='N') return 1; if (dir=='E') return 2; if (dir=='S') return 3; if (dir=='W') return 4; } func incrc { para dir; if (dir=='N') return [0,1]; if (dir=='E') return [-1,0]; if (dir=='S') return [0,-1]; if (dir=='W') return [1,0]; } func makeray { para inr, inc, initdir; auto result; ir = inr; ic = inc; dir = initdir; result = [[ir-incrc(initdir)[2],ic-incrc(initdir)[1]], [ir,ic]]; while ((ir>0) && (ir<5) && (ic>0) && (ic<5)) { newrcurr = newr; newccurr = newc; outdircurr=outdir; dir = outdircurr; ir = newrcurr; ic = newccurr; result = result // [[ir,ic]]; } return result; } func visraypt { para r,c; return [startPos.x + scaleWidth * (c-0.5), startPos.y + scaleHeight * (r-0.5)]; } func rayloctovis { para ray; auto result, i; result = []; for (i=1; i<=ray#; i++) { result = result // [mkpt(visraypt(ray[i][1], ray[i][2]))]; } return result; } func selmirror { para indexmirror; return (indexmirror==1) ? "f" : ((indexmirror == -1) ? "b": "n"); } func mkpt { para pairls; return {pairls[1], pairls[2]}; } ## Picture Definition: picture is [inl1,inl2,inl3,inl4,inu1,inu2,inu3,inu4, inr1, inr2, inr3, inr4, ind1, ind2, ind3, ind4, onN11, onN12, onN13, onN14, onW11, onW21, onW31, onW41, onE14, onE24, onE34, onE44, onS41, onS42, onS43, onS44, ray11Nvis, ray12Nvis, ray13Nvis, ray14Nvis, ray11Wvis, ray21Wvis, ray31Wvis, ray41Wvis, ray14Evis, ray24Evis, ray34Evis, ray44Evis, ray41Svis, ray42Svis, ray43Svis, ray44Svis, resetButt, LBcover] // mirrorvis; ## Turn on automatic calculation and execute any triggered actions pending. autocalc = 1; ## End of automatically generated script. coverButt is Button("cover", (gridVisible) ? "COVER" : "UNCOVER", 5, 25, true); picture is [inl1,inl2,inl3,inl4,inu1,inu2,inu3,inu4, inr1, inr2, inr3, inr4, ind1, ind2, ind3, ind4, onN11, onN12, onN13, onN14, onW11, onW21, onW31, onW41, onE14, onE24, onE34, onE44, onS41, onS42, onS43, onS44, ray11Nvis, ray12Nvis, ray13Nvis, ray14Nvis, ray11Wvis, ray21Wvis, ray31Wvis, ray41Wvis, ray14Evis, ray24Evis, ray34Evis, ray44Evis, ray41Svis, ray42Svis, ray43Svis, ray44Svis, resetButt, coverButt, LBcover] // mirrorvis; proc toggle_cover : cover_clicked { if (cover_clicked) { gridVisible = (gridVisible) ? false : true; } } ## there is an error in the specification of mirror12: ## mirror12 is Line(visraypt(1,2)[1] - size12, visraypt(1,2)[2] + size11*mirrorGrid[1][2], visraypt(1,2)[1] + size12, visraypt(1,2)[2] - size12*mirrorGrid[1][2], mirrorcol); mirror12 is Line(visraypt(1,2)[1] - size12, visraypt(1,2)[2] + size12*mirrorGrid[1][2], visraypt(1,2)[1] + size12, visraypt(1,2)[2] - size12*mirrorGrid[1][2], mirrorcol); ## a more friendly clicking regime: near = 1000; near11 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (1-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (1-0.5)) ^ 2) < 25); near12 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (2-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (1-0.5)) ^ 2) < 25); near13 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (3-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (1-0.5)) ^ 2) < 25); near14 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (4-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (1-0.5)) ^ 2) < 25); near21 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (1-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (2-0.5)) ^ 2) < 25); near22 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (2-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (2-0.5)) ^ 2) < 25); near23 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (3-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (2-0.5)) ^ 2) < 25); near24 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (4-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (2-0.5)) ^ 2) < 25); near31 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (1-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (3-0.5)) ^ 2) < 25); near32 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (2-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (3-0.5)) ^ 2) < 25); near33 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (3-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (3-0.5)) ^ 2) < 25); near34 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (4-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (3-0.5)) ^ 2) < 25); near41 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (1-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (4-0.5)) ^ 2) < 25); near42 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (2-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (4-0.5)) ^ 2) < 25); near43 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (3-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (4-0.5)) ^ 2) < 25); near44 is (sqrt((mousePosition.x - startPos.x - scaleWidth * (4-0.5)) ^ 2 + (mousePosition.y - startPos.y - scaleHeight * (4-0.5)) ^ 2) < 25); nearIJs is [near11,near12,near13,near14, near21,near22,near23,near24, near31,near32,near33,near34, near41,near42,near43,near44]; func currLBgridpt { para nearto; if (nearto[1]) return [1,1]; if (nearto[2]) return [1,2]; if (nearto[3]) return [1,3]; if (nearto[4]) return [1,4]; if (nearto[5]) return [2,1]; if (nearto[6]) return [2,2]; if (nearto[7]) return [2,3]; if (nearto[8]) return [2,4]; if (nearto[9]) return [3,1]; if (nearto[10]) return [3,2]; if (nearto[11]) return [3,3]; if (nearto[12]) return [3,4]; if (nearto[13]) return [4,1]; if (nearto[14]) return [4,2]; if (nearto[15]) return [4,3]; if (nearto[16]) return [4,4]; }; currgridpt is currLBgridpt(nearIJs); locatorCircle is Circle(startPos.x + scaleWidth * (currgridpt[2]-0.5), startPos.y + scaleHeight * (currgridpt[1]-0.5), 6, "lightgrey"); picture is [inl1,inl2,inl3,inl4,inu1,inu2,inu3,inu4, inr1, inr2, inr3, inr4, ind1, ind2, ind3, ind4, onN11, onN12, onN13, onN14, onW11, onW21, onW31, onW41, onE14, onE24, onE34, onE44, onS41, onS42, onS43, onS44, ray11Nvis, ray12Nvis, ray13Nvis, ray14Nvis, ray11Wvis, ray21Wvis, ray31Wvis, ray41Wvis, ray14Evis, ray24Evis, ray34Evis, ray44Evis, ray41Svis, ray42Svis, ray43Svis, ray44Svis, resetButt, coverButt, LBcover] // mirrorvis // [locatorCircle];