diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2008-10-07 00:13:32 -0400 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2008-10-07 00:13:32 -0400 |
commit | 899d76cec806b9f3edbe80a3df933bd539599e1b (patch) | |
tree | 41731f0ae3a3c8d92457389a6f79eecf5a4b1231 | |
download | trianglefractalchaos-899d76cec806b9f3edbe80a3df933bd539599e1b.tar.xz trianglefractalchaos-899d76cec806b9f3edbe80a3df933bd539599e1b.zip |
Initial commit
-rw-r--r-- | TriangleFractalChaos.cpp | 92 | ||||
-rw-r--r-- | TriangleFractalChaos.h | 34 | ||||
-rw-r--r-- | TriangleFractalChaos.pro | 4 | ||||
-rw-r--r-- | main.cpp | 10 |
4 files changed, 140 insertions, 0 deletions
diff --git a/TriangleFractalChaos.cpp b/TriangleFractalChaos.cpp new file mode 100644 index 0000000..daa3bd0 --- /dev/null +++ b/TriangleFractalChaos.cpp @@ -0,0 +1,92 @@ +#include "TriangleFractalChaos.h" +#include <QPushButton> +#include <QSpinBox> +#include <QGridLayout> +#include <QLabel> +#include <QImage> +#include <QTimer> +#include <QPixmap> +#include <cstdlib> + +TriangleFractalChaos::TriangleFractalChaos(QWidget *parent) + : QWidget(parent) +{ + dots = 0; + drawTimer = new QTimer(this); + connect(drawTimer, SIGNAL(timeout()), this, SLOT(drawDot())); + delayLabel = new QLabel("Delay:"); + magnificationLabel = new QLabel("Magnification:"); + delay = new QSpinBox; + delay->setMinimum(1); + delay->setValue(10); + delay->setSuffix(" ms"); + magnification = new QSpinBox; + magnification->setMinimum(1); + magnification->setMaximum(10); + magnification->setValue(2); + magnification->setSuffix("x"); + generate = new QPushButton("&Generate!"); + connect(generate, SIGNAL(clicked()), this, SLOT(toggleDraw())); + QGridLayout *grid = new QGridLayout; + grid->setAlignment(Qt::AlignLeft | Qt::AlignTop); + grid->addWidget(delayLabel, 0, 0, Qt::AlignRight); + grid->addWidget(delay, 0, 1); + grid->addWidget(magnificationLabel, 1, 0, Qt::AlignRight); + grid->addWidget(magnification, 1, 1); + grid->addWidget(generate, 2, 0, 1, 2); + setLayout(grid); + resize(500, 500); + setWindowTitle("Triangle Fractal Chaos"); +} +void TriangleFractalChaos::toggleDraw() +{ + static uint backgroundColor = palette().color(QPalette::Window).rgb(); + if(delayLabel->isEnabled()) { + delayLabel->setEnabled(false); + delay->setEnabled(false); + magnificationLabel->setEnabled(false); + magnification->setEnabled(false); + generate->setText("&Stop"); + setFixedSize(size()); + int width = this->width(); + int height = (int)((double)width * 1.73205081 / 2.0); + width /= (int)magnification->value(); + height /= (int)magnification->value(); + dots = new QImage(width, height, QImage::Format_RGB32); + dots->fill(backgroundColor); + startingPoints[0] = QPoint(width / 2 - 1, 0); + startingPoints[1] = QPoint(0, height - 1); + startingPoints[2] = QPoint(width - 1, height - 1); + dots->setPixel(startingPoints[0], 0xff00ff00); + dots->setPixel(startingPoints[1], 0xff00ff00); + dots->setPixel(startingPoints[2], 0xff00ff00); + lastPoint = QPoint(rand() % width + 1, rand() % height + 1); + dots->setPixel(lastPoint, 0xffff0000); + update(); + drawTimer->start(delay->value()); + } else { + drawTimer->stop(); + delayLabel->setEnabled(true); + delay->setEnabled(true); + magnificationLabel->setEnabled(true); + magnification->setEnabled(true); + generate->setText("&Generate!"); + setMinimumSize(0, 0); + setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + } +} +void TriangleFractalChaos::paintEvent(QPaintEvent *event) +{ + QWidget::paintEvent(event); + if(dots) { + QPalette palette; + palette.setBrush(backgroundRole(), QBrush(QPixmap::fromImage(dots->scaled(size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)))); + setPalette(palette); + } +} +void TriangleFractalChaos::drawDot() +{ + lastPoint = (lastPoint + startingPoints[rand() % 3]) / 2; + dots->setPixel(lastPoint, 0xff000000); + update(); +}
\ No newline at end of file diff --git a/TriangleFractalChaos.h b/TriangleFractalChaos.h new file mode 100644 index 0000000..5268e52 --- /dev/null +++ b/TriangleFractalChaos.h @@ -0,0 +1,34 @@ +#include <QWidget> +class QTimer; +class QSpinBox; +class QLabel; +class QPushButton; +class QImage; +class QPoint; + +class TriangleFractalChaos : public QWidget +{ + Q_OBJECT + +public: + TriangleFractalChaos(QWidget *parent = 0); + +protected: + void paintEvent(QPaintEvent *event); + +private: + QSpinBox *magnification; + QLabel *magnificationLabel; + QSpinBox *delay; + QLabel *delayLabel; + QPushButton *generate; + QImage *dots; + QPoint startingPoints[3]; + QPoint lastPoint; + QTimer *drawTimer; + void startDrawing(); + +private slots: + void drawDot(); + void toggleDraw(); +};
\ No newline at end of file diff --git a/TriangleFractalChaos.pro b/TriangleFractalChaos.pro new file mode 100644 index 0000000..1385bd9 --- /dev/null +++ b/TriangleFractalChaos.pro @@ -0,0 +1,4 @@ +TEMPLATE = app +CONFIG += qt +HEADERS += TriangleFractalChaos.h +SOURCES += main.cpp TriangleFractalChaos.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..77fe711 --- /dev/null +++ b/main.cpp @@ -0,0 +1,10 @@ +#include <QApplication> +#include "TriangleFractalChaos.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + TriangleFractalChaos window; + window.show(); + return app.exec(); +}
\ No newline at end of file |