4个版本

0.2.0 2023年8月25日
0.1.3 2023年8月22日
0.1.1 2023年8月13日
0.1.0 2023年8月13日

816文本处理

每月下载 35

MIT 协议

96KB
1.5K SLoC

Cellumina

Docs Status license Crates.io Crates.io

一个易于创建和运行 细胞自动机 的库。

特性

Cellumina提供了一个表示二维字符网格的 Automaton 结构体。这个网格可以从向量、文件或图像初始化。此外,用户可以配置自动机使用的 Rule 来将其转换为下一个步骤。转换到下一个状态可以手动启动,也可以在固定的时间步长上启动,例如当使用Cellumina作为更大图形应用程序的一部分时。

规则

  • 模式替换规则
    • 指定在每一步搜索的模式,并将其替换为第二个模式。
    • 示例: 下落沙模拟
  • 环境规则
    • 单元格的下一个状态完全由它上一步的环境决定。
    • 示例: 规则90
    • 示例: 生命游戏

这些规则可以通过创建这些结构体并使用常规Rust代码来添加。

模式替换规则也可以通过使用 serde 进行(反)序列化,或从(保存到)自定义文件类型中加载。这种表示比serde版本更易于阅读,如果您不希望Rust文件包含大量模式初始化网格,则可以轻松手动创建。

此外,可以覆盖公共特质 Rule 来实现完全自定义的规则。

实时预览

Cellumina可以在“实时预览”模式下运行。然后它将接管配置好的自动机,自行运行它,并在单独的窗口中显示单元格状态。这对于仅仅尝试细胞自动机很有用。

用户还可以直接更改单元格的状态。按下任意(字符或空格)按钮,然后鼠标点击将替换当前悬停的单元格为按下的字符。自动机也可以通过 Enter 暂停和恢复。自动机的当前状态可以保存到文件中,使用 Ctrl + S,目前支持以下格式:txt(每行一行字符)以及png, jpeg, ico, pnm, bmp, exr, tiff(与 image crate 支持的完全相同)。这些文件的常规限制适用,例如保存为 jpeg 可能会导致压缩,因此 .jpeg-文件不适合保存和重新加载自动机。

实时视图功能默认不包含在库中,必须通过 display 功能启用。

用法

要在自己的项目中使用 Cellumina,只需将以下行添加到您的 Cargo.toml 文件中

  [dependencies]
  cellumina = "0.1"

或者

  [dependencies]
  cellumina = {version = "0.1", features = ["display"]}

如果您想启用 实时视图

示例

示例文件夹 包含以下示例

  • game_of_life:使用环境规则实现的康威生命游戏。
  • sand:一个小型的落沙模拟,使用模式替换规则模拟落沙、火和灰烬。
  • rule90:一个实现 Rule 90 的 1 维自动机的示例,演示如何使用 Cellumina 的 2D-网格显示 1 维自动机的多个连续状态。
  • to_string:一个示例,说明如何将规则转换为不同的字符串/文件类型。

所有示例都可以通过以下命令运行

   git clone https://github.com/Linus-Mussmaecher/cellumina

并使用 cargo run --examples <name> --features="display" 执行,例如

  cargo run --examples sand --features="display"

日志记录

Cellumina 通过 log crate 支持日志记录。您可以使用任何记录器,如 env-logsimple-logger,根据它们的文档初始化它们并从 cellumina 接收日志输出。

性能

由于模式替换可能是一个相当昂贵的操作,cellumina 使用 rayon crate 并行运行这些操作。小模式(例如,当使用落沙模拟创建死亡动画或类似效果时)的运行时间可以忽略不计。较大的模式,特别是有多个模式或规则时,可能需要更多计算时间,但仍然可以在单独运行时以高帧率查看。请注意,调试和发布配置下的运行时间差异很大。

依赖关系

~14–50MB
~644K SLoC