怎么用栈的方法编写道格拉斯-普克算法啊?
答案:2 悬赏:80 手机版
解决时间 2021-11-11 15:39
- 提问者网友:沦陷
- 2021-11-11 04:11
怎么用栈的方法编写道格拉斯-普克算法啊?
最佳答案
- 五星知识达人网友:妄饮晩冬酒
- 2021-11-11 05:00
下面的代码,用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;
}
用到的都是标准的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
...
int rdp_fit( const vector& input, vector
{
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
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.图:
来自:求助得到的回答
全部回答
- 1楼网友:玩世
- 2021-11-11 05:42
楼主能不能告诉我栈是关于那方面的内容吗,我见卷子上有,但不知道是哪个追问数据结构里面的顺序堆栈追答谢谢谢谢
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