tsp/renderwindow.h

91 lines
1.6 KiB
C++

//
// Created by natty on 15.7.23.
//
#ifndef TSP_RENDERWINDOW_H
#define TSP_RENDERWINDOW_H
#include <QApplication>
#include <qmainwindow.h>
#include <qwidget.h>
#include <SDL2/SDL.h>
#include <QHBoxLayout>
#include <unordered_set>
#include <random>
#include <QComboBox>
#include <QLabel>
#include <QPushButton>
struct State;
struct Vertex {
double x;
double y;
};
struct Edge {
size_t from;
size_t to;
double distanceOf(const State& state, const Vertex& vertex) const;
};
struct State {
std::vector<Vertex> vertices;
std::vector<Edge> edges;
};
class Strategy {
public:
virtual ~Strategy() = default;
virtual bool step(State& state) = 0;
};
class AnnaStrategy : public Strategy {
public:
bool step(State& state) override;
private:
bool init;
std::vector<size_t> unvisited;
};
class RenderWindow : public QMainWindow {
Q_OBJECT
public:
RenderWindow();
~RenderWindow() override;
void paintEvent(QPaintEvent* event) override;
public slots:
void render();
void step();
void solve();
private:
QVBoxLayout *layout;
QHBoxLayout *controlsLayout;
QWidget *renderArea;
QWidget *mainWindowWidget;
QLabel *distanceLabel;
QPushButton *playButton;
QComboBox *strategySelector;
QTimer *animTimer;
SDL_Window *window{};
SDL_Renderer* renderer{};
State state;
std::unique_ptr<Strategy> strategy;
private slots:
void resetState();
void hardResetState();
void togglePlay(bool play);
};
#endif //TSP_RENDERWINDOW_H