#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include namespace Ui { class MainWindow; } struct Vez; class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_horizontalScrollBar_valueChanged(int value); private: Ui::MainWindow *ui; QGraphicsScene * scene; void nakresli (int relx, Vez & X); }; #endif // MAINWINDOW_H #include "mainwindow.h" #include "ui_mainwindow.h" #include const int max = 10; struct Vez { int v; int p [max]; }; Vez A, B, C; void init (Vez & X) { X.v = max; for (int i = 0; i < max; i++) X.p[i] = max-i; } void clear (Vez & X) { X.v = 0; for (int i = 0; i < max; i++) X.p[i] = 0; } void krok (Vez & X, Vez & Y) { int h = X.p[X.v-1]; X.p[X.v-1] = 0; X.v --; Y.v ++; Y.p[Y.v-1] = h; } struct TriVeze { Vez X, Y, Z; }; QList zaznam; void uloz () { TriVeze t; t.X = A; t.Y = B; t.Z = C; zaznam.append(t); } void hraj (Vez & X, Vez & Y, Vez & Z, int k) { if (k > 1) hraj (X, Z, Y, k-1); krok (X, Z); uloz (); if (k > 1) hraj (Y, X, Z, k-1); } void run () { init (A); clear (B); clear (C); uloz (); hraj (A, B, C, max); } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); scene = new QGraphicsScene; ui->graphicsView->setScene (scene); run (); // int w = ui->graphicsView->width(); // int h = ui->graphicsView->height(); // scene->addRect (0, 0, w-1, h-1); int n = zaznam.count (); ui->horizontalScrollBar->setMinimum (0); ui->horizontalScrollBar->setMaximum (n-1); ui->horizontalScrollBar->setValue (n-1); setWindowTitle (QString::number (n)); } void MainWindow::nakresli(int relx, Vez & X) { int w = ui->graphicsView->width(); int h = ui->graphicsView->height(); int x = w / 4 * (2+relx); int ystep = h / max; int ysize = ystep * 9 / 10; int xstep = w / ( 8 * max); for (int i = 0; i < X.v; i++) { int n = X.p[i]; int xsize = n * xstep; int y = (max - i - 1) * ystep; QGraphicsRectItem * r = new QGraphicsRectItem; r->setRect (x-xsize, y, 2*xsize, ysize); QColor c = QColor::fromHsv ((360/max*n)%360, 240, 240); QColor d = QColor::fromHsv ((360/max*n)%360, 120, 240); r->setPen (c); r->setBrush (d); scene->addItem(r); } } void MainWindow::on_horizontalScrollBar_valueChanged (int value) { if (value >= 0 && value < zaznam.count()) { scene->clear(); TriVeze t = zaznam [value]; nakresli (-1, t.X); nakresli ( 0, t.Y); nakresli ( 1, t.Z); } } /* scene->addLine (10,10, 100,200); QGraphicsRectItem * r = new QGraphicsRectItem; r->setRect (20, 20, 120, 240); r->setBrush (QColor ("yellow")); r->setPen (QColor ("blue")); r->setToolTip ("obdelnik"); r->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); scene->addItem (r); */ MainWindow::~MainWindow() { delete ui; }