diff --git a/QT/bezier_1/mywindow.cpp b/QT/bezier_1/mywindow.cpp index 4d8bf57..5f6bbb9 100644 --- a/QT/bezier_1/mywindow.cpp +++ b/QT/bezier_1/mywindow.cpp @@ -106,27 +106,8 @@ void MyWindow::on_cleanButton_clicked() // obszaru rysowania 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; ibutton() == Qt::LeftButton ? Add : event->button() == Qt::RightButton ? Move : Move; int id = -1; switch(event->button()){ case Qt::LeftButton: @@ -239,7 +219,7 @@ int MyWindow::FindPoint(int x, int y, float radius){ float min_dist = FLT_MAX; int min_id = -1; for(int i = 0; i < bezier_points.size(); i++){ - float dist = src_point - (Point)(bezier_points[i]); + float dist = (src_point - (Point)(bezier_points[i])).length(); if(dist < min_dist && dist < radius){ min_id = i; min_dist = dist; @@ -309,9 +289,6 @@ void MyWindow::DrawCircle(int x1, int y1, int x2, int y2){ UpdateTempImage(); - unsigned char *ptr; - ptr = img_tmp->bits(); - float R = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)); int q_last_x = R / sqrt(2) + 1; @@ -370,21 +347,41 @@ void MyWindow::DrawBezier(){ DrawPixel(img, bezier_points[i].x, bezier_points[i].y); } for(int i = 1; i < bezier_points.size(); i+=3){ - if(i + 3 <= bezier_points.size()){ - for(int j = i; j < i + 3; j++){ - Point p1 = bezier_points[j-1]; - Point p2 = bezier_points[j]; + if(i + 2 >= bezier_points.size()) + break; + Point p0 = bezier_points[i - 1]; + Point p1 = bezier_points[i]; + Point p2 = bezier_points[i + 1]; + Point p3 = bezier_points[i + 2]; - DrawLine(p1.x, p1.y, p2.x, p2.y, img); - } + + Point last_point = p0; + for(int i = 1; i <= segment_count; i++){ + float t = (float(i) / segment_count); + + Point P = + p0 * (float)pow(1.0f - t, 3) + + p1 * 3.0f * (float)pow(1.0f - t, 2) * t + + p2 * 3.0f * (1.0f - t) * (float)pow(t, 2) + + p3 * (float)pow(t, 3); + + DrawLine(last_point.x, last_point.y, P.x, P.y, img); + + last_point = P; } } } void MyWindow::ClearImage(QImage *img){ + unsigned char* empty_val = (unsigned char*)malloc(4); + empty_val[0] = 0; + empty_val[1] = 0; + empty_val[2] = 0; + empty_val[3] = 255; + unsigned char* ptr = img->bits(); for(int i = 0; i < img->width(); i++){ for(int j = 0; j < img->height(); j++){ - DrawPixel(img, i, j, QColor(0,0,0)); + memcpy(ptr + 4 * (i + j * img->width()), empty_val, 4); } } } diff --git a/QT/bezier_1/mywindow.h b/QT/bezier_1/mywindow.h index 64edeb2..6a94449 100644 --- a/QT/bezier_1/mywindow.h +++ b/QT/bezier_1/mywindow.h @@ -45,12 +45,26 @@ struct Point{ this->y=y; } - float operator-(const Point& other){ - float x = other.x - this->x; - float y = other.y - this->y; + float length(){ float mag = std::sqrt(std::pow(x, 2) + std::pow(y, 2)); return mag; } + + Point operator-(const Point& other){ + return Point(this->x - other.x, this->y - other.y); +// float x = other.x - this->x; +// float y = other.y - this->y; +// float mag = std::sqrt(std::pow(x, 2) + std::pow(y, 2)); +// return mag; + } + + Point operator*(const float mul){ + return Point(this->x * mul, this->y * mul); + } + + Point operator+(const Point& other){ + return Point(this->x + other.x, this->y + other.y); + } }; // MyWindow jest podklasa klasy QMainWindow.