Na zajeciach z programowania przerabialismy kod z rysowania krzywej beziera niestety mnie na tych zajeciach nie było i staram się nadrobic zaleglosci niestety sam nie potrafie sobie poradzic a przegladajac internet nie potrafie znalezc satysfakcjonujacych mnie odpowiedzi. Głownie chodzi mi o dwie funkcje mianowicie:
void MyWindow::mousePressEvent(QMouseEvent *event)
void MyWindow::mouseMoveEvent(QMouseEvent *event)
Czy ktos byłby chętny pomoc w zrozumieniu kodu ?
#include "mywindow.h"
#include "ui_mywindow.h"
#include <qmath.h>
MyWindow::MyWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MyWindow)
{
ui->setupUi(this);
szer = ui->rysujFrame->width();
wys = ui->rysujFrame->height();
poczX = ui->rysujFrame->x();
poczY = ui->rysujFrame->y();
img = new QImage(szer,wys,QImage::Format_RGB32);
punktprzesun = -1;
}
MyWindow::~MyWindow()
{
delete ui;
}
void MyWindow::on_exitButton_clicked()
{
qApp->quit();
}
void MyWindow::paintEvent(QPaintEvent*)
{
QPainter p(this);
p.drawImage(poczX,poczY,*img);
for(int i=0; i<wektor.size(); i++){
p.drawImage(wektor[i].x(),wektor[i].y(),QImage(15,15,QImage::Format_RGB32));
}
}
void MyWindow::on_cleanButton_clicked()
{
czysc();
update();
wektor.resize(0);
licz_klikniecia = 0;
}
void MyWindow::czysc()
{
unsigned char *ptr;
ptr = img->bits();
int i,j;
for(i=0; i<wys; i++)
{
for(j=0; j<szer; j++)
{
ptr[szer*4*i + 4*j]=255;
ptr[szer*4*i + 4*j + 1] = 255;
ptr[szer*4*i + 4*j + 2] = 255;
}
}
}
void MyWindow::zapalPiksel(int x, int y)
{
unsigned char *ptr;
ptr = img->bits();
if ((x>=0)&&(y>=0)&&(x<szer)&&(y<wys))
{
ptr[szer*4*y + 4*x] = 0;
ptr[szer*4*y + 4*x + 1] = 0;
ptr[szer*4*y + 4*x + 2] = 0;
}
update();
}
void MyWindow::rysujBeziera(QPoint p0, QPoint p1, QPoint p2, QPoint p3){
QPoint punkt;
for(double t = 0.0; t<=1.0; t+=0.001){
punkt = pow((1-t),3) * p0 + 3 * pow((1-t),2) * t * p1 + 3 * (1-t) * pow(t,2) * p2 + pow(t,3) * p3;
zapalPiksel(punkt.x(), punkt.y());
}
}
void MyWindow::mousePressEvent(QMouseEvent *event)
{
x0 = event->x();
y0 = event->y();
x0 -= poczX;
y0 -= poczY;
if(event->buttons() == Qt::RightButton){
QPoint punkt;
punkt.setX(x0);
punkt.setY(y0);
wektor.push_back(punkt);
licz_klikniecia++;
if(licz_klikniecia==4){
rysujBeziera(wektor[0],wektor[1],wektor[2], wektor[3]);
}
if(licz_klikniecia > 4 && ((licz_klikniecia-1)%3)==0){
rysujBeziera(wektor[licz_klikniecia-4],wektor[licz_klikniecia-3],wektor[licz_klikniecia-2], wektor[licz_klikniecia-1]);
}
}
else if(event->buttons() == Qt::LeftButton){
for(int i=0; i<wektor.size(); i++){
if(abs(x0 - wektor[i].x()) < 15 && abs(y0 - wektor[i].y()) < 15){
punktprzesun = i;
}
}
}
qDebug() << wektor;
update();
}
void MyWindow::mouseMoveEvent(QMouseEvent *event)
{
x0 = event->x();
y0 = event->y();
x0 -= poczX;
y0 -= poczY;
czysc();
if(punktprzesun != -1){
wektor[punktprzesun] = QPoint(x0, y0);
}
if(wektor.size()>=4){
for(int i=3; i<wektor.size(); i+=3){
rysujBeziera(wektor[i-3],wektor[i-2],wektor[i-1], wektor[i]);
}
}
update();
}
void MyWindow::mouseReleaseEvent(QMouseEvent *event)
{
punktprzesun = -1;
}
void MyWindow::rysujOdcinek(int x0, int y0, int x1, int y1){
float a, b;
a = (float)(y1 - y0)/(x1 -x0);
b = (float)(y0 - a * x0);
if(x0 == x1)
{
if(y0>y1){
int temp;
temp = y0;
y0 = y1;
y1 = temp;
}
for(int i = y0; i <= y1; i++){
zapalPiksel(x0,i);
}
}
else if(x0 < x1)
{
if(abs(a) < 1)
{
for(int x = x0; x <=x1; x++)
{
int y = a * x + b;
zapalPiksel(x,y);
}
}
else if(abs(a) >= 1 && y0 < y1 )
{
for(int y = y0; y <=y1; y++)
{
int x = (y - b)/a;
zapalPiksel(x,y);
}
}
else
{
for(int y = y1; y <=y0; y++)
{
int x = (y - b)/a;
zapalPiksel(x,y);
}
}
}
else
{
if(abs(a) < 1)
{
for(int x = x1; x <=x0; x++)
{
int y = a * x + b;
zapalPiksel(x,y);
}
}
else if(abs(a) >= 1 && y1 < y0)
{
for(int y = y1; y <=y0; y++)
{
int x = (y - b)/a;
zapalPiksel(x,y);
}
}
else
{
for(int y = y0; y <=y1; y++)
{
int x = (y - b)/a;
zapalPiksel(x,y);
}
}
}
}