From c0fab0e941aecc92037eb4e3eed7987afbe4b620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Tue, 8 Dec 2020 10:21:25 +0100 Subject: impl l7 --- labb7/src/fast.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 labb7/src/fast.cpp (limited to 'labb7/src') diff --git a/labb7/src/fast.cpp b/labb7/src/fast.cpp new file mode 100644 index 0000000..ab7c7b5 --- /dev/null +++ b/labb7/src/fast.cpp @@ -0,0 +1,102 @@ +#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 = "grid4x4.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"); + view->show(); + + sort(points.begin(), points.end()); + auto begin = chrono::high_resolution_clock::now(); + + vector> angles; + 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()); + + cout << points.at(p1) << endl; + + double prev_angle = angles[0].first; + int num_in_row = 0; + for (int i = 1; i < angles.size(); i++) { + if (angles[i].first == prev_angle) { + num_in_row++; + if (num_in_row >= 2) { + render_line(scene, points.at(p1), angles[i].second); + } + } else { + num_in_row = 0; + } + cout << i << " " << num_in_row << " " << angles[i].first << " " << angles[i].second << endl; + prev_angle = angles[i].first; + } + if (num_in_row >= 2) { + render_line(scene, points.at(p1), angles[angles.size() - 1].second); + } + cout << endl; + } + + auto end = chrono::high_resolution_clock::now(); + cout << "Computing line segments took " + << std::chrono::duration_cast(end - begin).count() + << " milliseconds." << endl; + + return a.exec(); // start Qt event loop +} -- cgit v1.2.1