94 lines
2.3 KiB
Lua
94 lines
2.3 KiB
Lua
function dragon()
|
|
local l = "l"
|
|
local r = "r"
|
|
local inverse = {l = r, r = l}
|
|
local field = {r}
|
|
local num = 1
|
|
local loop_limit = 6 --increase this number to render a bigger curve
|
|
for discard=1,loop_limit do
|
|
field[num+1] = r
|
|
for i=1,num do
|
|
field[i+num+1] = inverse[field[num-i+1]]
|
|
end
|
|
num = num*2+1
|
|
end
|
|
return field
|
|
end
|
|
|
|
function render(field, w, h, l)
|
|
local x = 0
|
|
local y = 0
|
|
local points = {}
|
|
local highest_x = 0
|
|
local highest_y = 0
|
|
local lowest_x = 0
|
|
local lowest_y = 0
|
|
local l = "l"
|
|
local r = "r"
|
|
local u = "u"
|
|
local d = "d"
|
|
local heading = u
|
|
local turn = {r = {r = d, d = l, l = u, u = r}, l = {r = u, u = l, l = d, d = r}}
|
|
for k, v in ipairs(field) do
|
|
heading = turn[v][heading]
|
|
for i=1,3 do
|
|
points[#points+1] = {x, y}
|
|
if heading == l then
|
|
x = x-w
|
|
elseif heading == r then
|
|
x = x+w
|
|
elseif heading == u then
|
|
y = y-h
|
|
elseif heading == d then
|
|
y = y+h
|
|
end
|
|
if x > highest_x then
|
|
highest_x = x
|
|
elseif x < lowest_x then
|
|
lowest_x = x
|
|
end
|
|
if y > highest_y then
|
|
highest_y = y
|
|
elseif y < lowest_y then
|
|
lowest_y = y
|
|
end
|
|
end
|
|
end
|
|
points[#points+1] = {x, y}
|
|
highest_x = highest_x - lowest_x + 1
|
|
highest_y = highest_y - lowest_y + 1
|
|
for k, v in ipairs(points) do
|
|
v[1] = v[1] - lowest_x + 1
|
|
v[2] = v[2] - lowest_y + 1
|
|
end
|
|
return highest_x, highest_y, points
|
|
end
|
|
|
|
function render_text_mode()
|
|
local width, height, points = render(dragon(), 1, 1, 1)
|
|
local rows = {}
|
|
for i=1,height do
|
|
rows[i] = {}
|
|
for j=1,width do
|
|
rows[i][j] = ' '
|
|
end
|
|
end
|
|
for k, v in ipairs(points) do
|
|
rows[v[2]][v[1]] = "*"
|
|
end
|
|
|
|
for i=1,height do
|
|
print(table.concat(rows[i], ""))
|
|
end
|
|
end
|
|
|
|
function dump_points()
|
|
local width, height, points = render(dragon(), 4, 4, 1)
|
|
for k, v in ipairs(points) do
|
|
print(unpack(v))
|
|
end
|
|
end
|
|
|
|
--replace this line with dump_points() to output a list of coordinates:
|
|
render_text_mode()
|