抽稀概化算法之--------Douglas-Peucker(道格拉斯- 普克法算法)和Visvalingam-Whyatt算法

本文介绍了Douglas-Peucker算法和Visvalingam-Whyatt算法,用于在给定距离或面积阈值下对数据点进行抽稀,以提高数据可视化和处理效率。Douglas-Peucker算法以距离为基础,Visvalingam-Whyatt算法强调保持几何特性。
摘要由CSDN通过智能技术生成
function douglasPeucker(points, tolerance) {
  // 找到最高的点
  let maxDistance = 0;
  let maxIndex = 0;
  const end = points.length - 1;
  
  for (let i = 1; i < end; i++) {
    const distance = perpendicularDistance(points[i], points[0], points[end]);
    
    if (distance > maxDistance) {
      maxDistance = distance;
      maxIndex = i;
    }
  }
  
  // 如果最高点距离大于容差值,则进行递归处理
  if (maxDistance > tolerance) {
    const leftPoints = points.slice(0, maxIndex + 1);
    const rightPoints = points.slice(maxIndex);
    
    return douglasPeucker(leftPoints, tolerance).concat(douglasPeucker(rightPoints, tolerance));
  }
  
  // 如果最高点距离小于容差值,则返回最高点
  return [points[0], points[end]];
}

// 计算点到直线的垂直距离
function perpendicularDistance(point, start, end) {
  const { x: x1, y: y1 } = start;//解构赋值x,y坐标
  const { x: x2, y: y2 } = end;
  const { x: x, y: y } = point;
  
  const numerator = Math.abs((y2 - y1) * x - (x2 - x1) * y + x2 * y1 - y2 * x1);
  const denominator = Math.sqrt(Math.pow(y2 - y1, 2) + Math.pow(x2 - x1, 2));
  
  return numerator / denominator;
}

使用实例:

const points = [
  { x: 1, y: 2 },
  { x: 3, y: 4 },
  { x: 5, y: 6 },
  // 更多数据点...
];

const tolerance = 1; // 容差值

const simplifiedPoints = douglasPeucker(points, tolerance);
console.log(simplifiedPoints);

这是一个基本的实现,你可以根据自己的需求进行修改和优化。

代码示范二:

/**
 * @author CSH
 * @function 函数功能:Douglas-Peucker抽稀算法,通过距离阈值控制(非递归)
 * @param {object} point   [点数组]
 * @param {Number} epsilon [阈值]
 */
function nonRecursionDPDistance(point, epsilon) {
  /* 创建栈 */
  var stack = [{start: 0, end: point.length - 1}];
  var sim
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值