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

Вход на сайт

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

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

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

dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.

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

Рейтинг@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 кб