Перейти к содержимому
cloud

Рисуем фракталы на Love

Рекомендуемые сообщения

  Программка написанная на love2D рисует фракталы, ставя новую точку проходя определённое расстояние от предыдущей точки до случайно выбранной вершины предварительно нарисованной фигуры.

   Подробнее в этом видео.

   Как использовать:

Запускаем, ставим мышью несколько точек, выбираем расстояние, которое будет проходить точка (начальная ставится случайно), пробел - пошагово, А - автоматически рисуем. Ну там в окошке есть инфо по управлению.

   По умолчанию расстояние 1/2, идеально для треугольника, для  фигур с большим количеством точек лучше уменьшить. 

   В общем играйтесь кому интересно, скачать скомпилированный вариант можно с гугл диска.

      eAO7wqqCxJoGRA.png

 

io.stdout:setvbuf("no")

local windowHeight
local windowWidth
local fullscreen = false

local tab = {}
local uptime = 0
local iter = 0
local showInfo = true
local stepMode = true
local speed = 1
local dist = 2

local f = {}
local t = {}

local function drawPoint(cor)
  love.graphics.points(cor[1], cor[2])
end

local function newPoint()
  if #f >= 2 then
    local r = love.math.random(1, #f)
    t[1] = f[r][1]+(t[1]-f[r][1])/dist 
    t[2] = f[r][2]+(t[2]-f[r][2])/dist 
    tab[t[1]] = t[2]
    iter = iter + 1
    return t
  end
end

function love.mousereleased(x, y, button)
   if button == 1 then
      f[#f+1] = {x, y}
   end
end

function love.keyreleased(key)
  if key ~= nil then print(key) end
  if key == "h" then
    showInfo = not showInfo
  elseif key == "r" then
    tab = {}
    t ={love.math.random(10, windowHeight - 10), love.math.random(10, windowWidth - 10)}
    f ={}
    iter = 0
    stepMode = true
  elseif key == "a" then
    stepMode = false
  elseif key == "kp-" then
    if speed > 1 then speed = speed / 2 end
  elseif key == "kp+" then
      speed = speed * 2
  elseif key == "pageup" then
    if dist > 1 then dist = dist - 0.1 end
  elseif key == "pagedown" then
      if dist <= 5 then dist = dist + 0.1 end
  elseif key == "space" then
    stepMode = true
    newPoint(t)
  elseif key == "f" then
    fullscreen = not fullscreen
  end
end


function love.load()
  love.window.setTitle("Fractals Random Generator_v1")
  love.window.setFullscreen(fullscreen, "desktop")
  print(windowHeight, windowWidth)
  windowHeight = love.graphics.getHeight()
  windowWidth = love.graphics.getWidth()
  t ={love.math.random(10, windowWidth - 10), love.math.random(10, windowHeight - 10)}
end


function love.update(dt)
  love.window.setFullscreen(fullscreen, "desktop")
  windowHeight = love.graphics.getHeight()
  windowWidth = love.graphics.getWidth()
  if not stepMode then
    for i=1, speed do
      newPoint(t)
    end
  end
  uptime = uptime + dt
  love.keyreleased()
  love.mousereleased()
end


function love.draw()
  love.graphics.setColor(0.5, 0.5, 1)
  for i=1, #f do 
    drawPoint(f[i])
  end
  
  for k,v in pairs(tab) do
    love.graphics.points(k,v)
  end
  if showInfo then
    love.graphics.setColor(1, 1, 0.2)
    for i=1, #f do
      --love.graphics.print("P"..i, f[i][1], f[i][2])
      love.graphics.circle("fill", f[i][1], f[i][2], 2)
    end

    love.graphics.print("FPS: "..love.timer.getFPS(), 10, 10)
    love.graphics.print("Time: " .. uptime, 10, 25)
    love.graphics.print("Points: " .. iter, 10, 40)
    love.graphics.print("distance: 1/".. dist, 10, 55)
    love.graphics.print("speed: ".. speed, 10, 70)

    love.graphics.print("'SPACE' - next step", 10, windowHeight - 80)
    love.graphics.print("'A' - auto draw", 10, windowHeight - 65)
    love.graphics.print("'R'- reset", 10, windowHeight - 50)
    love.graphics.print("'F' - fullscreen", 10, windowHeight - 35)
    
    love.graphics.print("'pgUp/pgDown' - change distance to top of the figure.", 150, windowHeight - 20)
    love.graphics.print("'-/+' - change speed.", 150, windowHeight - 35)

    love.graphics.print("Point", t[1], t[2])
  end
  love.graphics.setColor(1, 1, 0.2)
  love.graphics.print("'H'- show/hide info", 10, windowHeight - 20)
end
 

 

 

Изменено пользователем cloud

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...