<
  • Главная
Статьи

Графічні інтерфейси XI: Інтеграція графічної стандартної бібліотеки (build 16)

  1. зміст Вступ
  2. Зміни в схемі бібліотеки
  3. Додаток для тесту властивостей графіка
  4. Додаток для тесту властивостей кривих графіка
  5. Додаток з анімованим графіком гіпоціклоіди
  6. Нова версія тестового додатка з попередніх оновлень
  7. Висновок

зміст

Вступ

Більш докладно про те, для чого призначена ця бібліотека, можна прочитати в самій першій статті: Графічні інтерфейси I: Підготовка структури бібліотеки (Глава 1) . В кінці статей кожної частини представлений список глав з посиланнями, там же є можливість завантажити до себе на комп'ютер повну версію бібліотеки на поточній стадії розробки. Файли потрібно розмістити по тим же тек, як вони розташовані в архіві.

під другому розділі дев'ятої частини серії був продемонстрований приклад того, як можна інтегрувати в бібліотеку клас для створення лінійних графіків. Це було тимчасовим рішенням, так як можливостей цієї частини стандартної бібліотеки сильно не вистачало. Нещодавно розробники MQL5 представили нову версію графічної бібліотеки для створення наукових графіків (клас CGraphic). Деякі функції цього класу описані в статті Візуалізуй це! Графічна бібліотека в MQL5 як аналог plot з R . У цій статті я представлю оновлення бібліотеки для створення графічних інтерфейсів з новим елементом для створення графіків. Тепер візуалізувати дані різних типів можна буде ще простіше.

Зміни в схемі бібліотеки

До сих пір ми використовували для малювання копію класу CCanvas. У зв'язку з недавно проведеним глобальним рефакторингом коду бібліотеки тепер в цій копії немає необхідності. Її можна замінити оригінальною версією зі стандартної бібліотеки. Це зменшило обсяг бібліотеки ще приблизно на 10% і майже на 40% щодо версії, яка була представлена до рефакторінга.

Для створення графіків тепер буде використовуватися клас CGraphic, тому підключимо файл Graphic.mqh до файлу Objects.mqh. Так як файл з класом CCanvas підключений до одного з файлів, підключених, в свою чергу, до файлу Graphic.mqh, то він також стане доступним для всієї бібліотеки.

#include "Enums.mqh" #include "Defines.mqh" #include "Fonts.mqh" #include "Colors.mqh" #include <Graphics \ Graphic.mqh> #include <ChartObjects \ ChartObjectSubChart.mqh> ...

Клас CLineChart перейменований в CGraph. Зміни також торкнулися і його внутрішнього змісту. Тепер в цьому класі є тільки методи для управління загальними властивостями і станами елемента.

class CGraph: public CElement {public: virtual void OnEvent (const int id, const long & lparam, const double & dparam, const string & sparam); virtual void Moving (const bool only_visible = true); virtual void Show (void); virtual void Hide (void); virtual void Reset (void); virtual void Delete (void); virtual void Update (const bool redraw = false); private: void Resize (const int width, const int height); virtual void ChangeWidthByRightWindowSide (void); virtual void ChangeHeightByBottomWindowSide (void); };

Властивостями же графіка можна керувати, отримавши за допомогою методу CGraphic :: GetGraphicPointer () покажчик на екземпляр класу CGraphic:

class CGraph: public CElement {private: CGraphic m_graph; public: CGraphic * GetGraphicPointer (void) {return (:: GetPointer (m_graph)); }};

До класу CGraphic підключені додаткові класи для управління властивостями осей (CAxis) і кривих (CCurve) графіка. Для генерації кольору кривих призначений клас CColorGenerator. Всі ці класи містяться в окремих файлах, підключених до файлу Graphic.mqh:

#include <Arrays \ ArrayObj.mqh> #include "Curve.mqh" #include "Axis.mqh" #include "ColorGenerator.mqh" ...

Файл з класом CCanvas підключений до файлу Curve.mqh, і звідси він буде доступний у всій бібліотеці.

#include <Object.mqh> #include <Canvas \ Canvas.mqh> ...

Всі вищеописані взаємозв'язку між файлами і класами відображені на малюнку:

Всі вищеописані взаємозв'язку між файлами і класами відображені на малюнку:

Мал. 1. Взаємозв'язки між класами стандартної і розробляється бібліотеки.

