ICQ - форум. Всё про ICQ.  

Вернуться   ICQ - форум. Всё про ICQ. > Мастерская > Программирование > Статьи

 
 
Опции темы Оценить тему
Старый 10.01.2010, 19:30   #1
Почти участник
 
Регистрация: 02.02.2008
Сообщений: 1,843

Репутация: 5599
По умолчанию Строим графики на Qt

Привет, сегодня я расскажу, как написать программу, строящую графики математичиских функций в пространстве R2.

Однажды мне понадобилось построить график нефиговой функции, точно ее не помню, но там было что-то вроде 2x^3 + 18sin(x) – 15 arctg(x). Руками просчитывать каждую точку совсем не хотелось, доступа к интернету не было, но зато был нетбук с установленным Qt SDK.

Итак, запускаем Qt Creator, жмем Ctrl-N, выбираем Qt 4 GUI Application. Откроется новый проект, выбирай в древе проекта пункт «Формы», там будет MainWindow.ui, открывай его. Перед тобой главный виджет приложения. Кидай на него 3 Label'а, 3 DoubleSpinBox'a, 1 PushButton, 1 Horizontal Line и 1 GraphicsView. Далее выбирай в редакторе, удерживая Ctrl, все лэйблы и спинбоксы, щелкай правой кнопкой → компоновка → Layout in grid. Создастся новый Layout, который выровняет все виджеты наилучшим образом. Далее выбирай (с Ctrl) этот лэйаут и PushButton, щелкай правой кнопкой → Компоновка → Lay out Horizontally. Ну и напоследок, щелкни по главному виджету правой кнопкой → Layout Vertically. Должно получиться, как на рисунке.
Нажмите на изображение для увеличения
Название: 1.JPG
Просмотров: 603
Размер:	12.0 Кб
ID:	14834

Поясняю. Layout'ы — менеджеры компоновки виджетов в Qt, которые автоматически компонуют их и, при изменении размеров главного виджета так же автоматически перестраивают все остальные. Очень удобная и полезная штука в общем.
Теперь переименуй спинбоксы, кнопку и GraphicsView следующим образом:
  • minDbSB
  • maxDbSB
  • stepDbSB
  • doBtn
  • graphGV
Не забудь у спинбоксов сделать минимальные и максимальные значения побольше.

Переходим к кодингу. Кода будет немного, это же Qt =)
Щелкни по doBtn правой кнопкой → перейти к слоту → clicked(). Откроется редактор кода. Предположим, что нам надо построить график функции y = 2x^2 + 3x – 4. График функции — парабола, ветви вверх. Прописываем в заголовочном файле, в классе в разделе private новый метод - double countY(const double &x). Размер типа double – 8 байт => имеет смысл передавать его по констатной ссылке. В .cpp мы реализуем этот метод:

PHP код:
double MainWindow::countY(const double &x)
{
    return ( 
);

Чтобы построить систему координат, нужно найти экстремумы функции. Добавляем еще 2 метода.

PHP код:
// Find minimum of func
double MainWindow::findYMin()
{
    
double dxCurr dxMin;
    
double dyCurr;
    
double dyMin 100500;

    while ( 
dxCurr <= dxMax ){
        
dyCurr countY(dxCurr);
        if ( 
dyCurr dyMin )
            
dyMin dyCurr;
        
dxCurr += dxStep;
    }
    return 
dyMin;
}

// Find maximum of func
double MainWindow::findYMax()
{
    
double dxCurr dxMin;
    
double dyCurr;
    
double dyMax = -100500;

    while ( 
dxCurr <= dxMax ){
        
dyCurr countY(dxCurr);
        if ( 
dyCurr dyMax )
            
dyMax dyCurr;
        
dxCurr += dxStep;
    }
    return 
dyMax;

Ну и собственно приступаем к построению графика.

PHP код:
dxMin ui->minDbSB->value();
dxMax ui->maxDbSB->value();
dxStep ui->stepDbSB->value(); 
Эти переменные мы объявили в хедере (см. исходник).

Ищем минимумы и максимумы, а также определяем, где у нас находится точка (0, 0).

PHP код:
double dyMin findYMin();
double dyMax findYMax();
dyZero = (dyMax dyMin) / 2;
dxZero = (dxMax dxMin) / 2
Создаем новую сцену, которая потом будет присвоена к GraphicsView.
QGraphicsScene *scene = new QgraphicsScene(ui->graphGV);

Рисуем оси

PHP код:
QPen pen(Qt::green); // Рисовать будем зеленым цветом
scene->addLine((dxMin 3) * iCoffdyZero iCoff, (dxMax 3) * iCoffdyZero iCoffpen); // Рисуем Ox
scene->addLine(dxZero iCoffdyMin iCoffdxZero iCoffdyMax iCoffpen); // Рисуем Oy 
Просчитываем точки графика:

PHP код:
pen.setColor(Qt::red);
double dxPrevdyPrevdxCurrdyCurr;
    while ( 
dxMin dxMax ){
        
dxPrev dxMin;
        
dyPrev countY(dxMin);
        
dxMin += dxStep;
        
dxCurr dxMin;
        
dyCurr countY(dxMin);
        
scene->addLine((dxZero dxPrev) * iCoff, (dyZero dyPrev) * iCoff,
                       (
dxZero dxCurr) * iCoff, (dyZero dyCurr) * iCoffpen);
    } 
Ну и устанавливаем сцену для GraphicsView

PHP код:
ui->graphGV->setScene(scene); 

Все, приложение строит графики на ура, на его написание у меня ушло около 15 минут, пользовался только мозгом и встроенным хелпом.
Если нужно изменить функцию — меняй ее в countY(). Чем меньше будет шаг — тем более гладким будет график, но функция будет считаться дольше.
Вопросы и замечания оставляйте в теме.
Вложения
Тип файла: zip QGraphics.zip (10.2 Кб, 560 просмотров)

Последний раз редактировалось RankoR; 10.01.2010 в 19:35.
RankoR вне форума  
Плюсанул RankoR :
 

Опции темы
Оценка этой теме
Оценка этой теме:

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 17:58.


Перевод: zCarot
Форум Асечников © Asechka.RU

Новости Сочи