40 lines
1.1 KiB
Lua
40 lines
1.1 KiB
Lua
local abs,cos,floor,pi,pow,sin = math.abs,math.cos,math.floor,math.pi,math.pow,math.sin
|
|
local bitmap = {
|
|
init = function(self, w, h, value)
|
|
self.w, self.h, self.pixels = w, h, {}
|
|
for y=1,h do self.pixels[y]={} end
|
|
self:clear(value)
|
|
end,
|
|
clear = function(self, value)
|
|
for y=1,self.h do
|
|
for x=1,self.w do
|
|
self.pixels[y][x] = value or " "
|
|
end
|
|
end
|
|
end,
|
|
set = function(self, x, y, value)
|
|
x,y = floor(x+0.5),floor(y+0.5)
|
|
if x>0 and y>0 and x<=self.w and y<=self.h then
|
|
self.pixels[y][x] = value or "#"
|
|
end
|
|
end,
|
|
superellipse = function(self, ox, oy, n, a, b, c)
|
|
local function sgn(n) return n>=0 and 1 or -1 end
|
|
for t = 0, 1, 0.002 do
|
|
local theta = t * 2 * pi
|
|
local x = ox + a * pow(abs(cos(theta)), 2/n) * sgn(cos(theta))
|
|
local y = oy + b * pow(abs(sin(theta)), 2/n) * sgn(sin(theta))
|
|
self:set(x, y, c)
|
|
end
|
|
end,
|
|
render = function(self)
|
|
for y=1,self.h do
|
|
print(table.concat(self.pixels[y]))
|
|
end
|
|
end,
|
|
}
|
|
|
|
bitmap:init(80, 60, "..")
|
|
bitmap:superellipse(40, 30, 2.5, 38, 28, "[]")
|
|
bitmap:render()
|