# douglas-peucker **Repository Path**: proj4js/douglas-peucker ## Basic Information - **Project Name**: douglas-peucker - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-30 - **Last Updated**: 2025-09-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # douglas-peucker 一个高性能的 Douglas-Peucker 线状要素抽稀算法实现库,支持多种数据格式输入输出。 Douglas-Peucker 算法是一种常用的轨迹点抽稀算法,能够有效减少点序列中的冗余点,在保持原始形状特征的同时显著降低数据量。 ## 特性 - 🚀 **高性能**: 采用非递归优化实现,避免栈溢出风险 - 📦 **多格式支持**: 支持平铺数组 `[x, y, x, y, ...]` 和坐标对数组 `[[x, y], [x, y], ...]` 两种格式 - ⚙️ **灵活配置**: 支持自定义容差值和高精度计算模式 - 🌐 **TypeScript 支持**: 完整的 TypeScript 类型定义 - 📦 **现代化构建**: 支持 CommonJS 和 ES Module 两种模块格式 ## 安装 ```bash npm install douglas-peucker ``` ## 使用方法 ### 基本用法 ```typescript import { simplify } from 'douglas-peucker'; // 使用平铺数组格式(推荐,性能最佳) const points = new Float32Array(10000); for (let i = 0; i < points.length; i++) { points[i] = Math.random() * 1000; } const simplified = simplify(points, { tolerance: 1.0 }); // 使用普通数组格式 const pointsArray = [0, 0, 1, 1, 2, 2, 3, 3, 4, 4]; const simplifiedArray = simplify(pointsArray, { tolerance: 1.0 }); // 使用坐标对数组格式 const pointPairs = [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4]]; const simplifiedPairs = simplify(pointPairs, { tolerance: 1.0 }); ``` ### 配置选项 ```typescript const options = { tolerance: 1.0, // 容差值,默认为 1.0 highQuality: false // 是否启用高精度计算,默认为 false }; const simplified = simplify(points, options); ``` ### 在浏览器中使用 ```html ``` ## API ### `simplify(coords, options?)` 对坐标序列进行 Douglas-Peucker 算法简化 #### 参数 - `coords`: 坐标数组,支持以下三种格式: - Float32Array: `new Float32Array([x, y, x, y, ...])` (性能最佳) - 普通数组: `[x, y, x, y, ...]` - 坐标对数组: `[[x, y], [x, y], ...]` - `options` (可选): 配置对象 - `tolerance`: 简化容差值,默认为 `1.0` - `highQuality`: 是否保留最高精度,默认为 `false` #### 返回值 简化后的坐标数组,格式与输入保持一致。 ## 性能优化建议 为了获得最佳性能,建议: 1. 使用 `Float32Array` 类型存储坐标数据 2. 预分配数组大小避免动态扩容 3. 对于大量数据处理,考虑使用 Web Workers ```typescript // 推荐的高性能用法 const coords = new Float32Array(10000); for (let i = 0; i < coords.length; i++) { coords[i] = Math.random() * 1000; } const simplified = simplify(coords, { tolerance: 1.0 }); ``` ## 算法原理 Douglas-Peucker 算法是一种递归算法,其基本思想是: 1. 连接首尾两点形成一条直线段 2. 计算所有点到该直线段的距离 3. 找到距离最大的点 4. 如果最大距离大于给定阈值,则保留该点,并对两侧分别递归执行算法 5. 否则,只保留首尾两点 本实现采用非递归优化版本,使用显式栈替代递归调用,提高了性能并避免了栈溢出问题。 ## 性能特点 - 使用位运算优化索引计算 - 预分配内存避免频繁 GC - 提前终止条件判断 - 高效的距离计算算法 - Float32Array 数据类型优化内存使用和访问速度 ## 许可证 MIT