Advertisement
LisDim

Draw Graphic

Nov 1st, 2014
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <windows.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4.  
  5. #define TIMER_INT 10
  6. #define WINDOW_W 640
  7. #define WINDOW_H 480
  8. #define WINDOW_X_COR 20
  9. #define WINDOW_Y_COR 60
  10. #define MAX_COUNT 1001
  11. #define AMPLITUDE 2.0
  12. #define FREQUENCY 5.0
  13. #define PI 3.1415926535
  14. #define GR_COLOR RGB(255, 0, 0)
  15. #define REC_COLOR RGB(0, 0, 0)
  16. #define LINE_WIDTH 2
  17. #define OFFSET 25
  18. #define RESOLURION 6
  19.  
  20. int TimerID = 1;
  21. int x[MAX_COUNT], y[MAX_COUNT];
  22. int count_of_points = 0;
  23. int xView, yView;
  24. float y_max = 0;
  25.  
  26. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  27. void DrawArray(HWND& hwnd, HDC& hdc, PAINTSTRUCT& ps, int* x, int* y, const int count_of_points);
  28. void CalcGraph(int* x, int* y, const int count_of_points);
  29. void TestTimer(HWND& hwnd);
  30. int FindMax(const int* arr, const int n);
  31. int FindMin(const int* arr, const int n);
  32.  
  33. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  34. {
  35.     const char g_szClassName[] = "Lab3WindowClass";
  36.     const char WinName[] = "Лабаратораная работа 3 - Лисин, Никифоров";
  37.  
  38.     WNDCLASSEX wc;
  39.  
  40.     wc.cbSize = sizeof(WNDCLASSEX);
  41.     wc.style = 0;
  42.     wc.lpfnWndProc = WndProc;
  43.     wc.cbClsExtra = 0;
  44.     wc.cbWndExtra = 0;
  45.     wc.hInstance = hInstance;
  46.     wc.hIcon = NULL;
  47.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  48.     wc.hbrBackground = (HBRUSH)WHITE_PEN;
  49.     wc.lpszMenuName = NULL;
  50.     wc.lpszClassName = g_szClassName;
  51.     wc.hIconSm = NULL;
  52.  
  53.     if (!RegisterClassEx(&wc)){
  54.         MessageBox(NULL, "Win Reg Failed!", "Error", MB_ICONEXCLAMATION | MB_OK);
  55.         return 0;
  56.     }
  57.  
  58.     HWND hwnd;
  59.  
  60.     hwnd = CreateWindowEx(
  61.         NULL,
  62.         g_szClassName,
  63.         WinName,
  64.         WS_OVERLAPPEDWINDOW,//WS_POPUPWINDOW,
  65.         WINDOW_X_COR, WINDOW_Y_COR, WINDOW_W, WINDOW_H,
  66.         NULL, NULL,
  67.         hInstance, NULL);
  68.  
  69.     if (hwnd == NULL){
  70.         MessageBox(NULL, "Failed to create window!", "Error", MB_ICONEXCLAMATION | MB_OK);
  71.         return 0;
  72.     }
  73.  
  74.     ShowWindow(hwnd, nCmdShow);
  75.     UpdateWindow(hwnd);
  76.  
  77.     MSG Msg;
  78.     BOOL bRet;
  79.  
  80.     while ((bRet = GetMessage(&Msg, NULL, 0, 0)) != 0){
  81.         if (bRet == -1){
  82.             MessageBox(NULL, "Error in GetMessage()", "Error", MB_ICONEXCLAMATION | MB_OK);
  83.         }
  84.         else{
  85.             TranslateMessage(&Msg);
  86.             DispatchMessage(&Msg);
  87.         }
  88.     }
  89.     return Msg.wParam;
  90. }
  91.  
  92. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
  93.     switch (msg)
  94.     {
  95.     case WM_CLOSE:
  96.         DestroyWindow(hwnd);
  97.         break;
  98.  
  99.     case WM_DESTROY:
  100.         KillTimer(hwnd, TimerID);
  101.         PostQuitMessage(0);
  102.         break;
  103.  
  104.     case WM_CREATE:
  105.         SetTimer(hwnd, TimerID, TIMER_INT, NULL);
  106.         CalcGraph(x, y, MAX_COUNT);
  107.         break;
  108.  
  109.     case WM_PAINT:
  110.     {
  111.         HDC hdc;
  112.         PAINTSTRUCT ps;
  113.  
  114.         hdc = BeginPaint(hwnd, &ps);
  115.  
  116.         SetMapMode(hdc, MM_ISOTROPIC); //логические единицы отображаем, как физические
  117.         SetWindowExtEx(hdc, xView, xView, NULL); //длина осей
  118.         SetViewportExtEx(hdc, xView, xView, NULL); //определяем облась вывода
  119.         SetViewportOrgEx(hdc, OFFSET, yView / 2, NULL); //начало координат
  120.        
  121.         HPEN hpen = CreatePen(PS_SOLID, LINE_WIDTH, REC_COLOR);
  122.         HBRUSH hbrush = (HBRUSH)GetStockObject(NULL_BRUSH);
  123.  
  124.         //отрисовка ограничительного прямоугольника
  125.         SelectObject(hdc, hbrush);
  126.         SelectObject(hdc, hpen);
  127.         Rectangle(hdc, 0, -yView / 2 + OFFSET, xView - 2 * OFFSET, yView / 2 - OFFSET);
  128.         DeleteObject(hpen);
  129.         DeleteObject(hbrush);
  130.  
  131.         //вывод графика
  132.         DrawArray(hwnd, hdc, ps, x, y, count_of_points);
  133.  
  134.         EndPaint(hwnd, &ps);
  135.         break;
  136.     }
  137.  
  138.     case WM_TIMER:
  139.     {
  140.         if (count_of_points > MAX_COUNT){
  141.             KillTimer(hwnd, TimerID);
  142.             //убиваем таймер без возможности перезапуска
  143.             TimerID = 0;
  144.         }
  145.         else{
  146.             count_of_points++;
  147.         }
  148.         InvalidateRect(hwnd, NULL, NULL);
  149.         break;
  150.     }
  151.  
  152.     case WM_SIZE:
  153.         //получаем размеры клиентской области
  154.         xView = LOWORD(lParam);
  155.         yView = HIWORD(lParam);
  156.    
  157.         switch (wParam){
  158.         case SIZE_RESTORED:
  159.         {  
  160.             TestTimer(hwnd);
  161.             InvalidateRect(hwnd, NULL, TRUE);
  162.             break;
  163.         }
  164.         case SIZE_MINIMIZED:
  165.         {
  166.             KillTimer(hwnd, TimerID);
  167.             TimerID = -1;
  168.             break;
  169.         }
  170.         case SIZE_MAXIMIZED:
  171.         {
  172.             TestTimer(hwnd);
  173.             InvalidateRect(hwnd, NULL, TRUE);
  174.             break;
  175.         }
  176.         default:
  177.             InvalidateRect(hwnd, NULL, TRUE);
  178.             break;
  179.         }
  180.  
  181.     default:
  182.         return DefWindowProc(hwnd, msg, wParam, lParam);
  183.         break;
  184.     }
  185.     return 0;
  186. }
  187.  
  188. void CalcGraph(int* x, int* y, const int n)
  189. {
  190.     for (int i = 0; i < n; ++i){
  191.         //получаем координаты графика
  192.         x[i] = i;
  193.         y[i] = round(AMPLITUDE * tan(round(FREQUENCY) * i * (PI / (180 * RESOLURION))));
  194.         //находим точки бесконечных значений
  195.         if ((int)FREQUENCY * i % (90 * RESOLURION) == 0){
  196.             y[i] = y[i-1];
  197.         }
  198.     }
  199.     //находим максимальное значение функции
  200.     y_max = (abs(FindMin(y, n)) + FindMax(y, n)) / 2;
  201. }
  202.  
  203. void DrawArray(HWND& hwnd, HDC& hdc, PAINTSTRUCT& ps, int* x, int* y, const int n)
  204. {
  205.     //получем размер ограничительного прямоугольника
  206.     float rec_h = yView - 2 * OFFSET;
  207.     float rec_w = xView - 2 * OFFSET;
  208.     //коэфициент маштабирования по Y
  209.     float k_Y = rec_h / (y_max * 2);
  210.     //коэфициент маштабирования по X
  211.     float k_X = (float)rec_w / MAX_COUNT;
  212.  
  213.     HPEN hpen = CreatePen(PS_SOLID, LINE_WIDTH, GR_COLOR);
  214.     SelectObject(hdc, hpen);
  215.     MoveToEx(hdc, 0, 0, NULL);
  216.     for (int i = 2; i < n; i++){
  217.         MoveToEx(hdc, roundf(k_X * x[i - 2]), roundf(k_Y * y[i - 2]), (LPPOINT)NULL);
  218.         LineTo(hdc, roundf(k_X * x[i - 1]), roundf(k_Y * y[i - 1]));
  219.     }
  220.     DeleteObject(hpen);
  221. }
  222.  
  223. void TestTimer(HWND& hwnd)
  224. {
  225.     //проверяем работает ли таймер
  226.     if (TimerID == -1)
  227.         SetTimer(hwnd, TimerID = 1, TIMER_INT, NULL);
  228. }
  229.  
  230. int FindMax(const int* arr, const int n){
  231.     int max = arr[0];
  232.     for (int i = 1; i < n; ++i)
  233.     {
  234.         if (arr[i] > max)
  235.         {
  236.             max = arr[i];
  237.         }
  238.     }
  239.     return max;
  240. }
  241.  
  242. int FindMin(const int* arr, const int n){
  243.     int min = arr[0];
  244.     for (int i = 1; i < n; ++i)
  245.     {
  246.         if (arr[i] < min)
  247.         {
  248.             min = arr[i];
  249.         }
  250.     }
  251.     return min;
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement