Skip to content

Instantly share code, notes, and snippets.

@orllewin
Created December 9, 2025 08:41
Show Gist options
  • Select an option

  • Save orllewin/f676d2cee75eba872872fb47dd290178 to your computer and use it in GitHub Desktop.

Select an option

Save orllewin/f676d2cee75eba872872fb47dd290178 to your computer and use it in GitHub Desktop.
require("L5")
local lines = {}
local lineCount = 10
local velocity = 3
function setup()
windowTitle('Walking Lines')
size(680, 680)
frameRate(30)
for i = 1 , lineCount do
local walkingLine = {}
walkingLine.x1 = random(width)
walkingLine.y1 = random(height)
walkingLine.x2 = random(width)
walkingLine.y2 = random(height)
walkingLine.x1Direction = 1
if(random() > 0.5) then
walkingLine.x1Direction = -1
end
walkingLine.y1Direction = 1
if(random() > 0.5) then
walkingLine.y1Direction = -1
end
walkingLine.x2Direction = 1
if(random() > 0.5) then
walkingLine.x2Direction = -1
end
walkingLine.y2Direction = 1
if(random() > 0.5) then
walkingLine.y2Direction = -1
end
table.insert(lines, walkingLine)
end
stroke(255)
end
function draw()
background(0)
for i = 1, lineCount do
local walkingLine = lines[i]
-- update
walkingLine.x1 = walkingLine.x1 + (velocity * walkingLine.x1Direction)
walkingLine.y1 = walkingLine.y1 + (velocity * walkingLine.y1Direction)
walkingLine.x2 = walkingLine.x2 + (velocity * walkingLine.x2Direction)
walkingLine.y2 = walkingLine.y2 + (velocity * walkingLine.y2Direction)
-- check bounds
if(walkingLine.x1 > width or walkingLine.x1 < 0)then
walkingLine.x1Direction = walkingLine.x1Direction * -1
end
if(walkingLine.y1 > height or walkingLine.y1 < 0)then
walkingLine.y1Direction = walkingLine.y1Direction * -1
end
if(walkingLine.x2 > width or walkingLine.x2 < 0)then
walkingLine.x2Direction = walkingLine.x2Direction * -1
end
if(walkingLine.y2 > height or walkingLine.y2 < 0)then
walkingLine.y2Direction = walkingLine.y2Direction * -1
end
-- draw intersections
for j = 1, lineCount do
if(j ~= i)then
local otherWalkingLine = lines[j]
local intersectX, intersectY = intersectPointLines(walkingLine, otherWalkingLine)
if(intersectX ~= -1)then
circle(intersectX, intersectY, 10)
end
end
end
--draw
line(walkingLine.x1, walkingLine.y1, walkingLine.x2, walkingLine.y2)
end
end
function intersectPointLines(a, b)
return intersectPoint(a.x1, a.y1, a.x2, a.y2, b.x1, b.y1, b.x2, b.y2)
end
function intersectPoint(aX1, aY1, aX2, aY2, bX1, bY1, bX2, bY2)
local a1 = aY2 - aY1
local b1 = aX1 - aX2
local c1 = a1 * aX1 + b1 * aY1
local a2 = bY2 - bY1
local b2 = bX1 - bX2
local c2 = a2 * bX1 + b2 * bY1
local delta = a1 * b2 - a2 * b1
local iX = (b2 * c1 - b1 * c2) / delta
local iY = (a1 * c2 - a2 * c1) / delta
if(min(aX1, aX2) < iX and max(aX1, aX2) > iX and min(bX1, bX2) < iX and max(bX1, bX2) > iX) then
return iX, iY
else
return -1, -1
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment