Sunteți pe pagina 1din 12

Ministerul Educaieiei al Republicii Moldova

Universitatea de Stat din Moldova


Facultatea de Matematic i Informatic

Lucrare de laborator nr.1


La disciplina Grafica Vectorial
Tema:"Bibliotecile grafice. Funciile de baz."

Efectuat de studentul
grupei IA21: Ghiderman Ion
Verificat de lectorul universitar:
Marin Ghenadie

Chiinu, 2014
Condiiile problemei:

1. Este data funcia y=f(x) i descompunerea funciei n serie numeric.Alctuii n limbajul C++ funcia
(procedur) propriei care depinde de 2 parametri i calculeaz valoare funciei f pentru argumentul dat x cu
precizia dat (epsilon).
2. Creai proiectul de tip SD n MS Visual C++. Adugai n acest proict codul ce desemneaz cu segmente de
linii drepte, graficul funciei f(x) cu culoare indicat pe intervalul dat [a,b], cu pasul dat h, cu precizia dat
(epsilon). Folosind procedura proprie.
3. Adugai n proiect codul care deseneaz cu o alt culoare deasupra primului grafic un grafic punctat al
aceleiai funcii, folosind de data aceasta funcia standard din biblioteca de funcii matematice, graficele trebuie
s coincid.
4. Adugm n proiect codul care creiaz 2 fiiere de tip text cu un nr. egal de linii ce coincide cu nr. de puncte
calculate ale funciei. Primul fiier trebuie s conin pentru fiecare punct valoarea argumentului x, valoarea
funciei proprie, valoare funciei standart, mrimea absolut a diferenei dintre 2 valori calculate a f(x) i valoarea
preciziei epsilon.
Al doilea fiier conine n fiecare linie valoarea argumentului x i valoarea funciei calculat prin procedura
proprie. Nr. n linie se desparte prin spaiu sau virgul.
5. De ncrcat n program specializat de desenare graficilor funciei, al doilea fiier i de construit graficul
funciei, folosind perechile de ordonate din acest fiier.De construit deasupra graficului obinut, graficul aceleiai
funcii, folosind metoda analitic,graficile trebuie s coincid. De analizat rezultatele obinute.

Funcia proprie:

arcctg x= (1)k
k=0

1
, x ( 1, ) .
(2 k +1) x 2 k+1

Simplificarea formulei termenului general.

Calculm

tk
t k +1

,care ne va trebui n program pentru desenarea graficului.

1
1
2 k +1
tk
( 2 k +1 ) x
(2 k +1) x2 k +1 (2 k 1) x 2k 1 ( 2 k1 ) x 2k /x
2k 1
=
=
=
=
=
2 k+1
2k
t k +1
1
1
(2 k +1)x
( 2k + 1) x x (2 k +1) x 2
( 2 ( k1 ) +1 ) x 2( k1)+1 (2 k 1)x 2 k1

Codul surs a programului pentru desenarea graficului.


// ghiderman_lab1View.cpp : implementation of the Cghiderman_lab1View class
#include "stdafx.h"
#include "ghiderman_lab1.h"
#include "math.h"
#include "ghiderman_lab1Doc.h"

#include "ghiderman_lab1View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// Cghiderman_lab1View
IMPLEMENT_DYNCREATE(Cghiderman_lab1View, CView)
BEGIN_MESSAGE_MAP(Cghiderman_lab1View, CView)
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
END_MESSAGE_MAP()
// Cghiderman_lab1View construction/destruction
Cghiderman_lab1View::Cghiderman_lab1View()
{
// TODO: add construction code here
}
double myatan(double x, double eps)
{
int i;
double s,t;
i=0;
t=1/x;
s=1/x;
for(i=1; i<=100; i++)
{
t*=-(2*i-1)/((2*i+1)*x*x);
s+=t;
}return s;
}
Cghiderman_lab1View::~Cghiderman_lab1View()
{
}
BOOL Cghiderman_lab1View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
//

the CREATESTRUCT cs

