From 7b7f6808a7b2db2ed21103767434c1445f7815c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Thu, 3 Dec 2020 16:27:06 +0100 Subject: add given files l7 --- labb7/src/brute.cpp | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 labb7/src/brute.cpp (limited to 'labb7/src/brute.cpp') diff --git a/labb7/src/brute.cpp b/labb7/src/brute.cpp new file mode 100644 index 0000000..ffddd0f --- /dev/null +++ b/labb7/src/brute.cpp @@ -0,0 +1,94 @@ +/* + * TDDD86 Pattern Recognition + * This program computes and plots all line segments involving 4 points + * in a file using Qt. + */ + +#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 = "input100.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("Brute Force Pattern Recognition"); + view->show(); + + // sort points by natural order + // makes finding endpoints of line segments easy + sort(points.begin(), points.end()); + auto begin = chrono::high_resolution_clock::now(); + + // iterate through all combinations of 4 points + for (int i = 0 ; i < N-3 ; ++i) { + for (int j = i+1 ; j < N-2 ; ++j) { + for (int k = j+1 ; k < N-1 ; ++k) { + //only consider fourth point if first three are collinear + if (points.at(i).slopeTo(points.at(j)) == points.at(i).slopeTo(points.at(k))) { + for (int m{k+1} ; m < N ; ++m) { + if (points.at(i).slopeTo(points.at(j)) == points.at(i).slopeTo(points.at(m))) { + render_line(scene, points.at(i), points.at(m)); + a.processEvents(); // show rendered line + } + } + } + } + } + } + + 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