Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

torrvic, возможно, Вам нужно добавить -lGLU
Извините за тупой вопрос. У меня при сборке Вашего примера выходит ошибка: "undefined reference to gluLookAt". Не могу найти в какой библиотеке находится эта функция. У меня задано: -lGL -lglut ... Искал в /usr/lib таким образом: nm lib*so* | grep...
Здравствуйте. Спасибо за проект. У меня вопрос, по какой причине определение принадлежности точки многоугольнику работает некорректно, если координаты из больших чисел состоят, например: int[] vertex = new int[] {...
Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...

Счетчики и рейтинг

Рейтинг@Mail.ru
Скриншот к примеру
Среда программирования: 
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 кб