6 个版本
0.3.2 | 2019 年 2 月 17 日 |
---|---|
0.3.1 | 2019 年 2 月 17 日 |
0.2.1 | 2019 年 1 月 3 日 |
0.1.0 | 2019 年 1 月 2 日 |
#882 in 数据结构
每月 93 次下载
用于 tui-treemap
10KB
199 行
树形图
实现了由 Mark Bruls、Kees Huizing 和 Jarke J. van Wijk 发布的 Squarified Treemap 算法。
Squarified Treemap 算法论文可以在以下链接找到: https://www.win.tue.nl/~vanwijk/stm.pdf
用途
假设我们有一个宽度为 6、高度为 4 的矩形,并且假设这个矩形必须被分成七个面积分别为 6、6、4、3、2、2 和 1 的矩形。标准的树形图算法使用了一种简单的方法:矩形要么水平分割,要么垂直分割。出现了细长的矩形,其纵横比为 16 和 36。
换句话说,它看起来可能像这样
+------+------+----+---+--+-+
| | | | | | |
| | | | | | |
| 6 | 6 | 4 | 3 | 2|1|
| | | | | | |
+------+------+----+---+--+-+
Squarified Treemap 算法递归地将矩形分割成小矩形,使其纵横比尽可能接近 1。
+-------------+-----+-----+--+
| | 2 | 2 | 1|
| 6 +-----+-+---+--|
|-------------+ | |
| | | |
| 6 | 4 | 3 |
+-------------+-------+------+
这可以用于各种目的
- 可视化层次结构,例如显示文件驱动器中每个目录使用的空间量
- 根据每个房间应该如何划分的区域生成楼层图(例如,浴室需要的空间比客厅小)
示例
此示例将使用七个面积为 6、6、4、3、2、2 和 1 的矩形分割宽度为 6、高度为 4 的矩形,然后显示每个矩形在较大矩形(边界)内的左上角 x 和 y 位置,以及它们各自的高度和宽度。
首先,创建一个新的项目
$ cargo new --bin treemap-example
Created binary (application) `treemap-example` package
将 treemap
添加到 Cargo.toml
[dependencies]
treemap = "*"
然后,在 src/main.rs
extern crate treemap;
use treemap::{MapItem, Mappable, Rect, TreemapLayout};
fn main() {
let mut layout = TreemapLayout::new();
let bounds = Rect::from_points(0.0, 0.0, 6.0, 4.0);
let mut items: Vec<Box<Mappable>> = 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 item in items {
let item_bounds = item.bounds();
println!("x={} y={} w={} h={}", item_bounds.x, item_bounds.y, item_bounds.w, item_bounds.h);
println!("------");
}
}