Advertisement
chuuupa

filuha

Nov 30th, 2018
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.93 KB | None | 0 0
  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include "Data.h"
  4. #include "Scene2D.h"
  5.  
  6. LRESULT _stdcall WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);                       
  7. int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)      
  8. {
  9.     WNDCLASS wc;
  10.     wc.style = CS_OWNDC;
  11.     wc.lpfnWndProc = WndProc;                  
  12.     wc.cbClsExtra = 0;
  13.     wc.cbWndExtra = 0;
  14.     wc.hInstance = hInstance;                      
  15.     wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
  16.     wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
  17.     wc.hbrBackground = (HBRUSH)(6);
  18.     wc.lpszMenuName = 0;                           
  19.     wc.lpszClassName = (LPCSTR)"MainWindowClass";  
  20.     RegisterClass(&wc);                            
  21.  
  22.     HWND hWnd = CreateWindow(                      
  23.         (LPCSTR)"MainWindowClass",             
  24.         (LPCSTR)"VTORAYA BLYAT'",                  
  25.         WS_OVERLAPPEDWINDOW,                   
  26.         200,200,800,800,                       
  27.         nullptr,nullptr,hInstance,nullptr);
  28.  
  29.     ShowWindow(hWnd,nCmdShow);
  30.     UpdateWindow(hWnd);
  31.  
  32.     MSG msg;
  33.     while(GetMessage(&msg,nullptr,0,0))            
  34.     {
  35.         TranslateMessage(&msg);
  36.         DispatchMessage(&msg);                 
  37.     }
  38.  
  39.     return 0;
  40. }
  41.  
  42. Scene2D scene(-3, 3, -2, 2);
  43.  
  44. LRESULT _stdcall WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  45. {
  46.     switch(msg)
  47.     {
  48.     case WM_PAINT:
  49.         {
  50.             HDC dc = GetDC(hWnd);
  51.             scene.Clear(hWnd, dc);                     
  52.             scene.PlotAxe(dc);
  53.             scene.ThirdMethodFuncPlot(dc);
  54.             scene.PlotContinue(dc);
  55.             ReleaseDC(hWnd, dc);
  56.             return DefWindowProc(hWnd,msg,wParam,lParam);
  57.         }
  58.  
  59.     case WM_SIZE:
  60.         {
  61.             HDC dc = GetDC(hWnd);
  62.             scene.SetResolution(hWnd, dc);
  63.             ReleaseDC(hWnd,dc);
  64.             InvalidateRect(hWnd,nullptr,false);
  65.             return 0;
  66.         }
  67.     case WM_LBUTTONDOWN:
  68.     {
  69.         scene.startDragging(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
  70.         return 0;
  71.     }
  72.     case WM_MOUSEMOVE:
  73.     {
  74.         if (scene.IsDragging())
  75.         {
  76.             scene.dragging(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
  77.             InvalidateRect(hWnd, nullptr, false);
  78.         }
  79.         return 0;
  80.     }
  81.     case WM_LBUTTONUP:
  82.     {
  83.         scene.StopDragging();
  84.         return 0;
  85.     }
  86.     case WM_MOUSEWHEEL:
  87.     {
  88.         POINT P;
  89.         P.x = GET_X_LPARAM(lParam);
  90.         P.y = GET_Y_LPARAM(lParam);
  91.         ScreenToClient(hWnd, &P);
  92.  
  93.         bool delta = (GET_WHEEL_DELTA_WPARAM(wParam) >= 0) ? true : false;
  94.         scene.Zooming(delta, P.x, P.y);
  95.         InvalidateRect(hWnd, nullptr, false);
  96.         return 0;
  97.  
  98.     }
  99.     case WM_DESTROY:
  100.     {
  101.         PostQuitMessage(0);
  102.         return 0;
  103.     }
  104.     default:
  105.         {
  106.             return DefWindowProc(hWnd, msg, wParam, lParam);
  107.         }
  108.     }
  109.     return 0;
  110. }
  111.  
  112. #ifndef SCENE_2D_H
  113. #define SCENE_2D_H
  114.  
  115. #include "Camera2D.h"
  116.  
  117. class Scene2D : public Camera2D {
  118.  
  119. public:
  120.     Scene2D(double L, double R, double B, double T) : Camera2D(L, R, B, T) {}
  121.  
  122.     void PlotAxe(HDC dc)
  123.     {
  124.         HPEN hPen;
  125.  
  126.         hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
  127.  
  128.         SelectObject(dc, hPen);
  129.         Axes(dc);
  130.        
  131.         createCoords();
  132.     }
  133.  
  134.     void FirstMethodFuncPlot(HDC dc)
  135.     {
  136.         createMassD();
  137.     }
  138.     void SecondMethodFuncPlot(HDC dc)
  139.     {
  140.         CreateMassD_();
  141.     }
  142.     void ThirdMethodFuncPlot(HDC dc)
  143.     {
  144.         CreateMassD__();
  145.     }
  146.  
  147.     void PlotContinue(HDC dc)
  148.     {
  149.         HPEN uPen, sPen;
  150.  
  151.         uPen = CreatePen(PS_DOT, 2, RGB(255, 0, 0));
  152.         sPen = CreatePen(PS_DOT, 2, RGB(0, 0, 255));
  153.  
  154.         SelectObject(dc, uPen);
  155.  
  156.         double u = (R - L) / W, // исходная функция
  157.             x = L;
  158.         MoveTo(x, expr);
  159.         while (x <= R)
  160.         {
  161.             x += u;
  162.             LineTo(dc, x, expr);
  163.         }
  164.  
  165.         SelectObject(dc, sPen);
  166.  
  167.         double k = (R - L) / W, // многочлен
  168.             t = L;
  169.         MoveTo(t, newton(t));
  170.         while (t <= R)
  171.         {
  172.             t += k;
  173.             LineTo(dc, t, newton(t));
  174.         }
  175.     }
  176. };
  177.  
  178. #endif SCENE_2D_H
  179.  
  180.  
  181. #ifndef CAMERA_2D_H
  182. #define CAMERA_2D_H
  183.  
  184. #include <windows.h>
  185.  
  186. class Camera2D
  187. {
  188. protected:
  189.     double z;
  190.     double oldl, oldr;
  191.     double L, R, B, T;             
  192.     int W, H;                          
  193.     int WorldToScreenX(double X)   
  194.     {
  195.         return (int)((X - L) / (R - L)*W);
  196.     }
  197.     int WorldToScreenY(double Y)   
  198.     {
  199.         return (int)((T - Y) / (T - B)*H);
  200.     }
  201.     double ScreenToWorldX(int X)   
  202.     {
  203.         return L + (R - L)*((double)X + 0.5) / (double)W;
  204.     }
  205.     double ScreenToWorldY(int Y)   
  206.     {
  207.         return T + (B - T)*((double)Y + 0.5) / (double)H;
  208.     }
  209. private:
  210.     bool isdragging;
  211.     double dx, dy;
  212.     int x_, y_;
  213.     double posX, posY;;    
  214. public:
  215.     Camera2D(double L, double R, double B, double T) : L(L), R(R), B(B), T(T)
  216.     {
  217.     }
  218.     void Clear(HWND hWnd, HDC dc)
  219.     {
  220.         RECT rect;
  221.         GetClientRect(hWnd, &rect);
  222.         FillRect(dc, &rect, (HBRUSH)(COLOR_WINDOW + 1));
  223.  
  224.     }
  225.     void SetResolution(HWND hwnd, HDC dc)
  226.     {
  227.         RECT rect;
  228.         GetClientRect(WindowFromDC(dc), &rect);
  229.         W = rect.right + 1;
  230.         H = rect.bottom + 1;
  231.        
  232.         if (oldr == oldl == 0.0)
  233.         {
  234.             oldr = R; oldl = L;
  235.         }
  236.         else
  237.         {
  238.             L = (oldr + oldl) / 2 - (T - B) / 2 * W / H;
  239.             R = (oldr + oldl) / 2 + (T - B) / 2 * W / H;
  240.         }
  241.     }
  242.     void MoveTo(double X, double Y)
  243.     {
  244.         posX = X;
  245.         posY = Y;
  246.     }
  247.     void LineTo(HDC dc, double X, double Y)
  248.     {
  249.         ::MoveToEx(dc, WorldToScreenX(posX), WorldToScreenY(posY), NULL);
  250.         ::LineTo(dc, WorldToScreenX(X), WorldToScreenY(Y));
  251.         MoveTo(X, Y);
  252.     }
  253.     void Axes(HDC dc)
  254.     {
  255.         MoveTo(L, 0);
  256.         LineTo(dc, R, 0);
  257.         MoveTo(0, B);
  258.         LineTo(dc, 0, T);
  259.     }
  260.     void OtherShit(HDC dc)
  261.     {
  262.        
  263.     }
  264.     void startDragging(int x, int y)
  265.     {
  266.         isdragging = true;
  267.         x_ = x;
  268.         y_ = y;
  269.     }
  270.     void dragging(int x, int y)
  271.     {
  272.         dx = x - x_;
  273.         dy = y - y_;
  274.  
  275.         L = L - (R - L)*dx / W;
  276.         R = R - (R - L)*dx / W;
  277.         B = B + (T - B)*dy / H;
  278.         T = T + (T - B)*dy / H;
  279.        
  280.         x_ = x;
  281.         y_ = y;
  282.     }
  283.     void StopDragging()
  284.     {
  285.         isdragging = false;
  286.     }
  287.     bool IsDragging()
  288.     {
  289.         return isdragging;
  290.     }
  291.     void Zooming(bool increase, int X, int Y)
  292.     {
  293.         double k = 1.0;
  294.         X = ScreenToWorldX(X);
  295.         Y = ScreenToWorldY(Y);
  296.         if (increase)
  297.             k = 1.1;
  298.         else k = 0.9;
  299.  
  300.         L = X - (X - L) / k;
  301.         R = X + (R - X) / k;
  302.         B = Y - (Y - B) / k;
  303.         T = Y + (T - Y) / k;
  304.     }
  305. };
  306.  
  307. #endif CAMERA_2D_H
  308.  
  309.  
  310. #define _USE_MATH_DEFINES
  311.  
  312. #include <vector>
  313. #include <cmath>
  314.  
  315. using namespace std;
  316.  
  317. const int n = 6; // степень многочлена
  318.  
  319. const int a = -2, b = 1; // границы интервала
  320. double h = static_cast<double>(b - a) / n; // приращение узлов интерполяции
  321.  
  322. #define expr (1+x+x*x)/(1+x*x+x*x*x*x) // исходная функция
  323.  
  324. double* xCoords = new double[n + 1], // создание массивов узлов интерполяции и значений выражения в них
  325.       * yCoords = new double[n + 1];
  326.  
  327. void createCoords() { // заполнение массивов
  328.  
  329.     int i = 0;
  330.     for (double x = a; x <= b; x += h) {
  331.         *(xCoords + i) = x;
  332.         *(yCoords + i) = expr;
  333.         i++;
  334.     }
  335. }
  336.  
  337. double* massD = new double[n + 1]; // массив коэфицентов d
  338.  
  339. void createMassD() { // и тут заполнение
  340.  
  341.     *(massD + 0) = *(yCoords + 0); // d0 =  f(x0)
  342.  
  343.     for (int j = 1; j < n; j++)
  344.         for (int i = 0; i < n - j; i++) {
  345.  
  346.             *(yCoords + i) = (*(yCoords + i + 1) - *(yCoords + i)) / (*(xCoords + i + j) - *(xCoords + i)); // магия копипасты
  347.             *(massD + j) = *(yCoords + 0);
  348.         }
  349. }
  350.  
  351. void CreateMassD_() { // и тут заполнение
  352.  
  353.     massD[0] = yCoords[0]; // d0 = f(x0)
  354.  
  355.     vector<vector<double> > vec(n + 1, vector<double>(n + 1, 0));
  356.  
  357.     int t = 1, k = n - 1;
  358.     for (int i = 0; i <= n; i++)
  359.         vec[0][i] = yCoords[i];
  360.     for (int i = 1; i <= n; i++) {
  361.         for (int j = 0; j <= k; j++)
  362.             vec[i][j] = (vec[i - 1][j] - vec[i - 1][j + 1]) / (xCoords[j] - xCoords[j + t]);
  363.         t++;
  364.         k--;
  365.     }
  366.     for (int i = 1; i <= n; i++)
  367.         massD[i] = vec[i][0];
  368. }
  369.  
  370. void CreateMassD__() { // и тут заполнение
  371.  
  372.     double y = 1.0, u = 0.0;
  373.     int e = 1;
  374.  
  375.     massD[0] = yCoords[0]; // d0 = f(x0)
  376.  
  377.     for (int m = 1; m <= n; m++) {
  378.         for (int i = 0; i <= m; i++) {
  379.             for (int j = 0; j <= m, j != i; j++)
  380.                 y *= 1 / (xCoords[i] - xCoords[j]);
  381.             y *= yCoords[i];
  382.             u += y;
  383.             y = 1.0;
  384.         }
  385.         massD[e] = u;
  386.         u = 0.0;
  387.         e++;
  388.     }
  389. }
  390. double newton(double x_) { // тут считаем значения Pn(x)
  391.  
  392.     double value = *(massD + 0), p = 1;
  393.    
  394.     for (int i = 1; i < n; i++) {
  395.  
  396.         p = p * (x_ - *(xCoords + i - 1));
  397.         value += *(massD + i) * p;
  398.     }
  399.     return value;
  400. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement