[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Module release: Cassowary 1.0
- From: Simon Cozens <simon@...>
- Date: Thu, 07 Aug 2014 10:34:55 +0100
Hello!
I have just released my first luarock, a port of the UW Cassowary Constraint
Solving Toolkit. Hopefully I got everything right...
Cassowary is "an incremental constraint solving toolkit that efficiently
solves systems of linear equalities and inequalities." Basically, it solves
equations for you. This is incredibly useful in UI work, when you might want
widget A to be twice the width of widget B but the total width of A and B to
be not more than 500 pixels; this is why Apple uses it to lay out the UI of OS
X applications.
Here's an example:
cassowary = require("cassowary")
-- Create a new solver object
local solver = cassowary.SimplexSolver();
-- Create lua variables to represent x and y
local x = cassowary.Variable({ name = 'x' });
local y = cassowary.Variable({ name = 'y' });
-- Let's encode some expressions:
-- x < y
solver:addConstraint(cassowary.Inequality(x, "<=", y))
-- y = x + 3
solver:addConstraint(cassowary.Equation(y, cassowary.plus(x, 3)))
-- either x = 10 or y = 10
solver:addConstraint(cassowary.Equation(x, 10, cassowary.Strength.weak))
solver:addConstraint(cassowary.Equation(y, 10, cassowary.Strength.weak))
-- The solver automatically tries to resolve the current situation
-- whenever constraints are added, so all we need to do is look
-- at the values:
print("x = "..x.value)
print("y = "..y.value)
Depending on the phase of the moon, you will either see:
x=7
y=10
or
x=10
y=13
This port is itself a port of the Javascript port at
https://github.com/slightlyoff/cassowary.js but any errors are almost
certainly my responsibility. (Not that I understand what the code is doing,
I'm just mindlessly translating the language.)
I'll be using it to improve the way that text frames are declared in my SILE
typesetting engine ( https://github.com/simoncozens/sile ) but I hope it's
useful to others as well. I'm sure those embedding lua into games can find
interesting uses for it. Anyway, have fun.
Simon