Описание работы программного продукта
Техническое задание
Программный продукт GRAPHIC позволяет строить и сохранять графики любых функций одной переменной. Продукт разработан на языке программирования Мicrosoft Visual C++ 6.0 с использованием объектно-ориентированной методологии. Диалог пользователя с программой, а именно введение параметров, осуществляется посредством диалоговых окон программы. Диапазон вводимых значений программно ограничен, с целью недопущения некорректной работы или возникновения ошибки.
Общая блок-схема алгоритма
Общая блок схема алгоритма программы GRAPHIC:
Описание работы программного продукта
Программа “GRAPHIC” позволяет строить и сохранять графики функций одной переменной. При открытии программы появляется окно, в котором уже по умолчанию построен график функции f(x)=sin(x)+0.05*x на отрезке [-5,10]. Выбрав на панели меню пункт Функция, и, изменяя поле ввода в появившемся диалоговом окне, можно построить необходимый график функции или изменить отрезок, на котором построен график. Для того, чтобы лучше понять работу программы приведем некоторые коды
class CGRAPHICView : public CView //Класс Single Document { public: CString sFunc; double XX; double X1; double X2; int SdvX; int SdvY; int DlX; int DlY; CDC* pDCbuf; bool GbNeedRepaint; CMFunc vFunc; CFuncEval FuncEval; void Vichislenie(); void VFillBuffer (CDC* pSrcDC); //Остальные свойства и методы класса Single Document }; class CMFunc //Класс расчета функции { public: double FXX[400]; double FYY[400]; bool FYYER[400]; int KolT; double MinY; double MaxY; void FuncMaxMinY(); CMFunc(); }; void CGRAPHICView::OnDraw(CDC* pDC) //Функция прорисовки документа { CGRAPHICDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here try { VFillBuffer(pDC); } catch (...) { MessageBox(_T("Ошибка построения графика!"),_T("Ошибка")); } } void CGRAPHICView::Vichislenie() //Функция вычисления параметров функции { int a; double shag; extern BOOL bMathError; FuncEval.SetString(sFunc); //Вычисляем шаг shag shag=((X2-X1)/(vFunc.KolT-1)); //Вычисляем узлы функции vFunc.FXX[a] for(a=0;a<(vFunc.KolT-1);a++) vFunc.FXX[a]=X1+a*shag; vFunc.FXX[vFunc.KolT-1]=X2; //Вычисляем значения функции в узлах vFunc.FYY[a] и ошибку вычисления vFunc.FYYER[a] for(a=0;a<vFunc.KolT;a++) { bMathError = FALSE; XX=vFunc.FXX[a]; vFunc.FYY[a] = FuncEval.Compute (); vFunc.FYYER[a] = bMathError; } //Вычисляем max и min значения функции vFunc.MaxY и vFunc.MinY vFunc.FuncMaxMinY(); } void CGRAPHICView::VFillBuffer (CDC* pSrcDC) //Функция рисования графика { int OtstX; int OtstY; int DlOX; int DlOY; int KolLX; int KolLY; SdvX=30; SdvY=30; DlX=700; DlY=370; OtstX=80; OtstY=30; DlOX=DlX-OtstX-50; DlOY=DlY-2*OtstY; KolLX=10; KolLY=10; double KoefX; double KoefY; int a; double d,dd; CString sss; if(GbNeedRepaint==TRUE) { //Вычисление параметров функции (объект vFunc класса CMFunc) Vichislenie(); //??????????????????????????????????????????????? pDCbuf->DeleteDC (); pDCbuf->CreateCompatibleDC (pSrcDC); CBitmap bitmap; bitmap.CreateCompatibleBitmap(pSrcDC,DlX,DlY); CBitmap* pbmp=pDCbuf->SelectObject(&bitmap);
//Рисование графика------------------------------------------------- //Цвета (разметки (линий) - cvet1, осей - cvet2, графика - cvet3) CPen cvet1(PS_SOLID,1,RGB(100,100,50)); CPen cvet2(PS_SOLID,1,RGB(200,0,200)); CPen cvet3(PS_SOLID,1,RGB(255,0,0)); //Отключаем фон текста и устанавливаем цвет текста pDCbuf->SetBkMode(TRANSPARENT); pDCbuf->SetTextColor(RGB(0,0,210)); //Закрашиваем область графика pDCbuf->FillSolidRect(0,0,DlX,DlY,RGB(235,235,235)); //Рисование разметки X pDCbuf->SelectObject(cvet1); d=((double)DlOX/(KolLX-1)); for(a=0;a<KolLX;a++) { pDCbuf->MoveTo(OtstX+(int)(a*d),OtstY); pDCbuf->LineTo(OtstX+(int)(a*d),OtstY+DlOY); } //Рисование разметки Y d=((double)DlOY/(KolLY-1)); for(a=0;a<KolLY;a++) { pDCbuf->MoveTo(OtstX,OtstY+(int)(a*d)); pDCbuf->LineTo(OtstX+DlOX,OtstY+(int)(a*d)); } //Подписи X d=(X2-X1)/(KolLX-1); dd=((double)DlOX/(KolLX-1)); for(a=0;a<(KolLX-1);a++) { sss.Format(_T("%.3f"),X1+a*d); pDCbuf->TextOut(OtstX+(int)(a*dd)-4*sss.GetLength(),OtstY+DlOY+3,sss); } sss.Format(_T("%.3f"),X2); a=KolLX-1; pDCbuf->TextOut(OtstX+(int)(a*dd)-4*sss.GetLength(),OtstY+DlOY+3,sss); //Подписи Y d=(vFunc.MaxY-vFunc.MinY)/(KolLY-1); dd=((double)DlOY/(KolLY-1)); for(a=1;a<(KolLY-1);a++) { sss.Format(_T("%.3f"),vFunc.MinY+a*d); pDCbuf->TextOut(OtstX-3-7*sss.GetLength(),OtstY+DlOY-(int)(a*dd)-7,sss); } sss.Format(_T("%.3f"),vFunc.MinY); pDCbuf->TextOut(OtstX-3-7*sss.GetLength(),OtstY+DlOY-12,sss); sss.Format(_T("%.3f"),vFunc.MaxY); a=KolLY-1; pDCbuf->TextOut(OtstX-3-7*sss.GetLength(),OtstY+DlOY-(int)(a*dd)-7,sss); //Подпись "График функции..." sss.Format(_T(" на отрезке [%.2f,%.2f]"),X1,X2); pDCbuf->TextOut(OtstX+80-2*sFunc.GetLength(),OtstY-25,(_T("График функции f(x)=")+sFunc+sss)); //Вычисления коэффициентов сжатия на экране KoefX и KoefY KoefX=((double)DlOX)/(X2-X1); KoefY=((double)DlOY)/(vFunc.MaxY-vFunc.MinY); //Рисование осей X и Y pDCbuf->SelectObject(cvet2); if(X1<=0&&X2>=0) { pDCbuf->MoveTo(OtstX-(int)(X1*KoefX),OtstY); pDCbuf->LineTo(OtstX-(int)(X1*KoefX),OtstY+DlOY); } if(vFunc.MinY<=0&&vFunc.MaxY>=0) { pDCbuf->MoveTo(OtstX,OtstY+DlOY+(int)(KoefY*vFunc.MinY)); pDCbuf->LineTo(OtstX+DlOX,OtstY+DlOY+(int)(KoefY*vFunc.MinY)); } //Рисование самого графика функции pDCbuf->SelectObject(cvet3); for(a=1;a<vFunc.KolT;a++) { if(vFunc.FYYER[a-1]==FALSE&&vFunc.FYYER[a]==FALSE) { pDCbuf->MoveTo(OtstX+(int)(KoefX*(vFunc.FXX[a-1]-X1)),OtstY+DlOY-(int)(KoefY*(vFunc.FYY[a-1]-vFunc.MinY))); pDCbuf->LineTo(OtstX+(int)(KoefX*(vFunc.FXX[a]-X1)),OtstY+DlOY-(int)(KoefY*(vFunc.FYY[a]-vFunc.MinY))); } } //------------------------------------------------------------------ GbNeedRepaint=FALSE; } //Копирование буфера pDCbuf на экран pSrcDC->BitBlt (SdvX, SdvY, DlX, DlY, pDCbuf, 0, 0, SRCCOPY); } void CGRAPHICView::OnFileSave() //Функция сохранения графика { HRESULT hResult; CString strFilter; strFilter = "PNG image (*.png)|*.png||"; CFileDialog dlg(FALSE,_T("png"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER,strFilter); hResult = (int)dlg.DoModal(); if (hResult != IDOK) {MessageBox("Отменено пользователем","Предупреждение"); return;}
CString strFileName; strFileName = dlg.m_ofn.lpstrFile; CImage imgOriginal; imgOriginal.Create (DlX, DlY, 24); //Это позволяет нарисовать все что должно быть сохранено (pDCbuf->FromHandle (imgOriginal.GetDC ()))->BitBlt (0, 0, DlX, DlY, pDCbuf, 0, 0, SRCCOPY); hResult = imgOriginal.Save(strFileName); try { imgOriginal.ReleaseDC (); imgOriginal.Detach (); imgOriginal.Destroy (); } catch (...) { } if (FAILED(hResult)) { MessageBox("Ошибка сохранения!","Ошибка!"); } }
Популярное: Почему стероиды повышают давление?: Основных причин три... Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (214)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |