永发信息网

怎么用栈的方法编写道格拉斯-普克算法啊?

答案:2  悬赏:80  手机版
解决时间 2021-11-11 15:39
怎么用栈的方法编写道格拉斯-普克算法啊?
最佳答案
下面的代码,用vector作了一个栈,避免了大数据递归时刻能出现的stack overflow问题;
用到的都是标准的C++ 及STL的东西,VC++下面没有问题。
只是一个演示,很多保护和检验都没有作;
输入数据格式: x y -- 一行; 输出: x0 y0 x1 y1 (x0, y0 - 原始数据;r1, y1-rdp后的数据,一般少于x0,y0的数据)

这只是【代码片段】及输出部分。完整的程序我发到『网盘』上了,提取见『私信』。
...
typedef struct POINT 
{
    double x;
    double y;
} Point;

typedef struct STACKELEMENT
{
    Point point;
    size_t index;
} StackElement;
...
vector rdp_stack;
...
int rdp_fit( const vector& input, vector& output, double epsilon ) 
{
output.resize(0);

    if ( input.empty() ) return -1;    
    
    rdp_stack.resize(0); // clear before using.
    
    // reserve for performance consideration.
    rdp_stack.reserve( input.size() ); 
    output.reserve( input.size() );
 
     // initial start ~ end point for rdp.
    Point start = input.front();
    size_t index_start = 0;
    Point end = input.back();
    size_t index_end = input.size( ) - 1;
    
    // add the first point
    output.push_back( start );

    StackElement stack_element = { end, index_end };

    rdp_stack.push_back( stack_element );

    while ( !rdp_stack.empty() )
    {
        double max_perpendicular_distance = 0.0;
        Point farthest = start;
        size_t index_of_farthest = index_start;

        // find point furthest from line defined by start and end
        for ( size_t i = index_start + 1; i < index_end; ++i )
        {
            const double perpendicular_distance = getDistanceToLine(input[i], start, end);
            if ( perpendicular_distance > max_perpendicular_distance )
            {
               ...
            }
        }

        if ( max_perpendicular_distance <= epsilon )
        {
          ...
        }
        else
        {
          ...
        }
    }
    return 0;
}

int main(int argc, char const *argv[])
{
    double tolerance = 0.02; // hard-coding epilson. <== modify
    char infile[] = "rdp_data.in";  // input file.  <== modify
    char outfile[] = "rdp_data.out"; // output file. <== modify
    vector raw_data, rdp_data;

    loadData(infile, raw_data);    
    int retcode;
    ...
    retcode = rdp_fit(raw_data, rdp_data, tolerance); 
    saveData(outfile, raw_data, rdp_data);
    ...
    return 0;
}

输出:
Data points reduced from 421 downto 19.图:

来自:求助得到的回答

全部回答
楼主能不能告诉我栈是关于那方面的内容吗,我见卷子上有,但不知道是哪个追问数据结构里面的顺序堆栈追答谢谢谢谢
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
人生最幸福的三件事
很困惑的问题 一个认识没多久的相亲男 带着他
圾字的笔划顺序
美国很多法案后面有H.R.再加一个编号,H.R.是
中脉瘦身衣是真的有那么好效果吗?一套六千多
ZBLOG中如何修改<#ZC_BLOG_HOST#> ,或者这个
柳园南动车2701几点到乌鲁木齐
看了一个一梯两户的楼层是17 看的挺好就是担
8吨小吊车品牌排名
申通快递(庆都东路)地址在哪,我要去那里办事
大陆人可以直接在香港银行开户吗
经常会看见妈妈跟别人做那个怎么好呢
媒介匣的相关搜索和下拉推广有什么区别?
重载传动齿轴用什么类型的合金钢?
从宣城出发怎么去徽杭古道?
推荐资讯
北方种植业什么前景最好
祖咏的《望蓟门》中,抒发了作者立功报国的壮
96超白金一代和03黄金一代分别出了哪些球星
怒江名物农业发展有限责任公司怎么样?
白色的像虫子是什么菜?
解不等式:㏒∨3 (3+2x-x²)>㏒∨3 (3x+1
将神如何收集大量紫魂?四象封魔打那个BOSS给
重庆市蟠龙小学到79中怎么走
汪峰代言的这款车广告歌曲叫什么??
魅格烫染工作室地址在哪,我要去那里办事,
一楼风井上玻璃压着我家窗台对风水有影响吗
为什么显卡的HDMI的口和投影仪的HDMI连接投影
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?