#wave #collapse #generation #procedural-generation #procedural

app wavefc-cli

Wave 函数坍缩算法的自研实现

1 个稳定版本

3.0.0 2022年11月30日

#512命令行界面

MIT 许可证

79KB
1.5K SLoC

Wave 函数坍缩

Rust

字符映射演示

Character Map Demo

概述

这是一个使用 Rust 编写的 Wave 函数坍缩算法的自研实现。

在核心上,这个函数旨在接收任何类型的样本输入,并根据该输入创建一个新的输出。算法背后的 Wave 引擎被设计为在位和位集中运行。这使得它可以针对任何二维、基于网格的输入运行:字符映射、图像、视频游戏关卡、数独谜题等。唯一的要求是编写一个适配器以支持给定的格式。目前,程序仅支持字符映射文本输入。尽管如此,图像适配器目前正在开发中。

本项目受 MIT 许可证保护,如 license.txt 文件中所述。

快速设置

对于那些不熟悉 Rust 只想从源代码构建项目的人来说,你就在正确的位置。要开始,请安装 Rust 工具链至 rustup.rs

成功安装工具链后,只需导航到源代码目录。假设你已经从仓库克隆了它或下载了它。进入目录后,只需运行 cargo b --release 来构建项目。要实际运行项目,使用 cargo r --release -- <ARGS>

这不是 Rust 语言或 Cargo 的教程。所以请查看他们卓越的资源和支持文档,在 rust-lang.org

讨论

默认情况下,CLI使用海、陆、海岸的示例,正如Robert Heaton在他的博客文章中描述的算法。这在上面的字符映射演示中可以看到。我认为这种方式介绍算法非常有意义。它易于理解和掌握。它基于wavefc存储库中的sample.txt源文件。在编译时将其嵌入到程序中,以提供此功能,尽管其大小微不足道。

在源代码中,CLI和核心逻辑已经被分为两个包:wavefc-cliwavefc。要创建自己的自定义适配器和编写自己的CLI,我建议使用wavefc-cli源代码作为模板,然后在此基础上构建wavefc类型。在开发过程中,我发现使用Cargo的--release模式构建和运行非常有益。两种模式的构建时间差异可以忽略不计,但实际上在优化模式下折叠速度更快。

程序需要提供宽度和高度以确定输出的大小。您可以随意调整这些值以创建不同形状的输出。请注意,输出的大小越大,函数通常需要的时间越长,因为其自相矛盾的可能性增加。理论上,如果指定的输出大小小于或等于样本的大小,则存在有效的结果。指定的输出大小必须是瓦片大小的乘积。瓦片大小将在下一段中探讨。

尝试与微小样本相比相对较大的瓦片大小

Infinite Collapse Demo

wavefc的版本1和版本2中,仅实现了简单瓦片模型。这严重限制了其“创造性”能力,导致输出相当无聊。在当前版本的算法中,使用了重叠瓦片模型。这产生了更好的输出,在某些情况下也更快。尽管如此,这种模型通常比简单瓦片模型耗时更长。幸运的是,新的重叠逻辑仅仅是原始方法的一个更高级的超集。这意味着,如果您将瓦片大小指定为1,本质上就是在使用简单瓦片模型。

算法选择下一个要折叠的瓦片(叠加)的方式是基于特定位置的信息熵。这是通过计算原始样本中每个可能值的概率来计算的。所有这些共同组成了一个给定叠加的集体熵。

由于算法的顺序性质,wavefc库目前是单线程的。然而,我确实认识到可以通过添加一些多线程来实现许多性能优化。这是项目的长期目标,目前我正在密切关注rayon

CLI有许多标志可以调整程序设置。由于标志太多,无法详细说明,这样做也是徒劳的。然而,通过使用clap库,支持帮助标志以显示所有可用的标志。

在您的代码中使用此项目

您可以通过手动复制其源代码或将它包含在Cargo工作空间中来使用此项目。目前,该包尚未发布到crates.io

熟悉源代码的好地方是wavefc/src/lib.rs,其中包含大部分实际的Wave代码。要将此代码包含在Rust中,请使用前缀与use wavefc::prelude::*;

版权所有 © Zachary Morden 2022

依赖关系

~1.5MB
~29K SLoC