#include #include #include #include #include #include #include #include #include #include #include "Point.h" // constants static const int SCENE_WIDTH = 512; static const int SCENE_HEIGHT = 512; void render_points(QGraphicsScene* scene, const vector& points) { for(const auto& point : points) { point.draw(scene); } } void render_line(QGraphicsScene* scene, const Point& p1, const Point& p2) { p1.lineTo(scene, p2); } int main(int argc, char *argv[]) { QApplication a(argc, argv); // open file string filename = "grid6x6.txt"; ifstream input; input.open(filename); // the vector of points vector points; // read points from file int N; int x; int y; input >> N; for (int i = 0; i < N; ++i) { input >> x >> y; points.push_back(Point(x, y)); } input.close(); // setup graphical window QGraphicsView *view = new QGraphicsView(); QGraphicsScene *scene = new QGraphicsScene(0, 0, SCENE_WIDTH, SCENE_HEIGHT); view->setScene(scene); // draw points to screen all at once render_points(scene, points); view->scale(1, -1); //screen y-axis is inverted view->resize(view->sizeHint()); view->setWindowTitle("Fast Pattern Recognition"); sort(points.begin(), points.end()); auto begin = chrono::high_resolution_clock::now(); vector> angles; int draws = 0; for (int p1 = 0; p1 < N-1; p1++) { angles.clear(); for (int p2 = p1 + 1; p2 < N; p2++) { double angle = points.at(p1).slopeTo(points.at(p2)); angles.push_back({ angle, points.at(p2) }); } sort(angles.begin(), angles.end()); int num_in_row = 0; for (int i = 1; i < angles.size(); i++) { double prev_angle = angles[i - 1].first; if (angles[i].first == prev_angle) { num_in_row++; if (num_in_row >= 2) { render_line(scene, points.at(p1), angles[i].second); draws++; } } else { num_in_row = 0; } } } cout << draws << endl; auto end = chrono::high_resolution_clock::now(); cout << "Computing line segments took " << std::chrono::duration_cast(end - begin).count() << " milliseconds." << endl; view->show(); return a.exec(); // start Qt event loop }