Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Dolaczamy plik naglowkowy naszej klasy MyWindow
- #include "mywindow.h"
- // Dolaczamy plik naglowkowy zawierajacy definicje GUI
- // Plik ten jest generowany automatycznie
- // z pliku XML "mywindow.ui"
- #include "ui_mywindow.h"
- #include <math.h>
- // Definicja konstruktora, wywolujemy najpierw
- // konstruktor klasy nadrzednej, nastepnie tworzymy
- // obiekt klasy Ui_MyWindow reprezentujacy GUI
- MyWindow::MyWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MyWindow)
- {
- // Wywolujemy funkcje tworzaca elementy GUI
- // Jej definicja znajduje sie w pliku "ui_mywindow.h"
- ui->setupUi(this);
- // Pobieramy wymiary i wspolrzedne lewego gornego naroznika ramki
- // i ustawiamy wartosci odpowiednich pol
- // Uwaga: ramke "rysujFrame" wykorzystujemy tylko do
- // wygodnego ustaiwenia tych wymiarow. Rysunek bedziemy wyswietlac
- // bezposrednio w glownym oknie aplikacji.
- szer = ui->rysujFrame->width();
- wys = ui->rysujFrame->height();
- poczX = ui->rysujFrame->x();
- poczY = ui->rysujFrame->y();
- // Tworzymy obiekt klasy QImage, o odpowiedniej szerokosci
- // i wysokosci. Ustawiamy format bitmapy na 32 bitowe RGB
- // (0xffRRGGBB).
- img = new QImage(szer,wys,QImage::Format_RGB32);
- unsigned char *ptr;
- ptr = img->bits();
- int szer = img->width();
- int wys = img->height();
- int i,j;
- for(i=0;i<wys;i++)
- {
- for(j=0;j<szer ;j++)
- {
- ptr[szer*4*i + 4*j]=0;
- ptr[szer*4*i + 4*j + 1] = 0;
- ptr[szer*4*i + 4*j + 2] = 0;
- }
- }
- }
- // Definicja destruktora
- MyWindow::~MyWindow()
- {
- delete ui;
- }
- // Funkcja (slot) wywolywana po nacisnieciu przycisku "Wyjscie" (exitButton)
- // Uwaga: polaczenie tej funkcji z sygnalem "clicked"
- // emitowanym przez przycisk jest realizowane
- // za pomoca funkcji QMetaObject::connectSlotsByName(MyWindow)
- // znajdujacej sie w automatycznie generowanym pliku "ui_mywindow.h"
- // Nie musimy wiec sami wywolywac funkcji "connect"
- void MyWindow::on_exitButton_clicked()
- {
- // qApp to globalny wskaznik do obiektu reprezentujacego aplikacje
- // quit() to funkcja (slot) powodujaca zakonczenie aplikacji z kodem 0 (brak bledu)
- qApp->quit();
- }
- // Funkcja "odmalowujaca" komponent
- void MyWindow::paintEvent(QPaintEvent*)
- {
- // Obiekt klasy QPainter pozwala nam rysowac na komponentach
- QPainter p(this);
- // Rysuje obrazek "img" w punkcie (poczX,poczY)
- // (tu bedzie lewy gorny naroznik)
- p.drawImage(poczX,poczY,*img);
- }
- // Funkcja (slot) wywolywana po nacisnieciu przycisku "Czysc" (cleanButton)
- void MyWindow::on_cleanButton_clicked()
- {
- // Funkcja czysci (zamalowuje na bialo) obszar rysowania
- // definicja znajduje sie ponizej
- czysc();
- // Funkcja "update()" powoduje ponowne "namalowanie" calego komponentu
- // Wywoluje funkcje "paintEvent"
- update();
- }
- // Funkcja (slot) wywolywana po nacisn ieciu przycisku "Rysuj 1" (draw1Button)
- void MyWindow::czysc()
- {
- // Wskaznik za pomoca, ktorego bedziemy modyfikowac obraz
- unsigned char *ptr;
- // Funkcja "bits()" zwraca wskaznik do pierwszego piksela danych
- ptr = img->bits();
- int i,j;
- // Przechodzimy po wszystkich wierszach obrazu
- for(i=0; i<wys; i++)
- {
- // Przechodzimy po pikselach danego wiersza
- // W kazdym wierszu jest "szer" pikseli (tzn. 4 * "szer" bajtow)
- for(j=0; j<szer; j++)
- {
- ptr[szer*4*i + 4*j]=0; // Skladowa BLUE
- ptr[szer*4*i + 4*j + 1] = 0; // Skladowa GREEN
- ptr[szer*4*i + 4*j + 2] = 0; // Skladowa RED
- }
- }
- }
- // Funkcja powoduje zamalowanie obszaru rysowania pewnym wzorem
- void MyWindow::rysuj(int x1, int y1){
- unsigned char *ptr;
- ptr = img->bits();
- if ((x1>0)&&(y1>0)&&(x1<szer )&&(y1<wys)){
- ptr[szer*4*(y1) + 4*(x1)] = 0;
- ptr[szer*4*(y1) + 4*(x1) + 1] = 0;
- ptr[szer*4*(y1) + 4*(x1) + 2] = 255;
- }
- }
- void MyWindow::rysujprosta(int x1, int x2 , int y1, int y2){
- unsigned char *ptr;
- ptr = img->bits();
- if ((x1>=0)&&(y1>=0)&&(x1<szer)&&(y1<wys) && (x2>=0)&&(y2>=0)&&(x2<szer)&&(y2<wys)){
- // Sprawdzamy czy klikniecie nastapilo w granicach rysunku
- if(abs(x2-x1) >= abs(y2-y1)){
- if(x1 > x2){
- std::swap(x1,x2);
- std::swap(y1,y2);
- }
- double a = (double)(y2 - y1)/(x2 - x1);
- double b = (double) y2 - a * x2;
- for(int i = x1 ; i <= x2 ; i++){
- int j = a * i + b;
- ptr[szer*4*j + 4*i] = 255;
- ptr[szer*4*j + 4*i + 1] = 255;
- ptr[szer*4*j + 4*i + 2] = 255;
- }
- }
- else{
- if(y1 > y2){
- std::swap(x1,x2);
- std::swap(y1,y2);
- }
- double a = (double)(x2 - x1)/(y2 - y1);
- double b = (double) x2 - a * y2;
- for(int i = y1 ; i <= y2 ; i++){
- int j = a * i + b;
- ptr[szer*4*i + 4*j] = 255;
- ptr[szer*4*i + 4*j + 1] = 255;
- ptr[szer*4*i+ 4*j + 2] = 255;
- }
- }
- }
- }
- // Funkcja (slot) wywolywana po nacisnieciu przycisku myszy (w glownym oknie)
- void MyWindow::mousePressEvent(QMouseEvent *event)
- {
- x1 = event->x();
- y1 = event->y();
- x1 -= poczX;
- y1 -= poczY;
- update();
- }
- void MyWindow::mouseReleaseEvent(QMouseEvent *event)
- {
- int x2 = event->x();
- int y2 = event->y();
- x2 -= poczX;
- y2 -= poczY;
- double n = 5 ;
- unsigned char *ptr;
- ptr = img->bits();
- int v = 0;
- // for(double t = 0; t <= 2 * 3.1415 ; t+=2 * g){
- for(double t = 0; t <= 2 * M_PI + 0.1; t+= (2 * M_PI) / n){
- x = abs(x1 - x2) * cos(t);
- y = abs(y1 - y2) * sin(t);
- tab[v][0] = x + x1;
- tab[v][1] = y + y1;
- rysuj(tab[v][0],tab[v][1]);
- v++;
- }
- for(int i = 0 ; i < v - 1; i++){
- rysujprosta(tab[i][0],tab[i + 1][0],tab[i][1],tab[i + 1][1]);
- }
- rysujprosta(tab[v - 1][0],tab[0][0],tab[v - 1][1],tab[0][1]);
- update();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement