require "bitmap" local bmp = bitmap.of(500, 500, color.black, "Superellipse") local function superellipse(n, a) local hw = bmp:width() // 2 local hh = bmp:height() // 2 -- Calculate y for each x. local y = {} for x = 1, a + 1 do local aa = a ^ n local xx = (x - 1) ^ n y[x] = math.round((aa - xx) ^ (1 / n)) end -- Draw quadrants. local prev = {hw + a, hh - y[a + 1]} for x = a - 1, 0, -1 do local curr = {hw + x, hh - y[x + 1]} bmp:line(prev[1], prev[2], curr[1], curr[2], color.white) prev = {curr[1], curr[2]} end prev = {hw, hh + y[1]} for x = 1, a do local curr = {hw + x, hh + y[x + 1]} bmp:line(prev[1], prev[2], curr[1], curr[2], color.white) prev = {curr[1], curr[2]} end prev = {hw - a, hh + y[a + 1]} for x = a - 1, 0, -1 do local curr = {hw - x, hh + y[x + 1]} bmp:line(prev[1], prev[2], curr[1], curr[2], color.white) prev = {curr[1], curr[2]} end prev = {hw, hh - y[1]} for x = 1, a do local curr = {hw - x, hh - y[x + 1]} bmp:line(prev[1], prev[2], curr[1], curr[2], color.white) prev = {curr[1], curr[2]} end end -- Draw 200 concentric superellipses with gradually decreasing 'n'. for a = 200, 1, -1 do superellipse(a / 80, a) end bmp:view()