author: Andreas published: 2026-06-10 11:31:00 updated: 2026-06-10 11:31:00 topics: flow-rbp, Rect bin packing, Rust title: flow-rbp: A library for packing rectangles into two-dimensional finite bins snippet: flow-rbp is a library for packing rectangles into two-dimensional finite bins using different heuristic methods for placement. --- [flow-rbp](https://luflow.net/git-repos/flow-rbp.git) is a library for packing rectangles into two-dimensional finite bins using different heuristic methods for placement. The two-dimensional rectangle bin packing is a classical problem in combinatorial optimization. In this problem, one is given a sequence of rectangles `(R1, R2, ... Rn), Ri = (wi, hi)` and the task is to find a packing of these items into a minimum number of bins of size `(W, H)`. No two rectangles may intersect or be contained inside one another. This library uses an algorithm sometimes referred as `The Maximal Rectangles ALgorithm`. This algorithm stores a list of free rectangles that represents the free area of the bin. [flow-texpack](https://luflow.net/git-repos/flow-texpack.git) is a program that uses [flow-rbp](https://luflow.net/git-repos/flow-rbp.git) to generate texture atlas. ### Installing Rust Install `Rust` from your package manager or by downloading from here: [https://rust-lang.org/](https://rust-lang.org/). ### Getting the code Install `git` from your package manager or by downloading from here: [https://git-scm.com/install](https://git-scm.com/install). The [git repository](https://luflow.net/git-repos/flow-rbp.git) can also be browsed online. Clone the `git` repository: ```sh git clone https://luflow.net/git/flow-rbp.git ``` ### Usage Add this to your `Cargo.toml`: ``` [dependencies] flow-rbp = { git = "https://luflow.net/git/flow-rbp.git", tag = "v0.1.0" } ``` Then: ```rust use flow_rbp::FreeRectHeuristic; use flow_rbp::RectsBinPack; // create a new bin of size 32x32 which allows rotation: let mut rbp = RectsBinPack::new(32, 32, true).unwrap(); // make sure occupancy is zero: assert_eq!(rbp.get_occupancy(), 0.0); // add a few rects that should fit: assert_eq!(rbp.insert(16, 16, FreeRectHeuristic::BottomLeft).is_some(), true); assert_eq!(rbp.insert(16, 16, FreeRectHeuristic::BottomLeft).is_some(), true); assert_eq!(rbp.get_occupancy(), 0.5); assert_eq!(rbp.insert(16, 16, FreeRectHeuristic::BottomLeft).is_some(), true); assert_eq!(rbp.insert(16, 16, FreeRectHeuristic::BottomLeft).is_some(), true); assert_eq!(rbp.get_occupancy(), 1.0); // this rect will not fit and therefore returns None: assert_eq!(rbp.insert(1, 1, FreeRectHeuristic::BottomLeft).is_none(), true); ``` ### License [flow-rbp](https://luflow.net/git-repos/flow-rbp.git) is licensed under the zlib license. This license allows you to use `flow-rbp` freely in any software.