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

wavefc

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

7个稳定版本

3.1.6 2022年12月5日
3.0.0 2022年11月30日

算法 中排名 574

每月下载量 39
wavefc-cli 中使用

MIT 协议

67KB
1.5K SLoC

波函数坍缩

Rust Crates.io

字符映射演示

Character Map Demo

概述

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

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

本项目遵循 license.txt 文件中描述的 MIT 许可协议。

快速设置

对于不熟悉Rust且只想从源码构建项目的用户,您来到了正确的位置。要开始,请在 rustup.rs 安装Rust工具链。

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

这不是Rust语言或Cargo的教程。因此,请查阅他们在 rust-lang.org 提供的优秀资源和文档。

讨论

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

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

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

尝试相对于微小的样本一个相对较大的瓦片大小

Infinite Collapse Demo

wavefc的版本1和版本2中,仅实现了算法的简单瓦片模型。这严重限制了其“创意”能力,产生了相当单调的输出。在当前版本的算法中,使用重叠瓦片模型。这产生了更好的输出,并且在某些情况下也更快。尽管如此,这种模型通常比简单瓦片模型需要更长的时间。幸运的是,新的重叠逻辑只是原始方法的一个更高级的子集。这意味着,通过指定瓦片大小为1,您实际上是在使用简单瓦片模型。

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

由于算法的顺序性质,wavefc库目前是单线程的。然而,我确实认识到可以通过添加一些多线程来提高很多性能优化。这是项目的长期目标,目前我经常关注rayon这个特定的项目。

CLI有一系列标志可以调整程序设置。详细说明太多了,而且这样做也没有意义。然而,通过使用clap库,支持帮助标志以显示所有可用的标志列表。

在您的代码中使用此项目

此项目在crates.io上有两个包:wavefcwavefc-cli。如果您只想尝试程序,wavefc-cli可能是您的最佳选择来安装。如果您想在您的代码中使用此算法,只需将wavefc添加到您的Cargo.toml中即可。作为替代方案,您可以通过手动复制其源代码或在Cargo工作空间中包含它来使用此项目。

要熟悉源代码的好地方是 wavefc/src/lib.rs,它包含了大多数实际的 Wave 代码。要在 Rust 中包含此代码,请使用 use wavefc::prelude::*; 预导入。

版权所有 © Zachary Morden 2022

依赖项

~0.6–1MB
~18K SLoC