道格拉斯-普克算法(JavaScript实现)
需求:
有时候当移动速度很慢,GPS定位的轨迹点就非常的多,这时候为了缩减数据量,需要将不突出的点去掉。
思路:
(1) 在曲线首尾两点间虚连一条直线,求出其余各点到该直线的距离。
这里使用道格拉斯-普克算法实现,易于理解。效果对比图如下:

源代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>DouglasPeucker</title>
</head>
<body>
<canvas id="drawing" style="height:300px;width:100%"></canvas>
<canvas id="drawing2" style="height:300px;width:100%"></canvas>
</body>
<script type="text/javascript" > var points1=[];
var pointsshao=[];
var pts=[];
var hval=30;//阈值 //随机生成1000个点
for(var i=0;i<1000;i++){
var oldx=i*10,oldy=Math.random()*150;
points1.push([oldx,oldy,i]);
} //求斜率
function xielv(pt1,pt2)
{
var k,b;
var canshu={};
canshu.k=(pt1[1]-pt2[1])/(pt1[0]-pt2[0]);
canshu.b=pt1[1]-canshu.k*pt1[0];
return canshu;
}
//求点到直线的距离
function distanceToline(pt,cs){
return (Math.abs(cs.k*pt[0]-pt[1]+cs.b))/Math.sqrt(cs.k*cs.k+1);
} //开始计算(道格拉斯普克算法)
pts.push(points1[0]);
countPoint(points1);
pts.push(points1[points1.length-1]); //排序
function sort(pts){
for(var i=0;i<pts.length-1;i++)
{
var a=pts[i];
var b=pts[i+1];
if(b[2]>a[2]){
pts[i]=b;
pts[i+1]=a;
for(var j=i;j>0;j--)
{
var c=pts[j-1];
if(b[2]>c[2]){
pts[j-1]=b;
pts[j]=c;
}
}
}
}
}
//对坐标点进行取舍
function countPoint(points){ var maxD=0;
var maxPoint=null;
var maxindex=0;
//大于2个点才开始计算
if(points.length>2){
var pt1=points[0];
var pt2=points[points.length-1];
var cs=xielv(pt1,pt2);
for(var i=0;i<points.length;i++){
var pt=points[i];
var dis=distanceToline(pt,cs);
//判断该线段中是否有点到由该线段端点组成的直线的距离大于限值
if(dis>maxD)
{
maxD=dis;
maxPoint=pt;
maxindex=i;
}
}
if(maxD>hval) //如果最大值就从该点位置将线段进行切分
{
var pts1=points.slice(maxindex);//中分末尾数组
var pts2=points.slice(0,maxindex+1);//中分前面数组
if(pts1.length>2 && pts2.length>2)
{
if(!countPoint(pts1) && !countPoint(pts2)){ //如果两个线段都没有超过限制就结束计算
pts.push(maxPoint);
}
}else if(pts1.length>2 && pts2.length<=2){ //计算pts1
if(!countPoint(pts1))pts.push(maxPoint); }else if(pts1.length<=2 && pts2.length>2){ //计算pts2
if(! countPoint(pts2))pts.push(maxPoint); }
} return false;
}
}
//由大到小
sort(pts);
drawWay("drawing2",pts);
drawWay("drawing",points1)
//绘制曲线
function drawWay(name,points){
var drawing=document.getElementById(name);
if(drawing.getContext){
var context=drawing.getContext("2d");
context.beginPath();
var oldx=points[0][0];
var oldy=points[0][1];
for(var i=0;i<points.length;i++){
var p=points[i];
context.moveTo(oldx,oldy);
oldx=p[0];
oldy=p[1];
context.lineTo(oldx,oldy);
}
context.closePath();
context.stroke();
}
}
</script>
道格拉斯-普克算法(JavaScript实现)的更多相关文章
- OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...
- GIS矢量数据化简:一种改进的道格拉斯-普克算法以及C++实现
GIS领域的同志都知道,传统的道格拉斯-普克算法都是递归实现.然而有时候递归的层次太深的话会出现栈溢出的情况.在此,介绍一种非递归的算法. 要将递归算法改为非递归算法,一般情况下分为两种场景.第一种是 ...
- 道格拉斯—普克(Douglas一Peukcer)节点抽稀算法
Douglas一Peukcer算法由D.Douglas和T.Peueker于1973年提出,简称D一P算法,是眼下公认的线状要素化简经典算法.现有的线化简算法中,有相当一部分都是在该算法基础上进行改进 ...
- .net中使用 道格拉斯-普特 抽希轨迹点
Douglas一Peukcer算法由D.Douglas和T.Peueker于1973年提出,简称D一P算法,是目前公认的线状要素化简经典算法.现有的线化简算法中,有相当一部分都是在该算法基础上进行改进 ...
- 数据结构与算法JavaScript (一) 栈
序 数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录 ...
- 《数据结构与算法JavaScript描述》
<数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9 ...
- 翻阅《数据结构与算法javascript描述》--数组篇
导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
- 数据结构与算法javascript描述
<数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...
- 列表的实现-----数据结构与算法JavaScript描述 第三章
实现一个列表 script var booklist = new List(); booklist.append('jsbook'); booklist.append('cssbook'); book ...
随机推荐
- 在对文件进行随机读写,RandomAccessFile类,如何提高其效率
花1K内存实现高效I/O的RandomAccessFile类 JAVA的文件随机存取类(RandomAccessFile)的I/O效率较低.通过分析其中原因,提出解决方案.逐步展示如何创建具备缓存读写 ...
- JavaScript 拖曳和居中问题
今天遇到了一个问题,是这样的,有一个div盒子,实现盒子居中,居中的样式是这样的见下 #box{ width:300px; height:150px; position:absolute; left: ...
- 【CSS3 + 原生JS】移动的标签
左图为本博客右侧截取的GIF图,右图为代码效果 HTML: <!DOCTYPE html> <html lang="en"> <head> &l ...
- Python--day20--序列化模块
序列化:转向一个字符串数据类型 序列 ———— 字符串 序列化和反序列化的概念: 序列化三种方法:json pickle shelve json模块:json模块提供了四个方法dumps和load ...
- H3C PPP显示与调试
- 【知识小结】Git 个人学习笔记及心得
https://mp.weixin.qq.com/s/D96dXYfu3XAA4ac456qo0g git架构 工作区:就是你在电脑里能看到的目录. 版本库:工作区有一个隐藏目录.git,,而是Git ...
- 立足GitHub学编程:13个不容错过的Java项目
立足GitHub学编程:13个不容错过的Java项目 今天我们将整理一大波干货满满的Java示例代码与能力展示素材. GitHub可谓一座程序开发的大宝库,有些素材值得fork,有些则能帮助我们改进自 ...
- 洛谷P1595 信封问题 题解 错排问题
作者:zifeiy 标签:排列组合,错排问题 题目链接:https://www.luogu.org/problem/P1595 题目描述:某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都 ...
- H3C 路由表查找规则(2)
- H3C DHCP中继配置示例