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

Вход на сайт

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

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

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

Здравствуйте, Ильгиз. Математика - царица наук (Карл Гаусс). Изучение математики начинается с детского сада, когда нас учат считать и выполнять простые арифметические операции. Любой, даже самый простейший алгоритм будет связан с арифметическими...
Я хотел узнать математика это обязательно в программирование. Пять лет назад просто из любопытства я увлекся HTML потом изучил CSS и JvaScript потом изучил PHP и Java. Как то не задумывался и начал смотреть форумы и узнал что без математики не...
Все верно, но так же необходимо зайти в: Компоновщик -> Ввод -> Дополнительные зависимости Здесь необходимо нажать изменить и в Дополнительные зависимости прописать это: SDL2.lib SDL2main.lib SDL2test.lib Без этого не заработает. (MVS 2015)
Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)

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

Яндекс.Метрика Рейтинг@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 кб