# gl-marching-squares
**Repository Path**: rolldown/gl-marching-squares
## Basic Information
- **Project Name**: gl-marching-squares
- **Description**: 高性能等值线提取库,基于Marching Squares算法实现,支持ESM、CJS和IIFE多种模块格式,适用于WebGL可视化、科学数据展示等场景。
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2025-10-10
- **Last Updated**: 2025-11-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# gl-marching-squares
高性能等值线提取库,基于Marching Squares算法实现,支持ESM、CJS和IIFE多种模块格式,适用于WebGL可视化、科学数据展示、地理信息系统及图像处理等场景。
## 核心特性
- **多模块兼容**:同时提供ESM(现代前端)、CJS(Node.js)和IIFE(浏览器全局)格式,适配各种开发环境
- **极致性能**:
- 稀疏网格优化(跳过空白区域,稀疏数据场景提速50%-80%)
- 预分配内存(避免动态扩容开销)
- 原生支持Float32Array(减少内存占用,提升CPU缓存命中率)
- **灵活控制**:通过`enableClosing`参数控制等值线闭合,支持自定义精度阈值
- **图像处理支持**:原生兼容`ImageData`格式,可直接从图像中提取轮廓
- **类型安全**:完整TypeScript类型定义,提供IDE自动补全和编译时校验
- **批量处理**:`generateMultiContours`方法高效生成多阈值等值线
## 安装方式
### 1. 包管理工具(ESM/CJS)
适用于Node.js或前端项目(Webpack/Vite/Rollup):
```bash
# npm
npm install gl-marching-squares --save
# yarn
yarn add gl-marching-squares
```
### 2. 浏览器直接引入(IIFE)
适用于无构建流程的浏览器项目,库会暴露为全局变量`glmarchingsquares`:
```html
```
## 快速使用示例
### 1. 基础网格等值线提取
```typescript
import { generateContour, convertToFloat32Array } from 'gl-marching-squares';
// 定义2D网格数据
const grid = [
[0, 1, 0, 1, 0],
[1, 2, 1, 2, 1],
[0, 1, 0, 1, 0],
[1, 2, 1, 2, 1],
[0, 1, 0, 1, 0]
];
// 转换为高性能格式
const { data, width, height } = convertToFloat32Array(grid);
// 生成等值线
const contours = generateContour(data, width, height, 1, {
enableClosing: true
});
```
### 2. 从图像数据(ImageData)提取轮廓
```typescript
import { generateContour, convertImageDataToGrid } from 'gl-marching-squares';
// 从Canvas获取图像数据
const canvas = document.getElementById('sourceCanvas');
const ctx = canvas.getContext('2d');
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
// 转换为网格数据(使用灰度通道)
const { data, width, height } = convertImageDataToGrid(imageData, 'gray');
// 生成等值线(阈值128,中等亮度区域)
const contours = generateContour(data, width, height, 128, {
enableClosing: true,
enableSparse: true
});
// 在Canvas上绘制结果
const targetCtx = document.getElementById('targetCanvas').getContext('2d');
contours.forEach(([[x1, y1], [x2, y2]]) => {
targetCtx.beginPath();
targetCtx.moveTo(x1, y1);
targetCtx.lineTo(x2, y2);
targetCtx.stroke();
});
```
### 3. 浏览器全局变量使用(IIFE)
```html
```
## API 文档
### 数据转换函数
#### `convertToFloat32Array(grid: number[][]): ConvertResult`
将二维数组转换为行优先的Float32Array格式。
#### `convertImageDataToGrid(imageData: ImageData, channel?: 'gray'|'r'|'g'|'b'|'a'): ConvertResult`
将Canvas图像数据转换为网格数据:
- `imageData`:从Canvas获取的图像数据对象
- `channel`:指定提取的通道(默认`'gray'`)
- `'gray'`:灰度值(0.299*R + 0.587*G + 0.114*B)
- `'r'|'g'|'b'|'a'`:分别对应RGBA通道
### 等值线生成函数
#### `generateContour(data: Float32Array, width: number, height: number, threshold: number, options?: ContourOptions): ContourResult`
生成单个阈值的等值线。
| 参数 | 类型 | 描述 |
|-------------|-----------------|-------------------------------|
| `data` | `Float32Array` | 网格数据(转换函数的输出) |
| `width` | `number` | 网格宽度 |
| `height` | `number` | 网格高度 |
| `threshold` | `number` | 等值线阈值 |
| `options` | `ContourOptions`| 可选配置参数 |
**配置参数**:
```typescript
interface ContourOptions {
skipValidation?: boolean; // 跳过数据验证(默认false)
returnFloat32?: boolean; // 返回扁平Float32Array(默认false)
epsilon?: number; // 插值精度(默认1e-6)
enableSparse?: boolean; // 启用稀疏优化(默认true)
enableClosing?: boolean; // 启用等值线闭合(默认false)
closingEpsilon?: number; // 闭合匹配精度(默认与epsilon一致)
}
```
#### `generateMultiContours(data: Float32Array, width: number, height: number, thresholds: number[], options?: ContourOptions): Record`
批量生成多阈值等值线,复用预处理结果提升效率。
## 图像处理应用场景
1. **医学影像**:从CT/MRI图像提取器官轮廓
2. **遥感分析**:卫星图像的地形等高线提取
3. **计算机视觉**:物体边缘检测与区域分割
4. **图像编辑**:智能选区与边缘高亮
处理图像时建议:
- 高分辨率图像先缩小尺寸提升性能
- 纯色背景图像启用`enableSparse: true`
- 阈值选择参考图像亮度范围(0-255)
## 性能对比
在**1000x1000密集网格**上的测试结果(Intel i7-13700K + Chrome 126):
| 库名称 | 基础提取耗时(ms) | 启用闭合耗时(ms) | 内存占用(MB) |
|------------------------|-------------------|--------------------|----------------|
| gl-marching-squares | 24.3 | 28.6 | 3.2 |
| 社区增强版Marching Squares | 89.2 | 128.4 | 9.5 |
| npm `marchingsquares` | 215.6 | 不支持 | 18.7 |
*稀疏网格场景(80%空白区域):gl-marching-squares比同类库快3-5倍*
## 兼容性
| 模块格式 | 支持环境 |
|----------|-------------------------------------------|
| ESM | Node.js 14+、Chrome 61+、Firefox 60+、Safari 11+ |
| CJS | Node.js 8+ |
| IIFE | IE 11+及所有现代浏览器(无需构建工具) |
## 许可证
[MIT License](LICENSE)