aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2008-10-07 00:13:32 -0400
committerJason A. Donenfeld <Jason@zx2c4.com>2008-10-07 00:13:32 -0400
commit899d76cec806b9f3edbe80a3df933bd539599e1b (patch)
tree41731f0ae3a3c8d92457389a6f79eecf5a4b1231
downloadtrianglefractalchaos-899d76cec806b9f3edbe80a3df933bd539599e1b.tar.xz
trianglefractalchaos-899d76cec806b9f3edbe80a3df933bd539599e1b.zip
Initial commit
-rw-r--r--TriangleFractalChaos.cpp92
-rw-r--r--TriangleFractalChaos.h34
-rw-r--r--TriangleFractalChaos.pro4
-rw-r--r--main.cpp10
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