Drop Down MenusCSS Drop Down MenuPure CSS Dropdown Menu

субота, 13 травня 2017 р.

Програма "Графіки полярної системи координат"

Сьогоднішнє наше завдання полягає у тому, що нам потрібно розробити програму яка буде малювати 7 графіків, але це ще не все ми повинні зробити випадаюче меню.



Коло
Спіраль
Кардіоїда
Квітка 3 пелюстки
Квітка 5 пелюсток
Квітка 7 пелюсток

Квітка 129 крапок

Але перед тим як почати робити програму я хотів би розповісти навіщо потрібні ці полярні системи координат.

Полярна система координат — двовимірна система координат, в якій кожна точка на площині визначається двома числами — кутом та відстанню. Полярна система координат особливо корисна у випадках, коли відношення між точками найпростіше зобразити у вигляді відстаней та кутів; в більш поширеній, Декартовій, або прямокутній системі координат, такі відношення можна встановити лише шляхом застосування тригонометричних рівнянь.
Полярна система координат задається променем, який називають нульовим або полярною віссю. Точка, з якої виходить цей промінь називається початком координат або полюсом. Будь-яка інша точка на площині визначається двома полярними координатами: радіальною та кутовою. Радіальна координата відповідає відстані від точки до початку координат. Кутова координата, що також зветься полярним кутом або азимутом і позначається φ, дорівнює куту, на який потрібно повернути проти годинникової стрілки полярну вісь для того, щоб потрапити в цю точку.
Визначена таким чином радіальна координата може приймати значення від нуля до нескінченості, а кутова координата змінюється в межах від 0° до 360°. Однак, для зручності область значень полярної координати можна розширити за межі повного кута, а також дозволити їй приймати від'ємні значення, що відповідатиме повороту полярної осі за годинниковою стрілкою.
Графічне представлення
Кожна точка в полярній системі координат може бути визначена двома полярними координатами, що зазвичай мають назву r {\displaystyle r} (радіальна координата) та φ (кутова координата, полярний кут, азимут, інколи пишуть θ або t). Координата r {\displaystyle r} відповідає відстані до полюса, а координата φ дорівнює куту в проти годинниковому напрямі від променя через 0° (інколи називається полярною віссю).
Наприклад, точка з координатами (3, 60°) виглядатиме на графіку як точка на промені, який лежить під кутом 60° до полярної осі, на відстані 3 одиниць від полюсу. Точка з координатами (−3, 240°) буде намальована на тому ж місці, оскільки від'ємна відстань зображується в додатну в протилежному напрямі (на 180°).
Однією з важливих особливостей полярної системи координат є те, що одна й та сама точка може бути представлена нескінченною кількістю способів. Це відбувається тому, що для визначення азимута точки потрібно повернути полярну вісь таким чином, щоб він вказував на точку. Для позначення полюсу використовують координати (0, φ). Незалежно від координати φ точка з нульовою відстанню від полюса завжди знаходитиметься на ньому. Для отримання однозначних координат точки, зазвичай слід обмежити значення відстані до невід'ємних значень r {\displaystyle r} а кут φ до інтервалу [0, 360°) або (−180°, 180°] (в радіанах [0, 2π) або (−π, π]).
Кути в полярних координатах задаються або в градусах, або в радіанах, при цьому 2π rad = 360°. Вибір, зазвичай, залежить від області застосування. В навігації традиційно використовують градуси, в той час як у деяких розділах фізики, та майже у всіх розділах математики використовують радіани.
Декартова площина відображена в полярній системі координат
Зважаючи на те, що для обчислення полярного кута не досить знати відношення y до x, а ще й додатково знаки одного з цих чисел, багато сучасних мов програмування мають серед своїх функцій окрім функції atan, яка визначає арктангенс числа, ще й додаткову функцію atan2, яка має окремі аргументи для чисельника та знаменника. В мовах програмування що підтримують необов'язкові аргументи, функція atan може отримувати значення координати x.
Ось приклади типових графіків полярних координат:
Коло

Полярна троянда

Полярна троянда — відома математична крива, схожа на квітку з пелюстками.
Спіраль Архімеда
Відома спіраль Архімеда названа на честь її винахідника, давньогрецького математика Архімеда.
Конічні перетини

Еліпс.
Конічний перетин, один з полюсів якого знаходиться в полюсі, а інший десь на полярній осі. Приклад комплексного числа z нанесеного на комплексну площину. Кожне комплексне число може бути представлене точкою на комплексній площині і, відповідно, ця точка може визначатись в декартових координатах (прямокутна або декартова форма), або в полярних координатах (полярна форма). z = r ( cos φ + i sin φ ) {\displaystyle z=r\cdot (\cos \varphi +i\sin \varphi )}
Циліндричні координати

