50 lines
1.3 KiB
Text
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()
|