Таким чином, для бібліотеки і файлів програми, в якому вона використовується, автоматично стають доступними класи стандартної бібліотеки для роботи з масивами і файлами. Нижче продемонструю кілька тестових MQL-додатків, щоб краще розібратися в нових можливостях.

Додаток для тесту властивостей графіка

У першому тестовому додатку реалізуємо графічний інтерфейс з елементами для управління деякими властивостями графіка типу CGraphic. У верхній частині форми розташуємо елемент типу CTabs. В даному випадку це група з чотирьох вкладок. Відразу під робочою областю вкладок буде графік з двома кривими, значення яких сгенерируем випадковим чином.

На першій вкладці (Background) створимо елементи управління такі властивості графіка:

  • Колір фону
  • Головний текст графіка (відображається у верхній частині)
  • Допоміжний текст графіка (відображається в нижній частині)
  • Колір головного тексту
  • Колір допоміжного тексту
  • Розмір шрифту головного тексту
  • Розмір шрифту допоміжного тексту

Для установки і отримання цих властивостей в класі CGraphic є відповідні публічні методи:

struct CBackground {uint clr; uint clr_main; uint clr_sub; string main; string sub; int size_main; int size_sub; }; class CGraphic {protected: CBackground m_background; public: uint BackgroundColor (void) const {return (m_background.clr); } Uint BackgroundMainColor (void) const {return (m_background.clr_main); } Uint BackgroundSubColor (void) const {return (m_background.clr_sub); } String BackgroundMain (void) const {return (m_background.main); } String BackgroundSub (void) const {return (m_background.sub); } Int BackgroundMainSize (void) const {return (m_background.size_main); } Int BackgroundSubSize (void) const {return (m_background.size_sub); } Void BackgroundColor (const uint clr) {m_background.clr = clr; } Void BackgroundMainColor (const uint clr) {m_background.clr_main = clr; } Void BackgroundSubColor (const uint clr) {m_background.clr_sub = clr; } Void BackgroundMain (const string main) {m_background.main = main; } Void BackgroundSub (const string sub) {m_background.sub = sub; } Void BackgroundMainSize (const int size) {m_background.size_main = size; } Void BackgroundSubSize (const int size) {m_background.size_sub = size; }};

Ось як це виглядає:

Мал. 2. Елементи першої вкладки (Background) тестового MQL-додатки.

На другій вкладці (Indents & history) розташуємо елементи для установки наступних властивостей:

  • Відступи (зліва, справа, зверху, знизу)
  • Ширина легенди
  • Розмір шрифту легенди
  • Розмір маркерів легенди
  • Загальні відступи між усіма елементами графіка
  • Розмір відміток на шкалах осей графіка

Для отримання і установки цих властивостей можна скористатися методами CGraphic, які показані в лістингу коду нижче:

struct CCurveHistory {int name_width; int name_size; int symbol_size; int count_total; int count_points; int count_lines; int count_histogram; int count_custom; }; class CGraphic {protected: CCurveHistory m_history; public: int IndentUp (void) const {return (m_up0); } Void IndentUp (const int up) {m_up0 = up; } Int IndentDown (void) const {return (m_down0); } Void IndentDown (const int down) {m_down0 = down; } Int IndentLeft (void) const {return (m_left0); } Void IndentLeft (const int left) {m_left0 = left; } Int IndentRight (void) const {return (m_right0); } Void IndentRight (const int right) {m_right0 = right; } Int GapSize (void) const {return (m_gap); } Void GapSize (const int size) {m_gap = size; } Int MajorMarkSize (void) const {return (m_mark_size); } Void MajorMarkSize (const int size) {m_mark_size = size; } Int HistoryNameWidth (void) const {return (m_history.name_width); } Int HistoryNameSize (void) const {return (m_history.name_size); } Int HistorySymbolSize (void) const {return (m_history.symbol_size); } Void HistoryNameWidth (const int width) {m_history.name_width = width; } Void HistoryNameSize (const int size) {m_history.name_size = size; } Void HistorySymbolSize (const int size) {m_history.symbol_size = size; }};

Ось як це виглядає в графічному інтерфейсі тестового MQL-додатки:

Мал. 3. Елементи другої вкладки (Indents & history) тестового MQL-додатки.

На третій вкладці (Grid) знаходяться елементи управління для установки властивостей сітки:

  • Колір ліній сітки
  • Колір нульової лінії осей
  • Колір фону сітки
  • Отрісовка точок у вузлах сітки
  • радіус точок
  • колір точок

Для отримання і установки цих властивостей в класі CGraphic є відповідні методи:

struct CGrid {uint clr_line; uint clr_background; uint clr_circle; uint clr_axis_line; uint clr_frame; int r_circle; bool has_circle; }; class CGraphic {protected: CGrid m_grid; public: uint GridLineColor (void) const {return (m_grid.clr_line); } Uint GridAxisLineColor (void) const {return (m_grid.clr_axis_line); } Uint GridBackgroundColor (void) const {return (m_grid.clr_background); } Int GridCircleRadius (void) const {return (m_grid.r_circle); } Uint GridCircleColor (void) const {return (m_grid.clr_circle); } Bool GridHasCircle (void) const {return (m_grid.has_circle); } Void GridLineColor (const uint clr) {m_grid.clr_line = clr; } Void GridAxisLineColor (const uint clr) {m_grid.clr_axis_line = clr; } Void GridBackgroundColor (const uint clr) {m_grid.clr_background = clr; } Void GridCircleRadius (const int r) {m_grid.r_circle = r; } Void GridCircleColor (const uint clr) {m_grid.clr_circle = clr; } Void GridHasCircle (const bool has) {m_grid.has_circle = has; }};

Ось як це виглядає в результаті:

Мал. 4. Елементи третьої вкладки (Grid) тестового MQL-додатки.

На четвертій вкладці (Axes) розташувалися елементи, за допомогою яких можна змінювати властивості осей графіка. Перемикатися для настройки тієї чи іншої осі можна радіо-кнопками в лівій частині робочої області вкладок, які відділені від інших елементів вкладки Axes розділової лінією.

Перерахуємо властивості, які будуть доступні для зміни:

  • Автомасштабування
  • Мінімальне значення осі
  • Максимальне значення осі
  • Значення допуску для мінімуму осі
  • Значення допуску для максимуму осі
  • Розмір цифр на осі
  • Максимальна відображається довжина цифр на осі
  • Розмір шрифту для імені осі
  • Початкове значення кроку по осі
  • Максимальна кількість цифр на осі
  • ім'я осі
  • Колір тексту імені осі

У лістингу нижче показані назви методів класу CAxis для отримання і зміни вищеописаних властивостей:

class CAxis {private: double m_min; double m_max; uint m_clr; string m_name; int m_name_size; int m_values_size; int m_values_width; bool m_auto_scale; double m_default_step; double m_max_labels; double m_min_grace; double m_max_grace; public: CAxis (void); ~ CAxis (void); double Min (void) const {return (m_min); } Void Min (const double min) {m_min = min; } Double Max (void) const {return (m_max); } Void Max (const double max) {m_max = max; } String Name (void) const {return (m_name); } Void Name (const string name) {m_name = name; } Uint Color (void) const {return (m_clr); } Void Color (const uint clr) {m_clr = clr; } Bool AutoScale (void) const {return (m_auto_scale); } Void AutoScale (const bool auto) {m_auto_scale = auto; } Int ValuesSize (void) const {return (m_values_size); } Void ValuesSize (const int size) {m_values_size = size; } Int ValuesWidth (void) const {return (m_values_width); } Void ValuesWidth (const int width) {m_values_width = width; } Int NameSize (void) const {return (m_name_size); } Void NameSize (const int size) {m_name_size = size; } Double DefaultStep (void) const {return (m_default_step); } Void DefaultStep (const double value) {m_default_step = value; } Double MaxLabels (void) const {return (m_max_labels); } Void MaxLabels (const double value) {m_max_labels = value; } Double MinGrace (void) const {return (m_min_grace); } Void MinGrace (const double value) {m_min_grace = value; } Double MaxGrace (void) const {return (m_max_grace); } Void MaxGrace (const double value) {m_max_grace = value; }};

Ось що в результаті вийшло:

Мал. 5. Елементи четвертої вкладки (Axes) тестового MQL-додатки.

В кінці статті ви можете завантажити до себе на комп'ютер це тестове додаток для більш докладного вивчення.


Додаток для тесту властивостей кривих графіка

Для тестів деяких властивостей кривих графіка типу CGraphic було написано окреме MQL-додаток. У верхній частині його форми розташовані елементи для управління властивостями кривих графіка, а відразу за ними - два графіка типу CGraphic (елемент CGraph). На першому графіку будуть відображатися серії з випадковими даними, а на другому - їх похідні, які для прикладу будуть розраховуватися за формулою індикатора Momentum.

