#include "chart.h"
#include "mainwindow.h"
Chart::Chart(long long x0, long long yx0, QWidget *parent) : QWidget(parent), x0(x0), yx0(yx0)
{
y = 0;
C = qExp(2*x0)*(2000-(qExp(2*x0)/4)+yx0);
scale = 20; // масштаб клеток/отрезков
scaleXY = 1; //масштаб графика
setMouseTracking(true);
}
void Chart::paintEvent(QPaintEvent*){
painter.begin(this);
if(scaleXY <1) scaleXY = 1; // задаем минимальную границу масштаба
painter.scale(scaleXY, scaleXY);
painter.setRenderHints(QPainter::Antialiasing, true);
painter.setBackgroundMode(Qt::OpaqueMode);
painter.setBackground(Qt::white);
pen.setColor(Qt::gray);
pen.setWidth(1);
painter.setPen(pen);
for(int i = 0; i < width(); i+=scale){
painter.drawLine(i, 0, i, height()); //клетки
painter.drawLine(0, i, width(), i);
}
pen.setColor(QColor(220, 20, 60));
pen.setWidth(3);
painter.setPen(pen);
painter.drawLine((width()/2), 0,(width()/2), height()); // ось Y
QPolygon arrowY;
arrowY << QPoint(width()/2, 0) << QPoint((width()/2)-20, 20); //левая часть стрелки
arrowY << QPoint(width()/2, 0) << QPoint((width()/2)+20, 20); //правая часть стрелки
painter.drawPolygon(arrowY);
painter.drawLine(0, (height()/2), width(), (height()/2)); // ось X
QPolygon arrowX;
arrowX << QPoint(width(), height()/2) << QPoint((width())-20, (height()/2)-20); //верхняя часть стрелки
arrowX << QPoint(width(), height()/2) << QPoint((width())-20,(height()/2)+20); //нижняя часть стрелки
painter.drawPolygon(arrowX);
for(int i = 0; i < width(); i+=scale){
painter.drawLine(i, (height()/2)-5, i, (height()/2)+5); // отрезки слева направо
}
for(int i = 0; i < height(); i+=scale){
painter.drawLine((width()/2)-5, i, (width()/2)+5, i); // отрезки сверху вниз
}
pen.setColor(QColor(0, 128, 128));
pen.setWidth(4);
painter.setPen(pen);
for(float x = -100; x <= 100; x+=0.001){
y = ((qExp(2*x)/4) + (C/qExp(2*x)) - 2000)/1000;
painter.drawPoint(QPoint(((width()/2)+x), ((height()/2)-y))); // здесь отрисовка самого графика
}
painter.end();
}
void Chart::wheelEvent(QWheelEvent* e){
if(e->angleDelta().y() > 0){
scale+= 1;
scaleXY+=0.1;
update();
}
else if(e->angleDelta().y() < 0){
scale-= 1;
scaleXY-=0.1;
update();
}
}
void Chart::mouseMoveEvent(QMouseEvent *e){
bool leftClick = e->buttons() & Qt::LeftButton;
if(leftClick){
mousePoint = e->pos();
update();
}
}