This commit is contained in:
wan-may 2023-10-07 17:40:19 -03:00
parent 79e8c523d9
commit 424e8a9129
2 changed files with 20 additions and 4 deletions

View File

@ -1,7 +1,7 @@
local enumerations = require 'enumerations'
local twintree = require 'twintree'
local step = coroutine.wrap( twintree.buildIncremental )
local a = enumerations.NadFFI( 2 )
local a = enumerations.Dyad()
local b = enumerations.SternBrocot()
step( a, b )
@ -27,6 +27,7 @@ end
local function paint()
if not pointList then return end
numMapped = #pointList / 2
local type = type
--Make sure the whole point list consists of numbers!
--We use the __call metamethod in non-number elements to coerce to numbers.
@ -87,6 +88,7 @@ function love.update( dt )
if love.keyboard.isScancodeDown "s" then repaint = true; cy = cy - dt * 0.1 / math.sqrt( zoomFactor ) end
if love.keyboard.isScancodeDown "q" then repaint = true; zoom( 1 + dt ) end
if love.keyboard.isScancodeDown "e" then repaint = true; zoom( 1 - dt ) end
if love.keyboard.isScancodeDown "space" then repaint = true; pointList = twintree.flat( twintree.build( 10000, a, b ) ) end
if repaint then return paint() end
end
@ -95,9 +97,8 @@ function love.keypressed( key, code, isrepeat)
end
function love.load()
--pointList = twintree.flat( twintree.build( 10000, a, b ) )
--numMapped = #pointList / 2
new()
pointList = twintree.flat( twintree.build( 10000, a, b ) )
numMapped = #pointList / 2
love.graphics.setPointSize( 3 )
love.graphics.setLineWidth( 0.005 )
paint()

15
readme.md Normal file
View File

@ -0,0 +1,15 @@
This is a little LOVE script for plotting correspondences between dense countable ordered sets.
To use: download LOVE2D, then run LOVE in the directory where this repo is saved.
Any two countable dense total orders are order isomorphic.
Using only this structure it is possible to explicitly construct an increasing bijection between these two orders.
This implements the standard procedure for doing this in general, the "back-and-forth" method.
Pass a function that generates an infinite sequence to the enumerator wrapper ( require 'enumeration' ),
then pass the resulting enumerators to twintree.build ( require 'twintree' ).
twintree.build takes a number as its first argument, and the pair of enumerators as its following two arguments.
This number is the number of pairs of points in the support of the function (i.e., it's a partial function, only some large but finite number of points will be computed and plotted. The rest will be displayed by linear interpolation.).
twintree.build returns two values, each is a binary tree.
twintree.flat does a simultaneous inorder traversal of both trees, then interlaces the entries in a large, reused, 1-indexed Lua table that can be passed to love.graphics.line. Supposing the trees are traversed like { x_1, x_2, x_3, ... x_n } and { y_1, y_2, y_3, ..., y_n }, then the resulting table will be { x_1, y_1, x_2, y_2, x_3, y_3, ..., y_n }.