Точка P накреслена в циліндричній системі координат.
Докладніше: Циліндрична система координат
Циліндрична система координат, грубо кажучи, розширює пласку полярну систему додаванням третьої лінійної координати, що має назву висоти і дорівнює висоті точки над нульовою площиною подібно до того, як Декартова система розширюється на випадок 3-х вимірів. Третя координата зазвичай позначається як z, утворюючи трійку координат (ρ, φ, z).
Сферичні координати
Точка накреслена в сферичній системі координат.
Докладніше: Сферична система координат
Також полярні координати можна розширити на випадок трьох вимірів шляхом додавання кутової координати θ, що дорівнює куту повертання від вертикальної осі z (називається зенитом або широтою, значення знаходяться в інтервалі від 0 до 180°). Тобто, сферичні координати, це трійка (r, θ, φ), де r — відстань від центру координат, φ — кут від осі x (як і в пласких полярних координатах), θ — широта. Сферична система координат подібна до географічної системи координат для визначення місця на поверхні Землі, де початок координат збігається з центром Землі, широта δ є доповненням θ і дорівнює δ = 90° − θ, а довгота l обчислюється за формулою l = φ − 180°.


Від читання перейдемо до практики та створюємо Графіки систем полярних координат



По - перше запускаємо Visual Studio. Після налаштувань заходимо через Solution Explorer  в ProgramDlg.h та знизу пишемо такий код:


private:
HPEN hPenOxy, hOldPen;
HFONT hold, hNew, hbk; HBRUSH m, oldm;
COLORREF cf, ck, c[25];
CPen d, oldd; CBitmap pic;
CRect rc, w, kw[12];
CString ms, t, z;
 
int x1, y1, x2, y2, x3, y3, x4, y4;
int Matrix[50][50];
int RH, RW, k, i, j, cx, cy, dx, dy;
bool fg;

Потім створюємо випадаюче меню. Для цього нам потрібно зайти в Resource View  та правою кнопкою миші по папці Dialog та Add Resource... Обираємо там Menu потім New

Я думаю, що кожен зможе створити такий шаблон меню


Після того як ви зробили меню натисніть правою кнопкою миші на розділ "КРУГ" Add Event Handler обираємо там  CProgramDlg  та Add and Edit.

Потім в додану функцію вписуємо ось такий код



CClientDC dc(this);
 GetClientRect(&rc);
 hNew = CreateFont(28, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Times New Roman Cyr");
 hold = (HFONT)SelectObject(dc, hNew);
 dc.FillSolidRect(&rc, RGB(255, 255, 255));
 cf = RGB(255, 255, 255);
 ck = RGB(50, 70, 120);
 SetTextColor(dc, ck);
 SetBkColor(dc, cf);
 msg.Format(L"Полярная");
 TextOutW(dc, rc.left + 50, rc.bottom - 450, msg, msg.GetLength());
 msg.Format(L"система");
 TextOutW(dc, rc.left + 50, rc.bottom - 420, msg, msg.GetLength());
 msg.Format(L"координат");
 TextOutW(dc, rc.left + 50, rc.bottom - 390, msg, msg.GetLength());
 COLORREF crFunction = RGB(0, 190, 0);//цвет графика
 COLORREF crAxes = RGB(89, 89, 250);//цвет осей (линий)
 COLORREF crMarks = RGB(0, 0, 160);//цвет отметок на шкале
 COLORREF crXYLines = RGB(140, 70, 0);//название осей
 COLORREF crDeleniya = RGB(0, 0, 165);//цвет текста

 HPEN hPenOxy, hOldPen;
 hPenOxy = CreatePen(PS_SOLID, 2, crAxes);//создаем кисть цветом "crOxy"
 hOldPen = (HPEN)SelectObject(dc, hPenOxy);
 SetTextColor(dc, crAxes);//устанавливаем цвет текста
 int cxClient, cyClient;
 cyClient = rc.bottom;//высота
 cxClient = rc.right;//ширина
      //выводим ось OX
 MoveToEx(dc, 0, cyClient / 2, NULL);
 LineTo(dc, cxClient, cyClient / 2);
 //выводим стрелочку
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 - cyClient / 100 * 2);
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 + cyClient / 100 * 2);
 //рисуем ось OY
 MoveToEx(dc, cxClient / 2, 00, NULL);
 LineTo(dc, cxClient / 2, cyClient);
 //выводим стрелочку
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 - cxClient / 100 * 2, cyClient / 100 * 2);
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 + cxClient / 100 * 2, cyClient / 100 * 2);
 //название осей
 SetTextColor(dc, crXYLines);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 30, cyClient / 2 + cyClient / 100 * 2, L"OX", 2);
 TextOut(dc, cxClient / 2 + cxClient / 100 * 2.5, cyClient / 200, L"OY", 2);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 120, cyClient / 200 + 140, L"R=200", 5);

 // рисуем график y=sin(x)
 double x, y;//значений функций
 int width, height;//высота, ширина делений
       //ширину области деленим на колличество делений
 width = cxClient / 12;
 height = cyClient / 4;
 double r, f;
 r = 200;
 f = 0;
 do
 {
  x = r*cos(f);
  y = r*sin(f);
  SetPixel(dc, x + cxClient / 2, y + cyClient / 2, crFunction);
  f += 0.01;
 } while (f <= 360);

 SelectObject(dc, hOldPen);
 DeleteObject(hPenOxy);
 DeleteObject(hNew);
 hold = (HFONT)SelectObject(dc, hbk);




Потім так само робимо зі словами "СПИРАЛЬ", "КАРДИОИДА", "З ЛЕПЕСТКА", "5 ЛЕПЕСТКОВ", "7 ЛЕПЕСТКОВ" та "129 ТОЧЕК". Так як код не однаковий то я нище подав коди та слова до яких вони відносяться


СПИРАЛЬ
CClientDC dc(this);
 GetClientRect(&rc);
 hNew = CreateFont(28, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Times New Roman Cyr");
 hold = (HFONT)SelectObject(dc, hNew);
 dc.FillSolidRect(&rc, RGB(255, 255, 255));
 cf = RGB(255, 255, 255);
 ck = RGB(50, 70, 120);
 SetTextColor(dc, ck);
 SetBkColor(dc, cf);
 msg.Format(L"Полярная");
 TextOutW(dc, rc.left + 50, rc.bottom - 450, msg, msg.GetLength());
 msg.Format(L"система");
 TextOutW(dc, rc.left + 50, rc.bottom - 420, msg, msg.GetLength());
 msg.Format(L"координат");
 TextOutW(dc, rc.left + 50, rc.bottom - 390, msg, msg.GetLength());
 COLORREF crFunction = RGB(230, 0, 0);//цвет графика
 COLORREF crAxes = RGB(89, 89, 250);//цвет осей (линий)
 COLORREF crMarks = RGB(0, 0, 160);//цвет отметок на шкале
 COLORREF crXYLines = RGB(140, 70, 0);//название осей
 COLORREF crDeleniya = RGB(0, 0, 165);//цвет текста

 HPEN hPenOxy, hOldPen;
 hPenOxy = CreatePen(PS_SOLID, 2, crAxes);//создаем кисть цветом "crOxy"
 hOldPen = (HPEN)SelectObject(dc, hPenOxy);
 SetTextColor(dc, crAxes);//устанавливаем цвет текста
 int cxClient, cyClient;
 cyClient = rc.bottom;//высота
 cxClient = rc.right;//ширина
      //выводим ось OX
 MoveToEx(dc, 0, cyClient / 2, NULL);
 LineTo(dc, cxClient, cyClient / 2);
 //выводим стрелочку
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 - cyClient / 100 * 2);
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 + cyClient / 100 * 2);
 //рисуем ось OY
 MoveToEx(dc, cxClient / 2, 00, NULL);
 LineTo(dc, cxClient / 2, cyClient);
 //выводим стрелочку
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 - cxClient / 100 * 2, cyClient / 100 * 2);
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 + cxClient / 100 * 2, cyClient / 100 * 2);
 //название осей
 SetTextColor(dc, crXYLines);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 30, cyClient / 2 + cyClient / 100 * 2, L"OX", 2);
 TextOut(dc, cxClient / 2 + cxClient / 100 * 2.5, cyClient / 200, L"OY", 2);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 180, cyClient / 200 + 110, L"спираль", 7);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 180, cyClient / 200 + 140, L"\"АРХИМЕДА\"", 10);
 // рисуем график y=sin(x)
 double x, y;//значений функций
 int width, height;//высота, ширина делений
       //ширину области деленим на колличество делений
 width = cxClient / 12;
 height = cyClient / 4;
 double r, f;
 r = 0;
 f = 0.1;
 do
 {
  r += 0.05;
  x = r*cos(f);
  y = r*sin(f);
  SetPixel(dc, x + cxClient / 2, y + cyClient / 2, crFunction);
  f += 0.01;
 } while (f <= 360);
 SelectObject(dc, hOldPen);
 DeleteObject(hPenOxy);
 DeleteObject(hNew);
 hold = (HFONT)SelectObject(dc, hbk);



КАРДИОИДА

