一、算法原理

Douglas-Peucker算法

在数字化过程中,需要对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度

上保持原有的形状。

经典的Douglas-Peucker算法描述如下:

(1)在曲线首尾两点A,B之间连接一条直线AB,该直线为曲线的弦;

(2)得到曲线上离该直线段距离最大的点C,计算其与AB的距离D;

(3)比较该距离与预先给定的阈值threshold的大小,如果小于threshold,则该直线段作为曲线的近似,该段曲线处理完毕。

(4)如果距离大于阈值,则用C将曲线分为两段AC和BC,并分别对两段取信进行1~3的处理。

(5)当所有曲线都处理完毕时,依次连接各个分割点形成的折线,即可以作为曲线的近似。

二、算法C#实现

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication2
{
public struct cvPoint
{
public int X;
public int Y;
public cvPoint(int x, int y)
{
X = x;
Y = y;
}
}
class Program
{
static void Main(string[] args)
{
var points = new List<cvPoint>();
points.Add(new cvPoint(, ));
points.Add(new cvPoint(, ));
points.Add(new cvPoint(, ));
points.Add(new cvPoint(, ));
points.Add(new cvPoint(, ));
points.Add(new cvPoint(, ));
points.Add(new cvPoint(, ));
points.Add(new cvPoint(, ));
points.Add(new cvPoint(, ));
points.Add(new cvPoint(, ));
var epsilon = 0.8d;
var filteredPoints = new List<cvPoint>();
DouglasPeucker(points, epsilon, ref filteredPoints);
Console.WriteLine("Filtered points:");
foreach (var f in filteredPoints)
{
Console.WriteLine(string.Format("{0},{1}", f.X, f.Y));
}
Console.ReadKey();
}
private static double distanceToSegment(cvPoint p, cvPoint start, cvPoint end)
{
var m1 = ((double)(end.Y - start.Y)) / ((double)(end.X - start.X));
var c1 = start.Y - m1 * start.X;
var interPointX = 0d;
var interPointY = 0d;
if (m1 == )
{
interPointX = p.X;
interPointY = c1; }
else
{
var m2 = - / m1;
var c2 = p.Y - m2 * p.X;
interPointX = (c1 - c2) / (m2 - m1);
interPointY = m2 * interPointX + c2;
}
return Math.Sqrt(Math.Pow(p.X - interPointX, ) + Math.Pow(p.Y - interPointY, ));
} private static void DouglasPeucker(IList<cvPoint> PointList, double epsilon, ref List<cvPoint> filteredPoints)
{
var dmax = 0d;
int index = ;
int length = PointList.Count;
for (int i = ; i < length - ; i++)
{
var d = distanceToSegment(PointList[i], PointList[], PointList[length - ]);
Console.WriteLine(string.Format("{0}.distence:{1}", i, d));
if (d > dmax)
{
index = i;
dmax = d;
}
}
Console.WriteLine(string.Format("dMax:{0}", dmax));
// If max distance is greater than epsilon, recursively simplify
if (dmax > epsilon)
{
filteredPoints.Add(PointList[]);
filteredPoints.Add(PointList[index]);
filteredPoints.Add(PointList[length - ]);
DouglasPeucker(PointList.Take(index + ).ToList(), epsilon, ref filteredPoints);
DouglasPeucker(PointList.Skip(index + ).Take(PointList.Count - index - ).ToList(), epsilon, ref filteredPoints);
}
}
}
}

三、算法验证
近似前:

近似后的线段:

本文地址: http://www.cnblogs.com/deepleo/p/Douglas-Peucker.html

参考:http://www.codeproject.com/Articles/18936/A-C-Implementation-of-Douglas-Peucker-Line-Approxi

