Developer от Бога

DV

четверг, 6 июля 2017 г.

WinAPI. Алгоритм построения графиков функций.

В предыдущих статьях были рассмотрены визуальная часть программы. В этой статье будет описан алгоритм построения графиков.
Как и в примере рисования графиков рассмотреных в курсе на языке Java, весь алгоритм привязан к одной центральной точке, от которой идет построение всех линий. Смещая лишь центральную точку, смещается весь график в нужном направлении. Стоит отметить некоторые новые функции которые небыли расмотрены в прошлых примерах по рисованию в WinAPI - функция CreateRectRgn() которая возвращает тип HRGN с выбраным регионом в окне для рисования, он нужен для того чтоб график функции рисовался в строго заданой области и не выходил за нее. Это позволяет выводить график в цикле не ограничивая дополнительными условиями, чтоб нарисованные линии не выходили за выбранную область. Функция SelectClipRgn() применяет выбранный регион к нужному HDC. После рисования также стоит позаботится об освобождении контекста устройства и удаление ранее выбранного региона функциями DeleteObject(hrgn); DeleteObject (hPen); ReleaseDC (hwnd, hDC);


  1. #ifndef GRAPHFUNC_H_INCLUDED
  2. #define GRAPHFUNC_H_INCLUDED
  3. void parabola(HWND hwnd, int x, int y, int zoom, float vertex){
  4. float x_=x, y_=y;
  5. float step=0;
  6. HDC hDC = GetDC (hwnd);
  7. HPEN hPen = CreatePen (PS_SOLID, 1, RGB(255, 0, 0));
  8. SelectObject (hDC, hPen);
  9. HRGN hrgn = CreateRectRgn(20,20,560,520);
  10. SelectClipRgn(hDC, hrgn);
  11. for(int i=0; i<1000; i++ ){
  12. MoveToEx(hDC, x_, y_, NULL);
  13. LineTo(hDC, x+step*zoom, y-(step*step));
  14. x_=x+step*zoom; y_=y-(step*step);
  15. step+=0.1+vertex;}
  16. x_=x, y_=y;
  17. step=0;
  18. for(int i=0; i<1000; i++ ){
  19. MoveToEx(hDC, x_, y_, NULL);
  20. LineTo(hDC, x-step*zoom, y-(step*step));
  21. x_=x-step*zoom; y_=y-(step*step);
  22. step+=0.1+vertex;}
  23. x_=x, y_=y;
  24. step=0;
  25. DeleteObject(hrgn);
  26. DeleteObject (hPen);
  27. ReleaseDC (hwnd, hDC);
  28. }
  29. void hiperbola(HWND hwnd, int x, int y, int zoom, float vertex){
  30. float x_=x, y_=y;
  31. float step=0;
  32. HDC hDC = GetDC (hwnd);
  33. HPEN hPen = CreatePen (PS_SOLID, 1, RGB(255, 0, 0));
  34. SelectObject (hDC, hPen);
  35. HRGN hrgn = CreateRectRgn(20,20,560,520);
  36. SelectClipRgn(hDC, hrgn);
  37. for(int i=0; i<1000; i++ ){
  38. MoveToEx(hDC, x_, y_, NULL);
  39. LineTo(hDC, x+step*zoom, y-(step*step*step));
  40. x_=x+step*zoom; y_=y-(step*step*step);
  41. step+=0.1+vertex;}
  42. x_=x, y_=y;
  43. step=0;
  44. for(int i=0; i<1000; i++ ){
  45. MoveToEx(hDC, x_, y_, NULL);
  46. LineTo(hDC, x-step*zoom, y+(step*step*step));
  47. x_=x-step*zoom; y_=y+(step*step*step);
  48. step+=0.1+vertex;}
  49. DeleteObject(hrgn);
  50. DeleteObject (hPen);
  51. ReleaseDC (hwnd, hDC);
  52. }
  53. void line(HWND hwnd, int x, int y, int zoom, float step){
  54. float x_=x, y_=y;
  55. step=0;
  56. HDC hDC = GetDC (hwnd);
  57. HPEN hPen = CreatePen (PS_SOLID, 1, RGB(255, 0, 0));
  58. SelectObject (hDC, hPen);
  59. HRGN hrgn = CreateRectRgn(20,20,560,520);
  60. SelectClipRgn(hDC, hrgn);
  61. for(int i=0; i<1000; i++ ){
  62. MoveToEx(hDC, x_, y_, NULL);
  63. LineTo(hDC, x+i, y-i);
  64. x_=x+i; y_=y-i;
  65. step+=0.1;}
  66. x_=x, y_=y;
  67. step=0;
  68. for(int i=0; i<1000; i++ ){
  69. MoveToEx(hDC, x_, y_, NULL);
  70. LineTo(hDC, x-i, y+i);
  71. x_=x-i; y_=y+i;
  72. step+=0.1;}
  73. DeleteObject(hrgn);
  74. DeleteObject (hPen);
  75. ReleaseDC (hwnd, hDC);
  76. }
  77. void sin_func(HWND hwnd, int x, int y, float zoom, float vertex){
  78. float x_=x, y_=y;
  79. HDC hDC = GetDC (hwnd);
  80. HPEN hPen = CreatePen (PS_SOLID, 1, RGB(255, 0, 0));
  81. SelectObject (hDC, hPen);
  82. HRGN hrgn = CreateRectRgn(20,20,560,520);
  83. SelectClipRgn(hDC, hrgn);
  84. for(int i=0; i<10000; i++ ){
  85. MoveToEx(hDC, x_, y_, NULL);
  86. LineTo(hDC, x+i*zoom/20, y-sin(i * 3.141592 / 180)*50);
  87. x_=x+i*zoom/20; y_=y-sin(i * 3.141592 / 180)*50;}
  88. x_=x, y_=y;
  89. for(int i=0; i<10000; i++ ){
  90. MoveToEx(hDC, x_, y_, NULL);
  91. LineTo(hDC, x-i*zoom/20, y+sin(i * 3.141592 / 180)*50);
  92. x_=x-i*zoom/20; y_=y+sin(i * 3.141592 / 180)*50;}
  93. DeleteObject(hrgn);
  94. DeleteObject (hPen);
  95. ReleaseDC (hwnd, hDC);
  96. }
  97. void cos_func(HWND hwnd, int x, int y, float zoom, float vertex){
  98. float x_=x, y_=y;
  99. HDC hDC = GetDC (hwnd);
  100. HPEN hPen = CreatePen (PS_SOLID, 1, RGB(255, 0, 0));
  101. SelectObject (hDC, hPen);
  102. HRGN hrgn = CreateRectRgn(20,20,560,520);
  103. SelectClipRgn(hDC, hrgn);
  104. for(int i=0; i<10000; i++ ){
  105. MoveToEx(hDC, x_, y_, NULL);
  106. LineTo(hDC, x+i*zoom/20, y-cos(i * 3.141592 / 180)*50);
  107. x_=x+i*zoom/20; y_=y-cos(i * 3.141592 / 180)*50;}
  108. x_=x, y_=y;
  109. for(int i=0; i<10000; i++ ){
  110. MoveToEx(hDC, x_, y_, NULL);
  111. LineTo(hDC, x-i*zoom/20, y-cos(i * 3.141592 / 180)*50);
  112. x_=x-i*zoom/20; y_=y-cos(i * 3.141592 / 180)*50;}
  113. DeleteObject(hrgn);
  114. DeleteObject (hPen);
  115. ReleaseDC (hwnd, hDC);
  116. }
  117. void getfunc(HWND hwnd, int x, int y, int zoom, int vertex,int step,int func){
  118. if(func==0)parabola(hwnd,x,y,zoom,vertex);
  119. if(func==1)hiperbola(hwnd,x,y,zoom,vertex);
  120. if(func==2)line(hwnd,x,y,zoom,step);
  121. if(func==3)sin_func(hwnd,x,y,zoom,step);
  122. if(func==4)cos_func(hwnd,x,y,zoom,step);
  123. }
  124. #endif // GRAPHFUNC_H_INCLUDED

Комментариев нет:

Отправить комментарий