CClientDC dc(this);
 GetClientRect(&rc);
 hNew = CreateFont(28, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Times New Roman Cyr");
 hold = (HFONT)SelectObject(dc, hNew);
 dc.FillSolidRect(&rc, RGB(255, 255, 255));
 cf = RGB(255, 255, 255);
 ck = RGB(50, 70, 120);
 SetTextColor(dc, ck);
 SetBkColor(dc, cf);
 msg.Format(L"Полярная");
 TextOutW(dc, rc.left + 50, rc.bottom - 450, msg, msg.GetLength());
 msg.Format(L"система");
 TextOutW(dc, rc.left + 50, rc.bottom - 420, msg, msg.GetLength());
 msg.Format(L"координат");
 TextOutW(dc, rc.left + 50, rc.bottom - 390, msg, msg.GetLength());
 COLORREF crFunction = RGB(250, 100, 50);//цвет графика
 COLORREF crAxes = RGB(89, 89, 250);//цвет осей (линий)
 COLORREF crMarks = RGB(0, 0, 160);//цвет отметок на шкале
 COLORREF crXYLines = RGB(140, 70, 0);//название осей
 COLORREF crDeleniya = RGB(0, 0, 165);//цвет текста

 HPEN hPenOxy, hOldPen;
 hPenOxy = CreatePen(PS_SOLID, 2, crAxes);//создаем кисть цветом "crOxy"
 hOldPen = (HPEN)SelectObject(dc, hPenOxy);
 SetTextColor(dc, crAxes);//устанавливаем цвет текста
 int cxClient, cyClient;
 cyClient = rc.bottom;//высота
 cxClient = rc.right;//ширина
      //выводим ось OX
 MoveToEx(dc, 0, cyClient / 2, NULL);
 LineTo(dc, cxClient, cyClient / 2);
 //выводим стрелочку
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 - cyClient / 100 * 2);
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 + cyClient / 100 * 2);
 //рисуем ось OY
 MoveToEx(dc, cxClient / 2, 00, NULL);
 LineTo(dc, cxClient / 2, cyClient);
 //выводим стрелочку
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 - cxClient / 100 * 2, cyClient / 100 * 2);
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 + cxClient / 100 * 2, cyClient / 100 * 2);
 //название осей
 SetTextColor(dc, crXYLines);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 30, cyClient / 2 + cyClient / 100 * 2, L"OX", 2);
 TextOut(dc, cxClient / 2 + cxClient / 100 * 2.5, cyClient / 200, L"OY", 2);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 120, cyClient / 200 + 140, L"k=7", 3);

 // рисуем график y=sin(x)
 double x, y;//значений функций
 int width, height;//высота, ширина делений
       //ширину области деленим на колличество делений
 width = cxClient / 12;
 height = cyClient / 4;
 double r, f;
 int a, k;
 a = 200;
 k = 7;
 r = 200;
 f = 0.1;
 do
 {
  r = a*sin(k*f);
  x = r*cos(f);
  y = r*sin(f);
  SetPixel(dc, x + cxClient / 2, y + cyClient / 2, crFunction);
  f += 0.01;
 } while (f <= 360);

 SelectObject(dc, hOldPen);
 DeleteObject(hPenOxy);
 DeleteObject(hNew);
 hold = (HFONT)SelectObject(dc, hbk);




3 ЛЕПЕСТКА
CClientDC dc(this);
 GetClientRect(&rc);
 hNew = CreateFont(28, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Times New Roman Cyr");
 hold = (HFONT)SelectObject(dc, hNew);
 dc.FillSolidRect(&rc, RGB(255, 255, 255));
 cf = RGB(255, 255, 255);
 ck = RGB(50, 70, 120);
 SetTextColor(dc, ck);
 SetBkColor(dc, cf);
 msg.Format(L"Полярная");
 TextOutW(dc, rc.left + 50, rc.bottom - 450, msg, msg.GetLength());
 msg.Format(L"система");
 TextOutW(dc, rc.left + 50, rc.bottom - 420, msg, msg.GetLength());
 msg.Format(L"координат");
 TextOutW(dc, rc.left + 50, rc.bottom - 390, msg, msg.GetLength());
 COLORREF crFunction = RGB(250, 100, 50);//цвет графика
 COLORREF crAxes = RGB(89, 89, 250);//цвет осей (линий)
 COLORREF crMarks = RGB(0, 0, 160);//цвет отметок на шкале
 COLORREF crXYLines = RGB(140, 70, 0);//название осей
 COLORREF crDeleniya = RGB(0, 0, 165);//цвет текста

 HPEN hPenOxy, hOldPen;
 hPenOxy = CreatePen(PS_SOLID, 2, crAxes);//создаем кисть цветом "crOxy"
 hOldPen = (HPEN)SelectObject(dc, hPenOxy);
 SetTextColor(dc, crAxes);//устанавливаем цвет текста
 int cxClient, cyClient;
 cyClient = rc.bottom;//высота
 cxClient = rc.right;//ширина
      //выводим ось OX
 MoveToEx(dc, 0, cyClient / 2, NULL);
 LineTo(dc, cxClient, cyClient / 2);
 //выводим стрелочку
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 - cyClient / 100 * 2);
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 + cyClient / 100 * 2);
 //рисуем ось OY
 MoveToEx(dc, cxClient / 2, 00, NULL);
 LineTo(dc, cxClient / 2, cyClient);
 //выводим стрелочку
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 - cxClient / 100 * 2, cyClient / 100 * 2);
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 + cxClient / 100 * 2, cyClient / 100 * 2);
 //название осей
 SetTextColor(dc, crXYLines);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 30, cyClient / 2 + cyClient / 100 * 2, L"OX", 2);
 TextOut(dc, cxClient / 2 + cxClient / 100 * 2.5, cyClient / 200, L"OY", 2);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 120, cyClient / 200 + 140, L"k=3", 3);

 // рисуем график y=sin(x)
 double x, y;//значений функций
 int width, height;//высота, ширина делений
       //ширину области деленим на колличество делений
 width = cxClient / 12;
 height = cyClient / 4;
 double r, f;
 int a, k;
 a = 200;
 k = 3;
 r = 200;
 f = 0.1;
 do
 {
  r = a*sin(k*f);
  x = r*cos(f);
  y = r*sin(f);
  SetPixel(dc, x + cxClient / 2, y + cyClient / 2, crFunction);
  f += 0.01;
 } while (f <= 360);

 SelectObject(dc, hOldPen);
 DeleteObject(hPenOxy);
 DeleteObject(hNew);
 hold = (HFONT)SelectObject(dc, hbk);



5 ЛЕПЕСТКОВ

CClientDC dc(this);
 GetClientRect(&rc);
 hNew = CreateFont(28, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Times New Roman Cyr");
 hold = (HFONT)SelectObject(dc, hNew);
 dc.FillSolidRect(&rc, RGB(255, 255, 255));
 cf = RGB(255, 255, 255);
 ck = RGB(50, 70, 120);
 SetTextColor(dc, ck);
 SetBkColor(dc, cf);
 msg.Format(L"Полярная");
 TextOutW(dc, rc.left + 50, rc.bottom - 450, msg, msg.GetLength());
 msg.Format(L"система");
 TextOutW(dc, rc.left + 50, rc.bottom - 420, msg, msg.GetLength());
 msg.Format(L"координат");
 TextOutW(dc, rc.left + 50, rc.bottom - 390, msg, msg.GetLength());
 COLORREF crFunction = RGB(250, 100, 50);//цвет графика
 COLORREF crAxes = RGB(89, 89, 250);//цвет осей (линий)
 COLORREF crMarks = RGB(0, 0, 160);//цвет отметок на шкале
 COLORREF crXYLines = RGB(140, 70, 0);//название осей
 COLORREF crDeleniya = RGB(0, 0, 165);//цвет текста

 HPEN hPenOxy, hOldPen;
 hPenOxy = CreatePen(PS_SOLID, 2, crAxes);//создаем кисть цветом "crOxy"
 hOldPen = (HPEN)SelectObject(dc, hPenOxy);
 SetTextColor(dc, crAxes);//устанавливаем цвет текста
 int cxClient, cyClient;
 cyClient = rc.bottom;//высота
 cxClient = rc.right;//ширина
      //выводим ось OX
 MoveToEx(dc, 0, cyClient / 2, NULL);
 LineTo(dc, cxClient, cyClient / 2);
 //выводим стрелочку
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 - cyClient / 100 * 2);
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 + cyClient / 100 * 2);
 //рисуем ось OY
 MoveToEx(dc, cxClient / 2, 00, NULL);
 LineTo(dc, cxClient / 2, cyClient);
 //выводим стрелочку
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 - cxClient / 100 * 2, cyClient / 100 * 2);
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 + cxClient / 100 * 2, cyClient / 100 * 2);
 //название осей
 SetTextColor(dc, crXYLines);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 30, cyClient / 2 + cyClient / 100 * 2, L"OX", 2);
 TextOut(dc, cxClient / 2 + cxClient / 100 * 2.5, cyClient / 200, L"OY", 2);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 120, cyClient / 200 + 140, L"k=5", 3);

 // рисуем график y=sin(x)
 double x, y;//значений функций
 int width, height;//высота, ширина делений
       //ширину области деленим на колличество делений
 width = cxClient / 12;
 height = cyClient / 4;
 double r, f;
 int a, k;
 a = 200;
 k = 5;
 r = 200;
 f = 0.1;
 do
 {
  r = a*sin(k*f);
  x = r*cos(f);
  y = r*sin(f);
  SetPixel(dc, x + cxClient / 2, y + cyClient / 2, crFunction);
  f += 0.01;
 } while (f <= 360);

 SelectObject(dc, hOldPen);
 DeleteObject(hPenOxy);
 DeleteObject(hNew);
 hold = (HFONT)SelectObject(dc, hbk);




7 ЛЕПЕСТКОВ

CClientDC dc(this);
 GetClientRect(&rc);
 hNew = CreateFont(28, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Times New Roman Cyr");
 hold = (HFONT)SelectObject(dc, hNew);
 dc.FillSolidRect(&rc, RGB(255, 255, 255));
 cf = RGB(255, 255, 255);
 ck = RGB(50, 70, 120);
 SetTextColor(dc, ck);
 SetBkColor(dc, cf);
 msg.Format(L"Полярная");
 TextOutW(dc, rc.left + 50, rc.bottom - 450, msg, msg.GetLength());
 msg.Format(L"система");
 TextOutW(dc, rc.left + 50, rc.bottom - 420, msg, msg.GetLength());
 msg.Format(L"координат");
 TextOutW(dc, rc.left + 50, rc.bottom - 390, msg, msg.GetLength());
 COLORREF crFunction = RGB(250, 100, 50);//цвет графика
 COLORREF crAxes = RGB(89, 89, 250);//цвет осей (линий)
 COLORREF crMarks = RGB(0, 0, 160);//цвет отметок на шкале
 COLORREF crXYLines = RGB(140, 70, 0);//название осей
 COLORREF crDeleniya = RGB(0, 0, 165);//цвет текста

 HPEN hPenOxy, hOldPen;
 hPenOxy = CreatePen(PS_SOLID, 2, crAxes);//создаем кисть цветом "crOxy"
 hOldPen = (HPEN)SelectObject(dc, hPenOxy);
 SetTextColor(dc, crAxes);//устанавливаем цвет текста
 int cxClient, cyClient;
 cyClient = rc.bottom;//высота
 cxClient = rc.right;//ширина
      //выводим ось OX
 MoveToEx(dc, 0, cyClient / 2, NULL);
 LineTo(dc, cxClient, cyClient / 2);
 //выводим стрелочку
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 - cyClient / 100 * 2);
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 + cyClient / 100 * 2);
 //рисуем ось OY
 MoveToEx(dc, cxClient / 2, 00, NULL);
 LineTo(dc, cxClient / 2, cyClient);
 //выводим стрелочку
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 - cxClient / 100 * 2, cyClient / 100 * 2);
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 + cxClient / 100 * 2, cyClient / 100 * 2);
 //название осей
 SetTextColor(dc, crXYLines);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 30, cyClient / 2 + cyClient / 100 * 2, L"OX", 2);
 TextOut(dc, cxClient / 2 + cxClient / 100 * 2.5, cyClient / 200, L"OY", 2);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 120, cyClient / 200 + 140, L"k=129", 5);

 // рисуем график y=sin(x)
 double x, y;//значений функций
 int width, height;//высота, ширина делений
       //ширину области деленим на колличество делений
 width = cxClient / 12;
 height = cyClient / 4;
 double r, f;
 int a, k;
 a = 200;
 k = 128;
 r = 200;
 f = 0.1;
 do
 {
  r = a*sin(k*f);
  x = r*cos(f);
  y = r*sin(f);
  SetPixel(dc, x + cxClient / 2, y + cyClient / 2, crFunction);
  f += 0.01;
 } while (f <= 360);

 SelectObject(dc, hOldPen);
 DeleteObject(hPenOxy);
 DeleteObject(hNew);
 hold = (HFONT)SelectObject(dc, hbk);


129 ТОЧЕК


CClientDC dc(this);
 GetClientRect(&rc);
 hNew = CreateFont(28, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Times New Roman Cyr");
 hold = (HFONT)SelectObject(dc, hNew);
 dc.FillSolidRect(&rc, RGB(255, 255, 255));
 cf = RGB(255, 255, 255);
 ck = RGB(50, 70, 120);
 SetTextColor(dc, ck);
 SetBkColor(dc, cf);
 msg.Format(L"Полярная");
 TextOutW(dc, rc.left + 50, rc.bottom - 450, msg, msg.GetLength());
 msg.Format(L"система");
 TextOutW(dc, rc.left + 50, rc.bottom - 420, msg, msg.GetLength());
 msg.Format(L"координат");
 TextOutW(dc, rc.left + 50, rc.bottom - 390, msg, msg.GetLength());
 COLORREF crFunction = RGB(250, 100, 50);//цвет графика
 COLORREF crAxes = RGB(89, 89, 250);//цвет осей (линий)
 COLORREF crMarks = RGB(0, 0, 160);//цвет отметок на шкале
 COLORREF crXYLines = RGB(140, 70, 0);//название осей
 COLORREF crDeleniya = RGB(0, 0, 165);//цвет текста

 HPEN hPenOxy, hOldPen;
 hPenOxy = CreatePen(PS_SOLID, 2, crAxes);//создаем кисть цветом "crOxy"
 hOldPen = (HPEN)SelectObject(dc, hPenOxy);
 SetTextColor(dc, crAxes);//устанавливаем цвет текста
 int cxClient, cyClient;
 cyClient = rc.bottom;//высота
 cxClient = rc.right;//ширина
      //выводим ось OX
 MoveToEx(dc, 0, cyClient / 2, NULL);
 LineTo(dc, cxClient, cyClient / 2);
 //выводим стрелочку
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 - cyClient / 100 * 2);
 MoveToEx(dc, cxClient, cyClient / 2, NULL);
 LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 + cyClient / 100 * 2);
 //рисуем ось OY
 MoveToEx(dc, cxClient / 2, 00, NULL);
 LineTo(dc, cxClient / 2, cyClient);
 //выводим стрелочку
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 - cxClient / 100 * 2, cyClient / 100 * 2);
 MoveToEx(dc, cxClient / 2, 0, NULL);
 LineTo(dc, cxClient / 2 + cxClient / 100 * 2, cyClient / 100 * 2);
 //название осей
 SetTextColor(dc, crXYLines);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 30, cyClient / 2 + cyClient / 100 * 2, L"OX", 2);
 TextOut(dc, cxClient / 2 + cxClient / 100 * 2.5, cyClient / 200, L"OY", 2);
 TextOut(dc, cxClient - cxClient / 100 * 2 - 150, cyClient / 200 + 140, L"КАРДИОИДА", 9);

 // рисуем график y=sin(x)
 double x, y;//значений функций
 int width, height;//высота, ширина делений
       //ширину области деленим на колличество делений
 width = cxClient / 12;
 height = cyClient / 4;
 double e, r, f;
 int a, b, k;
 a = 90;
 b = 70;
 k = 82;
 e = a / b;
 r = 200;
 f = 0;
 do
 {
  x = (b + e*b)*cos(e*f) - k*cos(f + e*f);
  y = (b + e*b)*sin(e*f) - k*sin(f + e*f);
  SetPixel(dc, x + cxClient / 2, y + cyClient / 2, crFunction);
  f += 0.01;
 } while (f <= 360);

 SelectObject(dc, hOldPen);
 DeleteObject(hPenOxy);
 DeleteObject(hNew);
 hold = (HFONT)SelectObject(dc, hbk);



ВСЕ ГОТОВО!!!



Для тих хто хоче вдосконалити цю програму я пропоную три коди для побудови графіків:


Еліпс




CClientDC dc(this);

  GetClientRect(&rc);
  dc.FillSolidRect(&rc, RGB(255, 255, 255));

  cf = RGB(255, 255, 255);
  ck = 0x00EB3C60;//RGB(50, 70, 120);

  hPenOxy = CreatePen(PS_SOLID, 3, ck);
  hOldPen = (HPEN)SelectObject(dc, hPenOxy);
 
  int cxClient, cyClient;
  cyClient = rc.bottom;//высота
  cxClient = rc.right;//ширина

  double x, y;//значений функций
  double r=200;

  int XX[100], YY[100];
  int n = 15;

  for (k = 0; k <= n; k++)
  {
   XX[k] = cxClient / 2 + r*sin(PI * 2 / n*k);
   YY[k] = cyClient / 2 + r*cos(PI * 2 / n*k);
  }

  for (k = 0; k <= n; k++)
  {
   dc.MoveTo(XX[k], YY[k]);
   for (int i = 0; i <= n; i++)
   {
    dc.LineTo(XX[i], YY[i]);
    dc.MoveTo(XX[k], YY[k]);
   }
  }

  SelectObject(dc, hOldPen);
  DeleteObject(hPenOxy);


Косинус



CClientDC dc(this);

GetClientRect(&rc);
hNew = CreateFont(28, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Times New Roman Cyr");
hold = (HFONT)SelectObject(dc, hNew);

dc.FillSolidRect(&rc, RGB(255, 255, 255));
msg.Format(L"График тригонометрической функции");
cf = RGB(255, 255, 255);
ck = RGB(50, 70, 120);
SetTextColor(dc, ck);
SetBkColor(dc, cf);
TextOutW(dc, rc.left + 150, rc.bottom - 450, msg, msg.GetLength());



COLORREF crFunction = RGB(0, 190, 0);//цвет графика
COLORREF crAxes = RGB(89, 89, 250);//цвет осей (линий)
COLORREF crMarks = RGB(0, 0, 160);//цвет отметок на шкале
COLORREF crXYLines = RGB(140, 70, 0);//название осей
COLORREF crDeleniya = RGB(0, 0, 165);//цвет текста


HPEN hPenOxy, hOldPen;
hPenOxy = CreatePen(PS_SOLID, 2, crAxes);//создаем кисть цветом "crOxy"
hOldPen = (HPEN)SelectObject(dc, hPenOxy);

SetTextColor(dc, crAxes);//устанавливаем цвет текста
int cxClient, cyClient;
cyClient = rc.bottom;//высота
cxClient = rc.right;//ширина

      //выводим ось OX
MoveToEx(dc, 0, cyClient / 2, NULL);
LineTo(dc, cxClient, cyClient / 2);
//выводим стрелочку
MoveToEx(dc, cxClient, cyClient / 2, NULL);
LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 - cyClient / 100 * 2);
MoveToEx(dc, cxClient, cyClient / 2, NULL);
LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 + cyClient / 100 * 2);
//рисуем ось OY
MoveToEx(dc, cxClient / 2, 50, NULL);
LineTo(dc, cxClient / 2, cyClient);
//выводим стрелочку
MoveToEx(dc, cxClient / 2, 50, NULL);
LineTo(dc, cxClient / 2 - cxClient / 100 * 2, cyClient / 100 * 2 + 50);
MoveToEx(dc, cxClient / 2, 50, NULL);
LineTo(dc, cxClient / 2 + cxClient / 100 * 2, cyClient / 100 * 2 + 50);
//название осей
SetTextColor(dc, crXYLines);
TextOut(dc, cxClient - cxClient / 100 * 2 - 30, cyClient / 2 + cyClient / 100 * 2, L"OX", 2);
TextOut(dc, cxClient / 2 + cxClient / 100 * 2.5, cyClient / 200 + 50, L"OY", 2);
TextOut(dc, cxClient - cxClient / 100 * 2 - 120, cyClient / 200 + 140, L"y=cos(x)", 8);


// рисуем график y=sin(x)
double Xmin;//минимальный Х
double Xmax;//максимальны Х
double x, y;//значений функций
int width, height;//высота, ширина делений

Xmin = -2 * PI;
Xmax = 2 * PI;

//ширину области деленим на колличество делений
width = cxClient / 12;
height = cyClient / 4;

for (x = Xmin; x <= Xmax; x += 0.001)
{
  y = -cos(x);//минус так как ось У направлена вниз
  SetPixel(dc, width*x + cxClient / 2, height*y + cyClient / 2, crFunction);

  //width* - коэф. для оси Х
  //height* - коэф. для оси У
}


SelectObject(dc, hOldPen);
DeleteObject(hPenOxy);
DeleteObject(hNew);
hold = (HFONT)SelectObject(dc, hbk); 




Синус




CClientDC dc(this);
GetClientRect(&rc);
hNew = CreateFont(28, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Times New Roman Cyr");
hold = (HFONT)SelectObject(dc, hNew);

dc.FillSolidRect(&rc, RGB(255, 255, 255));
msg.Format(L"График тригонометрической функции");
cf = RGB(255, 255, 255);
ck = RGB(50, 70, 120);
SetTextColor(dc, ck);
SetBkColor(dc, cf);
TextOutW(dc, rc.left + 150, rc.bottom - 450, msg, msg.GetLength());



COLORREF crFunction = RGB(190, 0, 0);//цвет графика
COLORREF crAxes = RGB(89, 89, 250);//цвет осей (линий)
COLORREF crMarks = RGB(0, 0, 160);//цвет отметок на шкале
COLORREF crXYLines = RGB(140, 70, 0);//название осей
COLORREF crDeleniya = RGB(0, 0, 165);//цвет текста


HPEN hPenOxy, hOldPen;
hPenOxy = CreatePen(PS_SOLID, 2, crAxes);//создаем кисть цветом "crOxy"
hOldPen = (HPEN)SelectObject(dc, hPenOxy);

SetTextColor(dc, crAxes);//устанавливаем цвет текста
int cxClient, cyClient;
cyClient = rc.bottom;//высота
cxClient = rc.right;//ширина

      //выводим ось OX
MoveToEx(dc, 0, cyClient / 2, NULL);
LineTo(dc, cxClient, cyClient / 2);
//выводим стрелочку
MoveToEx(dc, cxClient, cyClient / 2, NULL);
LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 - cyClient / 100 * 2);
MoveToEx(dc, cxClient, cyClient / 2, NULL);
LineTo(dc, cxClient - cxClient / 100 * 2, cyClient / 2 + cyClient / 100 * 2);
//рисуем ось OY
MoveToEx(dc, cxClient / 2, 50, NULL);
LineTo(dc, cxClient / 2, cyClient);
//выводим стрелочку
MoveToEx(dc, cxClient / 2, 50, NULL);
LineTo(dc, cxClient / 2 - cxClient / 100 * 2, cyClient / 100 * 2 + 50);
MoveToEx(dc, cxClient / 2, 50, NULL);
LineTo(dc, cxClient / 2 + cxClient / 100 * 2, cyClient / 100 * 2 + 50);
//название осей
SetTextColor(dc, crXYLines);
TextOut(dc, cxClient - cxClient / 100 * 2 - 30, cyClient / 2 + cyClient / 100 * 2, L"OX", 2);
TextOut(dc, cxClient / 2 + cxClient / 100 * 2.5, cyClient / 200 + 50, L"OY", 2);
TextOut(dc, cxClient - cxClient / 100 * 2 - 120, cyClient / 200 + 140, L"y=sin(x)", 8);


// рисуем график y=sin(x)
double Xmin;//минимальный Х
double Xmax;//максимальны Х
double x, y;//значений функций
int width, height;//высота, ширина делений

Xmin = -2 * PI;
Xmax = 2 * PI;

//ширину области деленим на колличество делений
width = cxClient / 12;
height = cyClient / 4;

for (x = Xmin; x <= Xmax; x += 0.001)
{
  y = -sin(x);//минус так как ось У направлена вниз
  SetPixel(dc, width*x + cxClient / 2, height*y + cyClient / 2, crFunction);

  //width* - коэф. для оси Х
  //height* - коэф. для оси У
}


SelectObject(dc, hOldPen);
DeleteObject(hPenOxy);
DeleteObject(hNew);
hold = (HFONT)SelectObject(dc, hbk);











Дякую за увагу!!!


Якщо у вас з'явились проблеми з програмою, то звертайтесь за електонними адресами vlluboh@gmail.com або vlad.lubohinec@ukr.net

Немає коментарів:

Дописати коментар