113 lines
2.4 KiB
Lua
113 lines
2.4 KiB
Lua
|
|
function love.load()
|
|
--options
|
|
love.graphics.setColor(1,1,1)
|
|
love.graphics.setDefaultFilter("nearest") -- good pixel
|
|
|
|
SCREEN_WIDTH = love.graphics.getWidth()
|
|
SCREEN_HEIGHT = love.graphics.getHeight()
|
|
|
|
-- simulation variables
|
|
CONST_G = 39.5
|
|
CONST_S = 0.15
|
|
|
|
T = 0
|
|
DT = 1/120
|
|
TIME_SPEED = 0.25
|
|
|
|
VIEW = {}
|
|
VIEW.x = 0
|
|
VIEW.y = 0
|
|
VIEW.prints = {}
|
|
|
|
require "class"
|
|
require "body"
|
|
|
|
newBody(
|
|
{0, 0, 0},
|
|
{0, 0, 0},
|
|
40000,
|
|
{1,0,0}
|
|
)
|
|
newBody(
|
|
{10000, 0, 0},
|
|
{0, 100000, 0},
|
|
200,
|
|
{0,1,0}
|
|
)
|
|
newBody(
|
|
{20000, 0, 0},
|
|
{0, 100000, 0},
|
|
400,
|
|
{0,0,1}
|
|
)
|
|
newBody(
|
|
{0, 20000, 0},
|
|
{-200000, 0, 0},
|
|
3000,
|
|
{0,1,1}
|
|
)
|
|
end
|
|
|
|
function love.update(dt)
|
|
T = math.floor((T + DT * TIME_SPEED)*1000)/1000
|
|
UpdateBodiesAcceleration()
|
|
UpdateBodiesVelocity(DT * TIME_SPEED)
|
|
UpdateBodiesPosition(DT * TIME_SPEED)
|
|
end
|
|
|
|
function love.draw()
|
|
-- center camera on bigger one
|
|
local vm = 0
|
|
for n, body in pairs(BodyList) do
|
|
if body.mass > vm then
|
|
vm = body.mass
|
|
VIEW.x = -body.x
|
|
VIEW.y = -body.y
|
|
end
|
|
end
|
|
local vm = 0
|
|
for n, body in pairs(BodyList) do
|
|
if body.max_distance > vm then
|
|
vm = body.max_distance
|
|
VIEW.size = math.sqrt(body.max_distance)
|
|
end
|
|
end
|
|
|
|
love.graphics.setColor(1,1,1)
|
|
-- draw bodies
|
|
for n, body in pairs(BodyList) do
|
|
addPrint(body)
|
|
end
|
|
drawPrints()
|
|
-- draw info
|
|
love.graphics.setColor(1,1,1)
|
|
love.graphics.print("x,y: " .. VIEW.x .. VIEW.y .. " size: " .. VIEW.size .. " T: ".. T)
|
|
for n, body in pairs(BodyList) do
|
|
love.graphics.setColor(body.color[1],body.color[2],body.color[3])
|
|
love.graphics.print("mass: "..body.mass..", x,y: "..body.x..", "..body.y..", vx, vy:"..body.vx..", "..body.vy,0,15*n)
|
|
end
|
|
end
|
|
|
|
function addPrint(body)
|
|
VIEW.print_time = 10
|
|
table.insert(VIEW.prints,{
|
|
pos = {
|
|
x = body.x,
|
|
y = body.y
|
|
},
|
|
mass = body.mass,
|
|
color = body.color,
|
|
time = VIEW.print_time
|
|
})
|
|
end
|
|
|
|
function drawPrints()
|
|
for n, print in pairs(VIEW.prints) do
|
|
love.graphics.setColor(print.color[1],print.color[2],print.color[3],print.time/VIEW.print_time)
|
|
love.graphics.circle("line",(VIEW.x+print.pos.x)/VIEW.size+SCREEN_WIDTH/2,(VIEW.y+print.pos.y)/VIEW.size+SCREEN_HEIGHT/2,(print.time/VIEW.print_time)*math.sqrt(print.mass)*5/VIEW.size)
|
|
print.time = print.time - 1
|
|
if print.time < 1 then VIEW.prints[n] = nil end
|
|
end
|
|
end
|