项目简介
本项目致力于实现一个基于WebAssembly的矩形排样算法,以解决二维矩形装箱问题。此问题在工业领域意义重大,目标是将一系列矩形高效打包到给定大小的二维箱子中,从而最小化箱子数量并提高利用率。项目借助C++库RectangleBinPack
,利用WebAssembly技术将其集成到Web环境,提供了高效、跨平台的解决方案。
项目的主要特性和功能
- 多种算法支持:涵盖货架算法、断头台算法、最大矩形算法和天际线算法。
- WebAssembly集成:通过Emscripten把C++库编译为WebAssembly,实现跨平台运行,并提供TypeScript描述文件,方便前端开发者使用。
- 内存管理:手动管理内存,保障WebAssembly模块稳定运行。
- Demo展示:提供在线Demo,展示矩形排样的实际效果。
安装使用步骤
环境准备
- 操作系统:推荐使用Linux系统,Windows用户可尝试WSL。
- 安装Emscripten:参考Emscripten官方文档进行安装。
- 安装Node.js及相关工具:确保安装了Node.js以及常用的前端开发工具。
项目结构
shell
.
├── XXXX.cpp # 算法实现的C++源文件
├── XXXX.h # 算法实现的头文件
├── Warp.cc # 用于描述需要导出的类和函数的Warp文件
├── compile.sh # 编译脚本
├── package.json # 用于发布到npm仓库的配置文件
编译Wasm
- 编写Warp文件:在
Warp.cc
文件中,使用Emscripten的Binding机制导出C++类和函数。 - 执行编译脚本:运行
compile.sh
脚本,将C++代码编译为WebAssembly。shell emcc --bind -Oz Warp.cc -o dist/Warp.js \ -s WASM=1 \ -s MODULARIZE=1
生成TypeScript描述文件
- 使用tsembind工具:运行以下命令生成TypeScript描述文件。
shell tsembind ./dist/Warp.js > ./dist/Warp.d.ts
- 修改导出部分:根据需要修改生成的
Warp.d.ts
文件,确保其符合项目需求。
使用Wasm
- 加载Wasm模块:在前端代码中加载Wasm模块,并指定Wasm文件的URL。 ```typescript import type { RectangleBinPackModule as PackModule } from 'rectanglebinpack-wasm' import PackWasmInit from 'rectanglebinpack-wasm'; import PackWasm from 'rectanglebinpack-wasm/dist/Warp.wasm?url'
const toEnumValue = (enumObj: any, value: any) => enumObj[value]
export class WasmPackService implements IPackService { private wasm?: PackModule;
constructor() {
PackWasmInit({
locateFile: (url) => url.endsWith('.wasm') ? PackWasm : url
}).then(wasm => {
this.wasm = wasm;
})
}
public async pack(source: SourcePanelItem[], target: TargetPanelItem[], algorithms: Algorithms, setting: Record
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】