247 lines
4.3 KiB
C++
247 lines
4.3 KiB
C++
#include "renderarea.h"
|
|
#include <QPainter>
|
|
|
|
QSize RenderArea::minimumSizeHint() const
|
|
{
|
|
return QSize{491,481};
|
|
}
|
|
|
|
QSize RenderArea::sizeHint() const
|
|
{
|
|
return QSize{491,481};
|
|
}
|
|
|
|
void RenderArea::paintEvent(QPaintEvent* event)
|
|
{
|
|
Q_UNUSED(event);
|
|
QPainter painter{this};
|
|
painter.setRenderHint(QPainter::Antialiasing,true);
|
|
|
|
painter.setBrush(mBackgroundColour);
|
|
painter.setPen(mPen);
|
|
|
|
painter.drawRect(this->rect());
|
|
|
|
QPointF prevPoint{Compute(0)};
|
|
QPoint center{this->rect().center()},prevPixel;
|
|
prevPixel.setX(prevPoint.x() * mScale + center.x());
|
|
prevPixel.setY(prevPoint.y() * mScale + center.y());
|
|
|
|
double step{ mIntervalLenght / mStepCount };
|
|
|
|
for(double t{0}; t < mIntervalLenght; t += step){
|
|
QPointF point = Compute(t);
|
|
|
|
QPoint pixel{};
|
|
pixel.setX(point.x() * mScale + center.x());
|
|
pixel.setY(point.y() * mScale + center.y());
|
|
|
|
painter.drawLine(pixel, prevPixel);
|
|
|
|
prevPixel=pixel;
|
|
}
|
|
QPointF point = Compute(mIntervalLenght);
|
|
QPoint pixel{};
|
|
pixel.setX(point.x() * mScale + center.x());
|
|
pixel.setY(point.y() * mScale + center.y());
|
|
painter.drawLine(pixel, prevPixel);
|
|
}
|
|
|
|
RenderArea::RenderArea(QWidget *parent) :
|
|
QWidget{parent},
|
|
mBackgroundColour{36,35,35},
|
|
mPen{QColor{251,250,250}},
|
|
mShape{Astroid}
|
|
{
|
|
mPen.setWidth(2);
|
|
OnShapeChanged();
|
|
}
|
|
|
|
QPointF RenderArea::ComputeAstroid(double t){
|
|
return QPointF{
|
|
2*pow(cos(t),3),
|
|
2*pow(sin(t),3)
|
|
};
|
|
}
|
|
|
|
QPointF RenderArea::ComputeCycloid(double t)
|
|
{
|
|
return QPointF{
|
|
1.5 * (1 - cos(t)),
|
|
1.5 * (t - sin(t))
|
|
};
|
|
}
|
|
|
|
QPointF RenderArea::ComputeHuygens(double t)
|
|
{
|
|
return QPointF{
|
|
4 * (3 * cos(t) - cos(3 * t)),
|
|
4 * (3 * sin(t) - sin(3 * t))
|
|
};
|
|
}
|
|
|
|
QPointF RenderArea::ComputeHypo(double t)
|
|
{
|
|
return QPointF{
|
|
1.5 * (2 * cos(t) + cos(2 * t)),
|
|
1.5 * (2 * sin(t) - sin(2 * t))
|
|
};
|
|
}
|
|
|
|
QPointF RenderArea::ComputeLine(double t)
|
|
{
|
|
return QPointF{1-t,1-t};
|
|
}
|
|
|
|
QPointF RenderArea::ComputeCircle(double t)
|
|
{
|
|
return QPointF{cos(t),sin(t)};
|
|
}
|
|
|
|
QPointF RenderArea::ComputeEllipse(double t)
|
|
{
|
|
double a{2},b{1.1};
|
|
return QPointF{a*cos(t),b*sin(t)};
|
|
}
|
|
|
|
QPointF RenderArea::ComputeFancy(double t)
|
|
{
|
|
return QPointF{
|
|
11*cos(t) - 6*cos((11.0/6)*t),
|
|
11*sin(t) - 6*sin((11.0/6)*t)
|
|
};
|
|
}
|
|
|
|
QPointF RenderArea::ComputeStarfish(double t)
|
|
{
|
|
double R{5},r{3},d{5};
|
|
return QPointF{
|
|
(R-r)*cos(t) + d*cos(t*((R-r)/r)),
|
|
(R-r)*sin(t) - d*sin(t*((R-r)/r))
|
|
};
|
|
}
|
|
|
|
QPointF RenderArea::ComputeCloud2(double t)
|
|
{
|
|
return ComputeCloudWithSign(t,1.);
|
|
}
|
|
|
|
QPointF RenderArea::ComputeCloud1(double t)
|
|
{
|
|
return ComputeCloudWithSign(t,-1.);
|
|
}
|
|
|
|
QPointF RenderArea::ComputeCloudWithSign(double t,double sign)
|
|
{
|
|
double a{14},b{1};
|
|
return QPointF{
|
|
(a+b)*cos(t*(b/a)) + sign*b*cos(t*((a+b)/a)),
|
|
(a+b)*sin(t*(b/a)) - b*sin(t*((a+b)/a))
|
|
};
|
|
}
|
|
|
|
void RenderArea::OnShapeChanged()
|
|
{
|
|
switch (mShape) {
|
|
case Astroid:
|
|
mScale=90;
|
|
mIntervalLenght=2*M_PI;
|
|
mStepCount=512;
|
|
break;
|
|
case Cycloid:
|
|
mScale=10;
|
|
mIntervalLenght=4*M_PI;
|
|
mStepCount=128;
|
|
break;
|
|
case HuygensCycloid:
|
|
mScale=10;
|
|
mIntervalLenght=4*M_PI;
|
|
mStepCount=512;
|
|
break;
|
|
case HypoCycloid:
|
|
mScale=40;
|
|
mIntervalLenght=2*M_PI;
|
|
mStepCount=256;
|
|
break;
|
|
case Line:
|
|
mScale=100;
|
|
mIntervalLenght=2;
|
|
mStepCount=128;
|
|
break;
|
|
case Circle:
|
|
mScale=100;
|
|
mIntervalLenght=2*M_PI;
|
|
mStepCount=128;
|
|
break;
|
|
case Ellipse:
|
|
mScale=75;
|
|
mIntervalLenght=2*M_PI;
|
|
mStepCount=256;
|
|
break;
|
|
case Fancy:
|
|
mScale=10;
|
|
mIntervalLenght=12*M_PI;
|
|
mStepCount=512;
|
|
break;
|
|
case Starfish:
|
|
mScale=25;
|
|
mIntervalLenght=6*M_PI;
|
|
mStepCount=256;
|
|
break;
|
|
case Cloud1:
|
|
mScale=10;
|
|
mIntervalLenght=28*M_PI;
|
|
mStepCount=128;
|
|
break;
|
|
case Cloud2:
|
|
mScale=10;
|
|
mIntervalLenght=28*M_PI;
|
|
mStepCount=128;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
QPointF RenderArea::Compute(double t)
|
|
{
|
|
switch (mShape) {
|
|
case Astroid:
|
|
return ComputeAstroid(t);
|
|
break;
|
|
case Cycloid:
|
|
return ComputeCycloid(t);
|
|
break;
|
|
case HuygensCycloid:
|
|
return ComputeHuygens(t);
|
|
break;
|
|
case HypoCycloid:
|
|
return ComputeHypo(t);
|
|
break;
|
|
case Line:
|
|
return ComputeLine(t);
|
|
break;
|
|
case Circle:
|
|
return ComputeCircle(t);
|
|
break;
|
|
case Ellipse:
|
|
return ComputeEllipse(t);
|
|
break;
|
|
case Fancy:
|
|
return ComputeFancy(t);
|
|
break;
|
|
case Starfish:
|
|
return ComputeStarfish(t);
|
|
break;
|
|
case Cloud1:
|
|
return ComputeCloud1(t);
|
|
break;
|
|
case Cloud2:
|
|
return ComputeCloud2(t);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return QPointF{0,0};
|
|
}
|