aboutsummaryrefslogtreecommitdiffstats
path: root/TriangleFractalChaos.cpp
diff options
Diffstat (limited to 'TriangleFractalChaos.cpp')
-rw-r--r--TriangleFractalChaos.cpp92
1 files changed, 92 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