![Скриншот к примеру Скриншот к примеру](http://grafika.me/files/screenshot/fullZ.png?1401645809)
Среда программирования:
Qt
Статья по теме:
Заполнить ограниченную область картинки черным цветом с использованием алгоритма поиска в ширину.
Код программы:
// widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPainter> #include <QDebug> #include <memory.h> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; void bfs(int x, int y); // сам поиск в ширину void initPicture(); // отрисовка примитивного изображения void preBfs(QPixmap &mypixmap); // преобразование картинки и запуск поиска в ширину int offsetX[8]; // смещение по Х int offsetY[8]; // смещение по У QPainter paint; // для рисования QImage img; // сама картинка }; #endif // WIDGET_H
// widget.cpp #include "widget.h" #include "ui_widget.h" #include <queue> using namespace std; Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); // заполняем массивы смещений offsetX[0] = -1; offsetX[1] = -1; offsetX[2] = 0; offsetX[3] = 1; offsetX[4] = 1; offsetX[5] = 1; offsetX[6] = 0; offsetX[7] = -1; offsetY[0] = 0; offsetY[1] = -1; offsetY[2] = -1; offsetY[3] = -1; offsetY[4] = 0; offsetY[5] = 1; offsetY[6] = 1; offsetY[7] = 1; // рисуем изображение initPicture(); } Widget::~Widget() { delete ui; } void Widget::preBfs(QPixmap &mypixmap) { img = mypixmap.toImage(); // конвертирование QPixmap в QImage bfs(150,150); // запуск поиска в ширину из точки 150,150 mypixmap.convertFromImage(img); // конвертируем обратно в QPixmap } void Widget::bfs(int startX, int startY) { queue<QPair<int,int> > q; // создаем очередь координат QPair<int,int> tmp(startX,startY); // начальная координата q.push(tmp); // помещаем её в очередь while(!q.empty()) { // пока очередь не пуста QPair<int,int> now = q.front(); // достаем первую координату q.pop(); // и удаляем её из очереди for(int i=0;i<8;++i) { // проходимся по всем смещениям int newX = now.first+offsetX[i]; // пересчитываем координаты int newY = now.second+offsetY[i]; // если координаты не выходят за пределы картинки // и мы не переходим в черную область if(newX>=0 && newY>=0 && newX < img.width() && newY < img.height() && qGray(img.pixel(newX,newY)) != 0) { tmp.first = newX; tmp.second = newY; img.setPixel(newX,newY,0); // заливаем пиксель черным цветом q.push(tmp); // и помещаем точку в очередь } } } } void Widget::initPicture() { QPixmap graph(470,390); // создаем изображение paint.begin(&graph); paint.eraseRect(0,0,470,390); // очищаем изображение paint.drawRect(100,100,200,200); // рисуем прямоугольник paint.end(); // заканчиваем рисовать preBfs(graph); // запускаем preBfs ui->label->setPixmap(graph); // помещаем изображение на форму }
Прикрепленный файл | Размер |
---|---|
Исходный код | 2.85 кб |