- Notifications
You must be signed in to change notification settings - Fork3
Squarified Treemap algorithm written in Rust.
License
bacongobbler/treemap-rs
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Implements the Squarified Treemap algorithm published by Mark Bruls, Kees Huizing, and Jarke J. van Wijk.
The Squarified Treemap algorithm paper can be found here:https://www.win.tue.nl/~vanwijk/stm.pdf
Suppose we have a rectangle with a width of 6 and a height of 4, and furthermore suppose that this rectangle must be subdivided in seven rectangles with areas 6, 6, 4, 3, 2, 2, and 1. The standard treemap algorithm uses a simple approach: The rectangle is subdivided either horizontally or vertically. Thin rectangles emerge, with aspect ratios of 16 and 36, respectively.
In other words, it'll look something like this:
+------+------+----+---+--+-+| | | | | | || | | | | | || 6 | 6 | 4 | 3 | 2|1|| | | | | | |+------+------+----+---+--+-+
The Squarified Treemap algorithm tesselates a rectangle recursively into rectangles, such that their aspect ratios approach 1 as close as possible.
+-------------+-----+-----+--+| | 2 | 2 | 1|| 6 +-----+-+---+--||-------------+ | || | | || 6 | 4 | 3 |+-------------+-------+------+
This can be useful for a variety of purposes:
- visualizing hierarchal structures, such as showing how much space each directory uses in a file drive
- generating a floor map given an area on how each room should be subdivided (bathrooms would need a smaller amount of space than a living room, for example)
This example will tesselate a rectangle with a width of 6 and a height of 4 with seven rectangles with areas 6, 6, 4, 3, 2, 2, and 1, then display each rectangle's top-left corner's x and y position within the larger rectangle (the bounds), as well as their respective height and width.
To start, generate a new project:
$cargo new --bin treemap-example Created binary (application) `treemap-example` package
Addtreemap
to Cargo.toml:
[dependencies]treemap ="0.3"
Then, insrc/main.rs
:
use treemap::{MapItem,Mappable,Rect,TreemapLayout};fnmain(){let layout =TreemapLayout::new();let bounds =Rect::from_points(0.0,0.0,6.0,4.0);letmut items:Vec<Box<dynMappable>> =vec![Box::new(MapItem::with_size(6.0)),Box::new(MapItem::with_size(6.0)),Box::new(MapItem::with_size(4.0)),Box::new(MapItem::with_size(3.0)),Box::new(MapItem::with_size(2.0)),Box::new(MapItem::with_size(2.0)),Box::new(MapItem::with_size(1.0)),]; layout.layout_items(&mut items, bounds);for itemin items{let item_bounds = item.bounds();println!("x={} y={} w={} h={}", item_bounds.x, item_bounds.y, item_bounds.w, item_bounds.h);println!("------");}}
About
Squarified Treemap algorithm written in Rust.