return CView::PreCreateWindow(cs);
}
// Cghiderman_lab1View drawing
void Cghiderman_lab1View::OnDraw(CDC* pDC)
{

Cghiderman_lab1Doc* pDoc = GetDocument();


ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
double a,b;
// Intervalul de tabulare
a=0.99;
b=10;
double precision=0.0001;
//Cream culorile
COLORREF MYCOSCOLOR = RGB(255,0,0); //rosu
COLORREF STCOSCOLOR = RGB(0,255,0); //verde
//Cream penite
CPen penMyCos(PS_SOLID,1,MYCOSCOLOR);
CPen penAxis (PS_SOLID,1,RGB(0,0,255));
CPen* pOldPen=NULL;
//Determinam coordonatele zonei de desenare
CRect rcClient;
GetClientRect(&rcClient);
//Desenam axele de coordonate
pOldPen=pDC->SelectObject(&penAxis);
//Axa orizontala
pDC->MoveTo(0,rcClient.CenterPoint().y);
pDC->LineTo(rcClient.Width(),rcClient.CenterPoint().y);
//Axa verticala
pDC->MoveTo(rcClient.CenterPoint().x,0);
pDC->LineTo(rcClient.CenterPoint().x,rcClient.Height()-1);
//sageata de sus
pDC->MoveTo(rcClient.CenterPoint().x,0);
pDC->LineTo(rcClient.CenterPoint().x-20,20);
pDC->MoveTo(rcClient.CenterPoint().x,0);
pDC->LineTo(rcClient.CenterPoint().x+20,20);
//sageata din dreapta
pDC->MoveTo(rcClient.Width(),rcClient.CenterPoint().y);
pDC->LineTo(rcClient.Width()-20,rcClient.CenterPoint().y+20);
pDC->MoveTo(rcClient.Width(),rcClient.CenterPoint().y);
pDC->LineTo(rcClient.Width()-20,rcClient.CenterPoint().y-20);
//desenarea graficului prin apelarea funtie myatan
double scalex=80.0;
double scaley=100.0;
unsigned int graphsegments=200;
double x,y,step;
x=a;
step=(b-a)/graphsegments;
y=myatan(x,precision);

pDC->MoveTo(rcClient.CenterPoint().x+(int)(x*scalex),
rcClient.CenterPoint().y-(int)(y*scaley));
pDC->SelectObject(&penMyCos);
for(unsigned int i=1;i<=graphsegments;i++)
{
x+=step;
y=myatan(x,precision);
pDC->LineTo(rcClient.CenterPoint().x+(int)(x*scalex),
rcClient.CenterPoint().y-(int)(y*scaley));
}
//Inscriptie pentru graficul nostru
pDC->SetTextAlign(TA_TOP+TA_RIGHT);
pDC->SetTextColor(MYCOSCOLOR);
pDC->TextOut(rcClient.Width()-1,0,L"y=myatan(x)");
//desenarea graficului arcctg(x) folosind biblioteca math.h
step=0.1;
x=a;
while(x<=b)
{
y=atan(1/x);
pDC->SetPixel(rcClient.CenterPoint().x+(int)(x*scalex)+0,
rcClient.CenterPoint().y-(int)(y*scaley)+0,
STCOSCOLOR);
pDC->SetPixel(rcClient.CenterPoint().x+(int)(x*scalex)-1,
rcClient.CenterPoint().y-(int)(y*scaley)+0,
STCOSCOLOR);
pDC->SetPixel(rcClient.CenterPoint().x+(int)(x*scalex)+1,
rcClient.CenterPoint().y-(int)(y*scaley)+0,
STCOSCOLOR);
pDC->SetPixel(rcClient.CenterPoint().x+(int)(x*scalex)+0,
rcClient.CenterPoint().y-(int)(y*scaley)-1,
STCOSCOLOR);
pDC->SetPixel(rcClient.CenterPoint().x+(int)(x*scalex)+0,
rcClient.CenterPoint().y-(int)(y*scaley)+1,
STCOSCOLOR);
x+=step;
}
//Inscriptie pentru graficul standard
pDC->SetTextAlign(TA_BOTTOM+TA_RIGHT);
pDC->SetTextColor(STCOSCOLOR);
pDC->TextOut(rcClient.Width()-1,rcClient.Height()-1,L"y=arcctg(x)");
//Restabilim penita veche
pDC->SelectObject(pOldPen);

//inscrierea in fisiere
FILE *f1 = fopen("I:f1.txt","w");
FILE *f2 = fopen("I:f2.txt","w");
step=(b-a)/graphsegments;
x=a;
for(unsigned int i=0;i<=graphsegments;i++)
{
fprintf(f1,"%lf | %lf | %lf | %lf | %lf
\n",x,myatan(x,precision),atan(1/x),fabs(myatan(x,precision)- atan(1/x)),precision);
fprintf(f2,"%lf

%lf\n",x ,myatan(x,precision));

x+=step;
}
fclose(f1);
fclose(f2);
}
// Cghiderman_lab1View printing
BOOL Cghiderman_lab1View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void Cghiderman_lab1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void Cghiderman_lab1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
// Cghiderman_lab1View diagnostics
#ifdef _DEBUG
void Cghiderman_lab1View::AssertValid() const
{
CView::AssertValid();
}
void Cghiderman_lab1View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
Cghiderman_lab1Doc* Cghiderman_lab1View::GetDocument() const // non-debug version is inline

{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Cghiderman_lab1Doc)));
return (Cghiderman_lab1Doc*)m_pDocument;
}
#endif //_DEBUG
// Cghiderman_lab1View message handlers

Graficele funciei n urma execuiei programului.

nscrierea datelor funciilor n fiierul f1.txt i f2.txt

Verificare:
Desenm graficele cu ajutorul datelor din fiierele f1.txt i f2.txt cu ajutorul programei GRAFER.

Concluzie:
n urma execuiei programului sunt create 2 fiiere textuale. Analiznd datele din primul fiier observam
diferena dintre valorile funciei calculate cu ajutorul funciilor standart i a funciilor proprii, aceasta nsa nu
depaete valoarea preciziei. Desenarea graficelor cu ajutorul programelor este o metod mult mai exact dect
cea din EXCEL sau GRAFER

S-ar putea să vă placă și