A simple graphical demo for the PICO-1K Jam 2025 which creates an animated Dragon Curve.
A Dragon Curve can be generated physically from repeatedly folding a strip of paper in half and hence the lines in a Dragon Curve never cross each other.
The different colours represent the level of recursion that each segment was generated at by the algorithm.
You can use the cursor keys to move he viewport and ZX / NM / CV to zoom in and out to explore the curve in more detail as it renders or once it has finished.
The compressed byte size of the cartridge is 643. I've made very little effort to save bytes because the program is so simple in the first place.
-- dragon curve -- by retroredge,v0.1,2025 dirs = {{ 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }} rec_dep = 10 line_len = 2 sx = 84 sy = 94 curve = {} count = 1 function flp(tbl) new = {} for i = 1, #tbl do if tbl[i] == "l" then add(new, "r") else add(new, "l") end end return new end function rev(tbl) new = {} for i = #tbl, 1, -1 do add(new, tbl[i]) end return new end function gen_curve(letters, lvl) new = flp(letters) add(curve, "l") new = rev(new) for i = 1, #new do add(curve, new[i]) end if lvl < rec_dep then gen_curve(curve, lvl + 1) end end function wrap1to4(i) return ((i - 1) % 4) + 1 end function _init() gen_curve(curve, 0) end function _draw() cls(0) dir_ind = 1 x = sx y = sy col_max = 1 col = 4 for i = 1, count do if i > col_max then col_max = shl(col_max, 1) col += 1 end dir = dirs[dir_ind] nx = x + dir[1] * line_len ny = y + dir[2] * line_len line(x, y, nx, ny, col) x = nx y = ny if curve[i] == "l" then dir_ind = wrap1to4(dir_ind - 1) else dir_ind = wrap1to4(dir_ind + 1) end end if count < #curve then count += 1 end end function _update() if btn(4) then line_len += 1 elseif btn(5) then line_len -= 1 end line_len = min(max(line_len, 2), 16) if btn(1) then sx += 1 elseif btn(0) then sx -= 1 end if btn(2) then sy -= 1 elseif btn(3) then sy += 1 end end |
[Please log in to post a comment]