所以我需要使用Graham扫描算法制作一个Convex船体,但我有问题,我得到这种凸起:
void draw_line(Line l, Canvas& canvas) {
canvas.draw_line(l.a, l.b);
}
double drandom(){
return rand() * 1. / RAND_MAX;
}
bool is_convex(const vector<PairXY> vertex){}
void draw_picture(Canvas & canvas) {
vector <PairXY> vertex;
vector <PairXY>:: const_iterator iter = vertex.begin();
srand((unsigned)time(0));
这里我添加了凸起的随机点
for (int i=5;i!=0;i--) {
vertex.push_back(PairXY(drandom()*640,drandom()*480));
}
在这里,我找到了开始的第一个和最低点。
for (int i=0;i!=5;i++) {
if (vertex[i].y > vertex[i+1].y)
vertex.push_back(vertex[i]);
}
在这里,我对所有剩余的点进行排序。
for (int m=1;m!=4;m++){
for (int i=m;i!=5;i++) {
if (vertex[i].x > vertex[i+1].x)
vertex.push_back(vertex[i]);
}
}
vector<PairXY>::const_iterator i=vertex.begin(), j=i;
在这里我绘制凸起。
for(;++i != vertex.end(); j++)
draw_line(Line(*j, *i), canvas);
if (j != vertex.end())
draw_line(Line(*j, *vertex.begin()), canvas);
}
有人可以告诉我我做错了吗?
答案 0 :(得分:0)
您是否检查过您对push_back()的理解?
看起来你认为vertex.push_back(vertex [i])会将元素i移动到结尾。它没有。它将元素的副本推送到顶点。
这是你找到最低y的第一个问题。你的x测试也不会起作用。
也许你可以有两个向量 - 原始的,未经修改的,以及在测试它们之后放置点的工作向量。
我也看不到你在哪里实施格雷厄姆扫描的角度排序......你在这里跳过了吗?
样式问题:你还应该用vector.size()重写循环限制或使用迭代器。