Перерахуємо елементи для управління властивостями кривих графіка.

  • Чекбокс Animate призначений для запуску автоматичного надходження даних на графік.
  • Поле введення Array size - поточна кількість елементів в масиві даних, що відображаються на графіку.
  • Кнопка Random генерує випадкові послідовності даних в серіях на графіку.
  • Поле введення Period - значення змінної для розрахунку індикатора Momentum.
  • Комбо-бокс Curve type - вибір типу кривих на графіку.
  • Комбо-бокс Point type - вибір типу точок даних, за якими будуються криві.

У призначеному для користувача класі програми (CProgram) реалізовані методи, пов'язані з перерахованими вище елементами управління і виконують такі завдання:

  • Установка розміру масивів даних для виведення на графік
  • Ініціалізація масивів даними
  • Оновлення графіків для відображення останніх змін
  • Додавання одного елемента в кінець масивів
  • Видалення одного елемента в кінці масивів
  • Оновлення графіків по таймеру
  • Анімація графіків з автоматичним вступом нових даних

Методи, в яких все це реалізовано, показані в лістингу коду нижче. Детальніше з кодом цих методів можна ознайомитися, завантаживши файли в кінці статті.

class CProgram: public CWndEvents {protected: double data1 []; double data2 []; double data3 []; double data4 []; private: void ResizeGraph1Arrays (void); void ResizeGraph2Arrays (void); void ResizeGraph1Arrays (const int new_size); void ResizeGraph2Arrays (const int new_size); void InitGraph1Arrays (void); void InitGraph2Arrays (void); void ZeroGraph1Arrays (void); void ZeroGraph2Arrays (void); void SetGraph1Value (const int index); void SetGraph2Value (const int index); void UpdateGraph (void); void UpdateGraph1 (void); void UpdateGraph2 (void); void RecalculatingSeries (void); void AddValue (void); void DeleteValue (void); void UpdateGraphByTimer (void); void AnimateGraphSeries (void); };

Нижче показано, як це виглядає:

Мал. 6. Графічний інтерфейс програми для тестування властивостей кривих графіка.

В кінці статті ви можете завантажити до себе на комп'ютер це тестове додаток для більш докладного вивчення.

Додаток з анімованим графіком гіпоціклоіди

В одній зі своїх книг з програмування на VBA в середовищі програми Microsoft Excel Джон Уокенбах надає читачам компакт-диск з файлами для тестів. В одному з файлів реалізована діаграма, в якій генерується нескінченну кількість гіпоциклоїда.

Вікіпедія дає таке визначення:

гіпоциклоїда (Від грецьких слів ὑπό - під, внизу і κύκλος - коло, коло) - плоска крива, утворена точкою кола, що котиться по внутрішній стороні інший кола без ковзання.

Визначення Джона Уокенбаха в своїй книзі:

Гіпоциклоїда - це траєкторія точки, що знаходиться на колі, яка рухається всередині іншої окружності.

Реалізуємо таке ж додаток на MQL, а для управління параметрами додамо графічний інтерфейс. Розглянемо докладніше, як це влаштовано.

Для генерації нової гіпоціклоіди використовуються три параметри, за якими не започатковано числові послідовності з зазначеним кроком. Потім за значеннями в цих послідовностях здійснюються розрахунки для отримання координат точок на графіку. Після цього результати нормалізуються.

У призначеному для користувача класі оголосимо кілька масивів для розрахунку послідовностей і полів для розрахунку середнього і стандартного відхилення:

#include <Math \ Stat \ Stat.mqh> #include <EasyAndFastGUI \ WndEvents.mqh> #include <EasyAndFastGUI \ TimeCounter.mqh> class CProgram: public CWndEvents {protected: ... double a_inc []; double b_inc []; double t_inc []; double x_source []; double y_source []; double x_norm []; double y_norm []; double x_mean; double y_mean; double x_sdev; double y_sdev; ...}; CProgram :: CProgram (void): x_mean (0), y_mean (0), x_sdev (0), y_sdev (0) {...}

Значення будуть розраховуватися в методі CProgram :: InitArrays (). Тут в першому циклі розраховуються вихідні дані. Потім виходять середнє і стандартне відхилення, у другому циклі нормалізуються дані. Розмір масивів встановлюється за допомогою методу CProgram :: ResizeArrays (). Значення для розміру масивів береться з елементу управління «Поле введення» (CTextEdit) графічного інтерфейсу програми.

class CProgram: public CWndEvents {private: void ResizeArrays (void); void InitArrays (void); }; void CProgram :: ResizeArrays (void) {int array_size = :: ArraySize (x_norm); int new_size = (int) m_array_size.GetValue (); if (array_size == new_size) return; :: ArrayResize (a_inc, new_size); :: ArrayResize (b_inc, new_size); :: ArrayResize (t_inc, new_size); :: ArrayResize (x_source, new_size); :: ArrayResize (y_source, new_size); :: ArrayResize (x_norm, new_size); :: ArrayResize (y_norm, new_size); } Void CProgram :: InitArrays (void) {ResizeArrays (); int total = (int) m_array_size.GetValue (); for (int i = 0; i <total; i ++) {if (i <1) {a_inc [i] = 1 + (double) m_animate.GetValue (); b_inc [i] = 1 + (double) m_animate.GetValue (); t_inc [i] = 1 + (double) m_animate.GetValue (); } Else {a_inc [i] = a_inc [i- 1] + (double) m_a_inc.GetValue (); b_inc [i] = b_inc [i- 1] + (double) m_b_inc.GetValue (); t_inc [i] = t_inc [i- 1] + (double) m_t_inc.GetValue (); } Double a = a_inc [i]; double b = b_inc [i]; double t = t_inc [i]; x_source [i] = (ab) * cos (t) + b * cos ((a / b- 1) * t); y_source [i] = (ab) * sin (t) + b * sin ((a / b- 1) * t); } X_mean = MathMean (x_source); y_mean = MathMean (y_source); x_sdev = MathStandardDeviation (x_source); y_sdev = MathStandardDeviation (y_source); x_sdev = (x_sdev == 0)? 1: x_sdev; y_sdev = (y_sdev == 0)? 1: y_sdev; for (int i = 0; i <total; i ++) {x_norm [i] = (x_source [i] -x_mean) / x_sdev; y_norm [i] = (y_source [i] -y_mean) / y_sdev; }}

У класі CGraphic є методи, які дозволяють додати в робочу область створеного графіка додаткові зарубки на шкали осей, лінії і текст.

У разі нашого прикладу, за допомогою методу CProgram :: TextAdd () будемо виводити в лівому верхньому кутку діаграми значення середнього і стандартного відхилення для X - і Y-послідовний. Для отримання координат крайньої точки (лівий верхній кут) діаграми використовуються методи CGraphic :: ScaleX () і CGraphic :: ScaleY (), які призначені для масштабування реальних значень графіка в піксельні координати. Тут в якості реальних значень подаються мінімум по осі X і максимум по осі Y.

class CProgram: public CWndEvents {private: void TextAdd (void); }; void CProgram :: TextAdd (void) {CGraphic * graph = m_graph1.GetGraphicPointer (); int x = graph.ScaleX (graph.XAxis (). Min ()) +50; int y = graph.ScaleY (graph.YAxis (). Max ()) +10; int y2 = y + 20; uint clr = :: ColorToARGB (clrBlack); uint align = TA_RIGHT; string str [8]; str [0] = "x mean:"; str [1] = "y mean:"; str [2] = :: DoubleToString (x_mean, 2); str [3] = :: DoubleToString (y_mean, 2); str [4] = "x sdev:"; str [5] = "y sdev:"; str [6] = :: DoubleToString (x_sdev, 2); str [7] = :: DoubleToString (y_sdev, 2); int l_x = 0, l_y = 0; for (int i = 0; i <8; i ++) {if (i <2) l_x = x; else if (i <6) l_x = (i% 2 == 0)? l_x + 50: l_x; else l_x = (i% 2 == 0)? l_x + 60: l_x; l_y = (i% 2 == 0)? y: y2; graph.TextAdd (l_x, l_y, str [i], clr, align); }}

Після того, як на графік встановлені всі необхідні дані, потрібно його перемалювати для відображення останніх змін. Для цього використовується метод CProgram :: UpdateSeries (). Тут спочатку перевіряємо, чи є на графіку серії. Якщо є, то встановлюємо розраховані в останній раз дані. Крім цього, за допомогою елементів управління графічного інтерфейсу додатку встановлюємо властивості для кривої. Тут це (1) згладжування кривої, (2) тип точок і (3) тип кривої. Н Аносов текст на графік потрібно вже після того, як були встановлені і намальовані всі інші властивості і дані. У самому кінці потрібно обов'язково оновити графік, щоб побачити результат.

class CProgram: public CWndEvents {private: void UpdateSeries (void); }; void CProgram :: UpdateSeries (void) {CGraphic * graph = m_graph1.GetGraphicPointer (); int total = graph.CurvesTotal (); if (total> 0) {CCurve * curve = graph.CurveGetByIndex (0); curve.Update (x_norm, y_norm); ENUM_CURVE_TYPE curve_type = (ENUM_CURVE_TYPE) m_curve_type.GetListViewPointer (). SelectedItemIndex (); ENUM_POINT_TYPE point_type = (ENUM_POINT_TYPE) m_point_type.GetListViewPointer (). SelectedItemIndex (); curve.LinesSmooth (m_line_smooth.IsPressed ()); curve.PointsType (point_type); curve.Type (curve_type); } Graph.Redraw (true); TextAdd (); graph.Update (); }

Для розрахунку і застосування отриманих результатів одним викликом використовується метод CProgram :: RecalculatingSeries ():

class CProgram: public CWndEvents {private: void RecalculatingSeries (void); }; void CProgram :: RecalculatingSeries (void) {InitArrays (); UpdateSeries (); }

Побудована за цими формулами діаграма буде виглядати цікавіше, якщо стане анимированной. Щоб привести в рух розраховуються послідовності, потрібно змінювати їх початкове значення. Цього можна домогтися, вводячи значення за допомогою поля введення або запустивши процес в автоматичному режимі. В автоматичному режимі приріст або зменшення значення в цьому полі введення здійснюється в методі CProgram :: AnimateGraphSeries (). Він викликається в методі CProgram :: UpdateGraphByTimer (), виклик якого, в свою чергу, здійснюється в таймері додатки.

class CProgram: public CWndEvents {private: void UpdateGraphByTimer (void); void AnimateGraphSeries (void); }; void CProgram :: OnTimerEvent (void) {CWndEvents :: OnTimerEvent (); if (m_counter1.CheckTimeCounter ()) {UpdateGraphByTimer (); } ...} void CProgram :: UpdateGraphByTimer (void) {if (m_window.IsMinimized () ||! M_animate.IsPressed ()) return; AnimateGraphSeries (); RecalculatingSeries (); } Void CProgram :: AnimateGraphSeries (void) {static bool counter_direction = false; if ((double) m_animate.GetValue () <= (double) m_animate.MinValue ()) counter_direction = false; if ((double) m_animate.GetValue ()> = (double) m_animate.MaxValue ()) counter_direction = true; string value = ""; if (! counter_direction) value = string ((double) m_animate.GetValue () + m_animate.StepValue ()); else value = string ((double) m_animate.GetValue () - m_animate.StepValue ()); m_animate.SetValue (value, false); m_animate.GetTextBoxPointer (). Update (true); }

В результаті вийшов результат, показаний нижче:

Мал. 7. Демонстрація анімованого гіпоциклоїда.

В кінці статті ви можете завантажити до себе на комп'ютер це тестове додаток для більш докладного вивчення.

Нова версія тестового додатка з попередніх оновлень

Тестове додаток, яке було продемонстровано в статті Графічні інтерфейси IX: Елементи "Індикатор виконання" і "Лінійний графік" (Глава 2) , Було оновлено відповідно до змін в даному оновленні.

Нижче показано, як виглядає нова версія цього MQL-додатки з оновленим графічним інтерфейсом:

Нижче показано, як виглядає нова версія цього MQL-додатки з оновленим графічним інтерфейсом:

Мал. 8. Нова версія тестового додатка з попередніх оновлень.

В кінці статті ви можете завантажити до себе на комп'ютер це тестове додаток для більш докладного вивчення.

Висновок

У цій статті в розроблювану бібліотеку для створення графічних інтерфейсів була інтегрована частина стандартної бібліотеки для побудови наукових графіків. Всі продемонстровані приклади ви можете завантажити до себе на комп'ютер в кінці статті для більш докладного вивчення вихідних кодів.

На поточному етапі розробки бібліотеки її загальна схема виглядає так:

На поточному етапі розробки бібліотеки її загальна схема виглядає так:

Мал. 9. Структура бібліотеки на поточній стадії розробки.

Представлений код бібліотеки безкоштовний. Ви можете використовувати його в своїх проектах, в тому числі і комерційних, писати статті і виконувати замовлення.

Якщо у вас є питання по використанню матеріалу зі статті, можете задати їх у коментарях.

X_sdev; y_sdev = (y_sdev == 0)?
L_x + 50: l_x; else l_x = (i% 2 == 0)?
L_x + 60: l_x; l_y = (i% 2 == 0)?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью