c++蛮力法写凸包问题可视化
时间: 2023-08-29 21:13:30 浏览: 155
以下为蛮力法求凸包的C++代码及可视化部分的实现:
```c++
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <graphics.h>
using namespace std;
struct Point {
double x, y;
bool operator < (const Point& p) const {
return x < p.x || (x == p.x && y < p.y);
}
};
vector<Point> convex_hull(vector<Point>& points) {
int n = points.size();
if (n <= 1) return points;
sort(points.begin(), points.end());
vector<Point> hull;
for (int i = 0; i < n; i++) {
while (hull.size() >= 2 && (hull.back().x - hull[hull.size()-2].x)*(points[i].y - hull.back().y) >= (hull.back().y - hull[hull.size()-2].y)*(points[i].x - hull.back().x)) {
hull.pop_back();
}
hull.push_back(points[i]);
}
return hull;
}
int main() {
vector<Point> points = {{100, 100}, {200, 50}, {300, 150}, {150, 200}, {250, 250}, {150, 300}, {50, 250}, {100, 150}};
initwindow(500, 500, "Convex Hull");
setbkcolor(WHITE);
cleardevice();
setcolor(BLACK);
for (int i = 0; i < points.size(); i++) {
circle(points[i].x, points[i].y, 3);
delay(100);
}
vector<Point> hull = convex_hull(points);
setcolor(RED);
for (int i = 0; i < hull.size(); i++) {
line(hull[i].x, hull[i].y, hull[(i+1)%hull.size()].x, hull[(i+1)%hull.size()].y);
delay(100);
}
while (!kbhit()) {
delay(200);
}
closegraph();
return 0;
}
```
其中,`Point` 结构体表示点的坐标,`convex_hull` 函数计算蛮力法求解凸包,`main` 函数中的 `vector<Point> points` 表示所有的点坐标。可视化部分使用了 `graphics.h` 库,首先使用 `initwindow` 函数初始化窗口,然后使用 `setcolor` 函数设置颜色,使用 `circle` 函数画出所有的点,使用 `line` 函数画出凸包。`delay` 函数用于延迟一定时间,以便观察过程。最后,使用 `kbhit` 函数等待按键,按下任意键后关闭窗口。
阅读全文