
#include "math.h" // математичні функції
#include "afxwin.h"
class CMainWnd : public CFrameWnd
{
public:
CMainWnd();
afx_msg void OnPaint();
private:
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMainWnd,CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
CMainWnd::CMainWnd()
{
Create(NULL,"grafic",WS_OVERLAPPEDWINDOW,rectDefault,
NULL,NULL);
}
float F_(float x)
{
return sin(20*x-10*x*x+x*x*x)*exp(-x+x*x-x*x*x);
};
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
// Побудова графіку
// Область перегляду
int vp_4_x1;
int vp_4_x2;
int vp_4_y1;
int vp_4_y2;
// Задаємо область перегляду
vp_4_x1=50;
vp_4_x2=640;
vp_4_y1=100;
vp_4_y2=240;
float Ksi; // робоча змінна
float x_St;
float x_End;
float dx;
x_St=0; // початок
x_End=1; // кінець
dx=0.01; // крок
float F_min; // мінімум функції
float F_max; // максимум функції
int x,y; // Екранні координати точки
// Шукаємо максимум і мінімум функції
Ksi=x_St;
F_min=F_(Ksi);
F_max=F_(Ksi);
while(Ksi<x_End)
{
if(F_min>F_(Ksi))
{
F_min=F_(Ksi);
};
if(F_max<F_(Ksi))
{
F_max=F_(Ksi);
};
Ksi+=dx;
};
// Робочий цикл
Ksi=x_St;
x=vp_4_x1+(vp_4_x2-vp_4_x1)*(Ksi-x_St)/(x_End-x_St);
y=vp_4_y2-(vp_4_y2-vp_4_y1)*(F_(Ksi)-F_min)/(F_max-F_min);
dc.MoveTo(x,y); // Переносимо точку старту
while(Ksi<x_End)
{
x=vp_4_x1+(vp_4_x2-vp_4_x1)*(Ksi-x_St)/(x_End-x_St);
y=vp_4_y2-(vp_4_y2-vp_4_y1)*(F_(Ksi)-F_min)/(F_max-F_min);
// Лінія
dc.LineTo(x,y);
// Крапка
dc.SetPixel(x,y,RGB(200,0,0));
dc.SetPixel(x+1,y,RGB(200,0,0));
dc.SetPixel(x-1,y,RGB(200,0,0));
dc.SetPixel(x,y+1,RGB(200,0,0));
dc.SetPixel(x,y-1,RGB(200,0,0));
Ksi+=dx;
};
// Зображуємо область перегляду
dc.MoveTo(vp_4_x1,vp_4_y1);
dc.LineTo(vp_4_x2,vp_4_y1);
dc.LineTo(vp_4_x2,vp_4_y2);
dc.LineTo(vp_4_x1,vp_4_y2);
dc.LineTo(vp_4_x1,vp_4_y1);
}
class CGraficApp : public CWinApp
{
public:
CGraficApp();
virtual BOOL InitInstance();
};
CGraficApp::CGraficApp()
{}
BOOL CGraficApp::InitInstance()
{
m_pMainWnd=new CMainWnd();
ASSERT(m_pMainWnd);
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
};
CGraficApp GraficApp;
