【问题标题】:C++ Convex hull using Graham scan algorithm使用格雷厄姆扫描算法的 C++ 凸包
【发布时间】:2012-01-14 13:47:24
【问题描述】:

所以我需要使用格雷厄姆扫描算法制作一个凸包,但我有问题,我得到了这个有点凸:

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);

}

谁能告诉我我做错了什么?

【问题讨论】:

    标签: c++ convex-hull grahams-scan


    【解决方案1】:

    您是否了解过 push_back() 的作用?

    您似乎认为 vertex.push_back(vertex[i]) 会将元素 i 移动到最后。它没有。它将元素的副本推送到顶点。

    这是您找到最低 y 的第一个问题。你的 x 测试也不行。

    也许您可以有两个向量 - 原始的、未修改的,以及您在测试它们后放置点的工作向量。

    我也没有看到您在哪里实现按角度排序的 Graham 扫描...您在这里跳过了对吗?

    样式问题:您还应该根据 vector.size() 重写循环限制或使用迭代器。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多