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

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

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

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

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

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

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