[[vezicky]]
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QGraphicsScene>
 
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 <QGraphicsRectItem>
 
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 <TriVeze> 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;
}
 
vezicky.txt · Last modified: 2015/03/16 17:04 by 147.32.8.110
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki