algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Kreślenie okręgów - Implementacja w C/C++
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
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();
}
Dodaj komentarz