Douglas Peucker算法的C#实现的更多相关文章

  1. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  2. 盘点十大GIS相关算法

    1.道格拉斯-普克算法(Douglas–Peucker) 道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲 ...

  3. GIS原理学习目录

    GIS原理学习目录 内容提要 本网络教程是教育部“新世纪网络课程建设工程”的实施课程.系统扼要地阐述地理信息系统的技术体系,重点突出地理信息系统的基本技术及方法. 本网络教程共分八章:第一章绪论,重点 ...

  4. 利用道格拉斯·普客法(DP法)压缩矢量多边形(C++)

    1.算法描述 经典的Douglas-Peucker算法(简称DP法)描述如下: (1)在曲线首尾两点A,B之间连接一条直线AB,该直线为曲线的弦: (2)得到曲线上离该直线段距离最大的点C,计算其与A ...

  5. 道格拉斯—普克(Douglas一Peukcer)节点抽稀算法

    Douglas一Peukcer算法由D.Douglas和T.Peueker于1973年提出,简称D一P算法,是眼下公认的线状要素化简经典算法.现有的线化简算法中,有相当一部分都是在该算法基础上进行改进 ...

  6. OOP: One pont of view of OOP与基于算法设计的区别

    ..摘自<C++网络编程 卷1:运用ACE和模式消除复杂性> <C++ Network Programming Volume 1 Mastering Complexity with ...

  7. 推些C语言与算法书籍

    c语言系统学习与进阶: 1. C primer plus C primer plus 作为一本被人推崇备至的 c 入门经典,C primer plus 绝非浪得虚名.应该 算得上 C 教材里最好的入门 ...

  8. 每周荐书:云原生、Docker、Web算法(评论送书)

    每周荐书:云原生.Docker.Web算法(评论送书) 感谢大家对每周荐书栏目的支持,先公布下上周中奖名单 名优秀评论可以免费获得此书.   云原生应用架构实践 云原生架构,关注简化开发流程.提升研发 ...

  9. 图像处理之增强---图像增强算法四种,图示与源码,包括retinex(ssr、msr、msrcr)和一种混合算法

    申明:本文非笔者原创,原文转载自:http://blog.csdn.net/onezeros/article/details/6342661 两组图像:左边较暗,右边较亮 第一行是原图像,他们下面是用 ...

随机推荐

  1. 使用FindBugs-IDEA插件找到代码中潜在的问题

    另一篇使用文档,参照:https://www.cnblogs.com/huaxingtianxia/p/6703315.html 我们通常都会在APP上线之后,发现各种错误,尤其是空指针异常,这些错误 ...

  2. MongoDB简介以及下载安装

    什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.运行稳定,性能高 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在 ...

  3. Python学习笔记 - day1 - 概述及安装

    Python概述 Python是一种计算机程序设计语言.我们平时已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合网页编程的JavaScript语言等等. Python ...

  4. python常用模块补充hashlib configparser logging,subprocess模块

    一.hashlib模板 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定 ...

  5. SuSE Linux10.1 网络设置以及和主机通信

    SuSE Linux10.1 网络设置以及和主机通信 http://www.cnblogs.com/kevintian/articles/1086994.html 在VMWare上安装好SuSE之后, ...

  6. SQL Server数据库优化笔记

    不定时更新 select DateDiff(month,'2018-06-07',GETDATE()) PACTBEGINDATE ORDER BY PACTBEGINDATE ASC),GETDAT ...

  7. python ajax post 数据

    简单的html <div> <input type="submit" id="tes" value="tes"> & ...

  8. KDJ金叉测试

    # -*- coding: utf-8 -*- import os import pandas as pd # ========== 遍历数据文件夹中所有股票文件的文件名,得到股票代码列表stock_ ...

  9. yum,httpd,php环境搭建方法

    #删除已有的yum 1  rpm -qa|grep yum|xargs rpm -e --nodeps 2  ls 3  rpm -ivh python-iniparse-0.3.1-2.1.el6. ...

  10. python的property的用法

    假设定义了一个类:C,该类必须继承自object类,有一私有变量_xclass C: def __init__(self): self.__x=None 1.现在介绍第一种使用属性的方法: 在该类中定 ...