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();
}

