RosettaCodeData/Task/Superellipse/Pluto/superellipse.pluto
2026-04-30 12:34:36 -04:00

50 lines
1.3 KiB
Text

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()