Bresenham
Bresenham's line algorithm written in Lua.
Install / Use
/learn @rm-code/BresenhamREADME
Bresenham
Bresenham's line algorithm written in Lua.
Overview
Arguments
The Bresenham.line function expects the following arguments:
- ox (number) The origin's x-coordinates. The line will start here.
- oy (number) The origin's y-coordinates. The line will start here.
- tx (number) The target's x-coordinates. The line will end here.
- ty (number) The target's y-coordinates. The line will end here.
- callback (function) A callback function being called for every tile the line passes. The line algorithm will stop if the callback returns false (optional).
- ... (varargs) Additional variables that should be passed to the callback function (optional).
Return values
- (boolean) True if the line has reached its target, false if it stopped early.
- (number) The number of tiles traversed by the line.
Usage
If you don't provide a callback function the line algorithm will always return true and can be used to count distances on the grid:
local _, counter = Bresenham.line( 1, 1, 7, 7 )
By providing a callback you can control how the line algorithm behaves on the grid. For example you could tell it to stop early if it hits certain tiles, objects, monsters and so on ...
local function callback( x, y, counter, ... )
-- Unpack the varargs passed after the callback.
local vararg1, vararg2 = ...;
-- Check if the line algorithm should stop early.
if not grid[x][y]:isPassable() then
return false
end
return true
end
Bresenham.line( 1, 1, 10, 10, callback, 'foo', 'bar' )
Complete example:
local Bresenham = require( 'Bresenham' )
local grid = {
{ '#', '#', '#', '#', '#', '#', '#', '#' },
{ '#', '.', '.', '.', '.', '.', '.', '#' },
{ '#', '.', '.', '.', '.', '.', '.', '#' },
{ '#', '.', '.', '#', '#', '.', '.', '#' },
{ '#', '.', '.', '#', '#', '.', '.', '#' },
{ '#', '.', '.', '.', '.', '.', '.', '#' },
{ '#', '.', '.', '.', '.', '.', '.', '#' },
{ '#', '#', '#', '#', '#', '#', '#', '#' }
}
print( 'Traverse grid if no obstacles are hit:' )
local success, counter = Bresenham.line( 2, 2, 6, 2, function( x, y, counter )
print( string.format( 'x: %d, y: %d, steps: %d, tile: %s', x, y, counter, grid[x][y] ))
if grid[x][y] == '#' then
return false
end
return true
end)
print( string.format( 'Reached target: %s after %d steps.\n', tostring( success ), counter ))
print( 'Stop line early if obstacles are hit:' )
local success, counter = Bresenham.line( 2, 2, 6, 6, function( x, y, counter )
print( string.format( 'x: %d, y: %d, steps: %d, tile: %s', x, y, counter, grid[x][y] ))
if grid[x][y] == '#' then
return false
end
return true
end)
print( string.format( 'Reached target: %s after %d steps.\n', tostring( success ), counter ))
print( 'Without a callback just count the steps from start to finish:' )
local _, counter = Bresenham.line( 1, 1, 7, 7 )
print( counter )
Related Skills
node-connect
346.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
346.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
346.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
