您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    两种曲线点抽稀算法-Python完成 附代码
    时间:2017-08-21 21:56 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    【51CTO活动】8.26 带你与清华大学、搜狗、京东大咖们一同讨论基于算法的IT运维实际

    何为抽稀

    在处置矢量化数据时,记载中往往会有很多反双数据,对进一步数据处置带来诸多不便。多余的数据一方面糜费了较多的存储空间,另一方面形成所要表达的图形不润滑或不契合标准。因此要经过某种规则,在保证矢量曲线外形不变的状况下, 最大限制地减少数据点个数,这个进程称为抽稀。

    深刻的讲就是对曲线停止采样简化,即在曲线上取有限个点,将其变为折线,并且可以在一定水平保持原有外形。比较常用的两种抽稀算法是:道格拉斯-普克(Douglas-Peuker)算法和垂距限值法。

    道格拉斯-普克(Douglas-Peuker)算法

    Douglas-Peuker算法(DP算法)进程如下:

    衔接曲线首尾两点A、B;

    依次计算曲线上一切点到A、B两点所在曲线的距离;

    计算最大距离D,假设D小于阈值threshold,则去掉曲线上出A、B外的一切点;假设D大于阈值threshold,则把曲线以最大距离联系成两段;

    对一切曲线分段重复1-3步骤,知道一切D均小于阈值。即完成抽稀。

    这种算法的抽稀精度与阈值有很大关系,阈值越大,简化水平越大,点增加的越多;反之简化水平越低,点保留的越多,外形也越趋于原曲线。

    下面是Python代码完成:

    # -*- coding: utf-8 -*- 

    ""

    ------------------------------------------------- 

      File Name:    DouglasPeuker 

      Description :  道格拉斯-普克抽稀算法 

      Author :        J_hao 

      date:          2017/8/16 

    ------------------------------------------------- 

      Change Activity: 

                      2017/8/16: 道格拉斯-普克抽稀算法 

    ------------------------------------------------- 

    ""

    from __future__ import division 

     

    from math import sqrt, pow 

     

    __author__ = 'J_hao' 

     

    THRESHOLD = 0.0001  # 阈值 

     

     

    def point2LineDistance(point_a, point_b, point_c): 

        ""

        计算点a到点b c所在直线的距离 

        :param point_a: 

        :param point_b: 

        :param point_c: 

        :return

        ""

        # 首先计算b c 所在直线的斜率和截距 

        if point_b[0] == point_c[0]: 

            return 9999999 

        slope = (point_b[1] - point_c[1]) / (point_b[0] - point_c[0]) 

        intercept = point_b[1] - slope * point_b[0] 

     

        # 计算点a到b c所在直线的距离 

        distance = abs(slope * point_a[0] - point_a[1] + intercept) / sqrt(1 + pow(slope, 2)) 

        return distance 

     

     

    class DouglasPeuker(object): 

        def __init__(self): 

            self.threshold = THRESHOLD 

            self.qualify_list = list() 

            self.disqualify_list = list() 

     

        def diluting(self, point_list): 

            ""

            抽稀 

            :param point_list:二维点列表 

            :return

            ""

            if len(point_list) < 3: 

                self.qualify_list.extend(point_list[::-1]) 

            else

                # 找到与收尾两点连线距离最大的点 

                max_distance_index, max_distance = 0, 0 

    (责任编辑:admin)