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 数据结构

Download history 10/week @ 2024-03-12 1/week @ 2024-03-19 1/week @ 2024-03-26 15/week @ 2024-04-02 9/week @ 2024-04-23 33/week @ 2024-05-28 61/week @ 2024-06-04

每月 93 次下载
用于 tui-treemap

MIT 许可证

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!("------");
    }
}

无运行时依赖