Nadesłany przez Andrzej Borucki, 27 stycznia 2012 00:06
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
window.cpp:
/**************************************************************************** Andrzej Borucki www.algorytm.org Algorytm kreslenia okregow ****************************************************************************/ #include <QtGui> #include <windows.h> #include "window.h" Window::Window() : QWidget() { label = new QLabel(tr("Image")); QGridLayout *layout = new QGridLayout; btn1 = new QPushButton("std"); btn2 = new QPushButton("bresenham"); layout->addWidget(btn1, 0, 1); layout->addWidget(btn2, 1, 1); layout->addWidget(label, 0, 0); setLayout(layout); connect( btn1, SIGNAL(clicked()), SLOT(draw_clicked()) ); connect( btn2, SIGNAL(clicked()), SLOT(bresenham_clicked()) ); } int W,H; uchar *bits; int bytesPerLine; void SetPixel(int x, int y, int color) { if ((x >= 0) && (y >= 0) && (x < W) && (y < H)) { uchar* p = bits + y * bytesPerLine + x * 4; *((int*)p) = color; } } void CirclePoints(int x, int y, int x0, int y0, int color) { SetPixel(x+x0, y+y0, color); SetPixel(y+x0, x+y0, color); SetPixel(y+x0, -x+y0, color); SetPixel(x+x0, -y+y0, color); SetPixel(-y+x0, -x+y0, color); SetPixel(-x+x0, -y+y0, color); SetPixel(-y+x0, x+y0, color); SetPixel(-x+x0, y+y0, color); } void bresenham_circle(int x0, int y0, int radius, int color) { int x, y, d; x = 0; y = radius; d = 5 - 4 * radius; CirclePoints(x, y, x0, y0, color); while (y > x) { if (d < 0) { /* Select E */ d += x * 8 + 12; x++; } else { /* Select SE */ d += (x - y) * 8 + 20; x++; y--; } CirclePoints(x, y, x0, y0, color); } } void Window::draw_clicked() { btn1->setEnabled(false); QImage myImage(100,100,QImage::Format_RGB32); QPainter p; p.begin(&myImage); p.setPen(QPen(QColor(Qt::color1))); p.setBrush(QBrush(QColor(Qt::color0), Qt::NoBrush)); LARGE_INTEGER n1,n2,f; QueryPerformanceCounter(&n1); for(int i=0; i<100*1000; i++) { QPoint center(50,50); int r = rand()%50; p.drawEllipse(center,r,r); } QueryPerformanceCounter(&n2); p.end(); btn1->setEnabled(true); label->setPixmap(QPixmap::fromImage(myImage)); QueryPerformanceFrequency(&f); QMessageBox msgBox; msgBox.setText("time "+QString::number(double(n2.QuadPart-n1.QuadPart)/f.QuadPart)); msgBox.exec(); } void Window::bresenham_clicked() { QImage myImage(100,100,QImage::Format_RGB32); bits = myImage.bits(); bytesPerLine = myImage.bytesPerLine(); W = myImage.width(); H = myImage.height(); LARGE_INTEGER n1,n2,f; QueryPerformanceCounter(&n1); for(int i=0; i<100*1000; i++) { bresenham_circle(50, 50, rand()%50, 255); } QueryPerformanceCounter(&n2); label->setPixmap(QPixmap::fromImage(myImage)); QueryPerformanceFrequency(&f); QMessageBox msgBox; msgBox.setText("time "+QString::number(double(n2.QuadPart-n1.QuadPart)/f.QuadPart)); msgBox.exec(); }