Описание работы программного продукта




Техническое задание

 

Программный продукт 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 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: