Roman Konopelko: В классе CGraphic заменил во всех местах тип color на uint, как вы и просили.
Так же добавил новые методы в класс CCanvas, которые позволяют рисовать примитивы с заданной толщиной: В соответствия с нововведение CCanvas расширил свойства CCurve: Теперь при отрисовки кривой линиями можно задавать толщину линий и стиль её концов.
Была пересмотрена работа со сплайнами (интерполяция кривыми Безье). Её реализация была перенесена из класса CGraphics непосредственно в CCanvas, что позволяет строить сплайны вне библиотеки Graphics.
Кроме того был добавлен алгоритм отрисовки замкнутого сплайна.
В итоге в классе CCanvas появилось два новый открытых метода:
Данные методы позволяет рисовать сплайны в заданном стиле и с заданной толщиной.
В следствие того, что кривые Безье довольно точно описываю круг и эллипс, нет явной необходимости дополнять класс CCanvas новыми методами для отрисовки этих примитивов с заданной толщиной.
Пример аппроксимации эллипса кривыми Безье на основе метода PolygoneSmooth:
#include <Canvas\Canvas.mqh>
//+------------------------------------------------------------------+//| Get arrays with ellipse coordinates |//+------------------------------------------------------------------+void Ellipse(int &x[],int &y[])
{
int xc = 750;
int yc = 300;
int rx = 300;
int ry = 150;
ArrayResize(x,16);
ArrayResize(y,16);
int i=0;
for(double fi=0; fi<2*M_PI; fi+=M_PI_4/2,i++)
{
x[i]=(int)MathRound(xc+cos(fi)*rx);
y[i]=(int)MathRound(yc+sin(fi)*ry);
}
}
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
CCanvas canvas;
canvas.CreateBitmapLabel(0,0,"Canvas",0,0,1500,600);
canvas.Erase(ColorToARGB(clrWhite));
int x[];
int y[];
Ellipse(x,y);
canvas.PolygoneSmooth(x,y,ColorToARGB(clrBlack),20,STYLE_SOLID,LINE_END_BUTT,0.5,1);
canvas.Arc(750,300,300,150,0,M_PI*2,ColorToARGB(clrRed));
canvas.Update();
}
Еще один возможный шаг в сторону универсальности библиотеки Graphics: пользовательский режим отрисовки кривых CURVE_CUSTOM.
Данный режим избавит от необходимости делать наследников класса CGraphic и перегружать методы ...Plot, что бы нарисовать кривую иначе, чем позволяют стандартные средства библиотеки.
Для реализации данного режима CURVE_CUSTOM в класс CCurve будут добавлены новые свойства:
2. Так как класс CCandle является наследником от CObject, то все свечи которые мы хотим нарисовать мы можем последовательно записать в объект класса CArrayObj. Этот массив будет попадать в наш пользовательский метод отрисовки как параметр cbdata. В итоге метод по отрисовки свечей будет выглядеть следующим образом:
//+------------------------------------------------------------------+//| Custom method for plot candles |//+------------------------------------------------------------------+void PlotCandles(double &x[],double &y[],int size,CGraphic *graphic,CCanvas *canvas,void *cbdata)
{
//--- check obj
CArrayObj *candles=dynamic_cast<CArrayObj*>(cbdata);
if(candles==NULL || candles.Total()!=size)
return;
//--- plot candles for(int i=0; i<size; i++)
{
CCandle *candle=dynamic_cast<CCandle*>(candles.At(i));
if(candle==NULL)
return;
//--- primary calculateint xc=graphic.ScaleX(x[i]);
int width_2=candle.CandleWidth()/2;
int open=graphic.ScaleY(candle.OpenValue());
int close=graphic.ScaleY(candle.CloseValue());
int high=graphic.ScaleY(candle.HigthValue());
int low=graphic.ScaleY(candle.LowValue());
uint clr=(open<=close) ? candle.CandleColorIncrement() : candle.CandleColorDecrement();
//--- plot candle
canvas.LineVertical(xc,high,low,0x000000);
//--- plot candle real body
canvas.FillRectangle(xc+width_2,open,xc-width_2,close,clr);
canvas.Rectangle(xc+width_2,open,xc-width_2,close,0x000000);
}
}
3. Для простоты, все свечи будем генерироваться случайным образом. И так мы последовательно генерируем 10 свечей и наполняем им объект класса CArrayObj. После создаём объект CGraphics и добавляем в него одну кривую при этом указывая, что её отрисовка будет происходить на основе наше функции PlotCandles. Так же необходимо изменить максимальное и минимальное значение по оси y, так что бы наши свечи были полностью видны.
Вот такой пример привёл к зависанию компьютера. Что делал: после навешивания индикатора на график в редакторе игрался различными комбинациями закомментировать/раскомментировать строки 87 и 88 (когда по одной, когда вместе)
Вот такой пример привёл к зависанию компьютера. Что делал: после навешивания индикатора на график в редакторе игрался различными комбинациями закомментировать/раскомментировать строки 87 и 88 (когда по одной, когда вместе)
Повторил достижение два раза. Жаль не записывал последовательность действий. Третий раз банально боюсь проверять.
Добавлено: билд 1607 х64
Сегодня повторил рекорд - мертвое зависание компьютера, успел увидеть рост потребления ОЗУ с 2 Гб до 5.5 Гб. Вроде успел закрыть график, но компьютер висит уже пять минут.
В этот раз ввел ограничение на размер массива - не более 300 элементов. Как видно не помогло 🤔
Ж жебага не дошло, я делал так: навесил индикатор и раскоментировал/закоментировал одну или две строки и компилировал. В итоге пишу с планшета, ноут ушёл в аут..
Ж жебага не дошло, я делал так: навесил индикатор и раскоментировал/закоментировал одну или две строки и компилировал. В итоге пишу с планшета, ноут ушёл в аут..
Так, ноут после жёсткой перезагрузки ожил, но желание дальше проводить губительный эксперимент пропало - на ноуте крутятся несколько советников, поэтому нет желания ловить зависон на целый час.
В классе CGraphic заменил во всех местах тип color на uint, как вы и просили.
Так же добавил новые методы в класс CCanvas, которые позволяют рисовать примитивы с заданной толщиной:
В соответствия с нововведение CCanvas расширил свойства CCurve:
Теперь при отрисовки кривой линиями можно задавать толщину линий и стиль её концов.
Да это же просто офигительно.
Была пересмотрена работа со сплайнами (интерполяция кривыми Безье). Её реализация была перенесена из класса CGraphics непосредственно в CCanvas, что позволяет строить сплайны вне библиотеки Graphics.
Кроме того был добавлен алгоритм отрисовки замкнутого сплайна.
В итоге в классе CCanvas появилось два новый открытых метода:
Данные методы позволяет рисовать сплайны в заданном стиле и с заданной толщиной.
В следствие того, что кривые Безье довольно точно описываю круг и эллипс, нет явной необходимости дополнять класс CCanvas новыми методами для отрисовки этих примитивов с заданной толщиной.
Пример аппроксимации эллипса кривыми Безье на основе метода PolygoneSmooth:
Результат:

Еще один возможный шаг в сторону универсальности библиотеки Graphics: пользовательский режим отрисовки кривых CURVE_CUSTOM.
Данный режим избавит от необходимости делать наследников класса CGraphic и перегружать методы ...Plot, что бы нарисовать кривую иначе, чем позволяют стандартные средства библиотеки.
Для реализации данного режима CURVE_CUSTOM в класс CCurve будут добавлены новые свойства:
Основывается он на новом указателе на функцию PlotFucntion:
Данный подход открывает новые возможности для отрисовки графиков.
Для примера реализуем построение свечей в библиотеки CGraphics:
1. Создадим класс-контейнер в котором будут храниться все данные об одной свече:
2. Так как класс CCandle является наследником от CObject, то все свечи которые мы хотим нарисовать мы можем последовательно записать в объект класса CArrayObj. Этот массив будет попадать в наш пользовательский метод отрисовки как параметр cbdata. В итоге метод по отрисовки свечей будет выглядеть следующим образом:
3. Для простоты, все свечи будем генерироваться случайным образом. И так мы последовательно генерируем 10 свечей и наполняем им объект класса CArrayObj. После создаём объект CGraphics и добавляем в него одну кривую при этом указывая, что её отрисовка будет происходить на основе наше функции PlotCandles. Так же необходимо изменить максимальное и минимальное значение по оси y, так что бы наши свечи были полностью видны.
В результате мы получаем следующий график:
@Roman Konopelko
есть небольшая ошибка в функции CGraphic::SetDefaultParameters
Должны быть инициализированы цвета с учетом непрозрачности.
@Roman Konopelko
есть небольшая ошибка в функции CGraphic::SetDefaultParameters
Должны быть инициализированы цвета с учетом непрозрачности.
Вот такой пример привёл к зависанию компьютера. Что делал: после навешивания индикатора на график в редакторе игрался различными комбинациями закомментировать/раскомментировать строки 87 и 88 (когда по одной, когда вместе)
Повторил достижение два раза. Жаль не записывал последовательность действий. Третий раз банально боюсь проверять.
Добавлено: билд 1607 х64
Вот такой пример привёл к зависанию компьютера. Что делал: после навешивания индикатора на график в редакторе игрался различными комбинациями закомментировать/раскомментировать строки 87 и 88 (когда по одной, когда вместе)
Повторил достижение два раза. Жаль не записывал последовательность действий. Третий раз банально боюсь проверять.
Добавлено: билд 1607 х64
Сегодня повторил рекорд - мертвое зависание компьютера, успел увидеть рост потребления ОЗУ с 2 Гб до 5.5 Гб. Вроде успел закрыть график, но компьютер висит уже пять минут.
В этот раз ввел ограничение на размер массива - не более 300 элементов. Как видно не помогло 🤔
что дебаг говорит?
что дебаг говорит?
Ж жебага не дошло, я делал так: навесил индикатор и раскоментировал/закоментировал одну или две строки и компилировал. В итоге пишу с планшета, ноут ушёл в аут..
Ж жебага не дошло, я делал так: навесил индикатор и раскоментировал/закоментировал одну или две строки и компилировал. В итоге пишу с планшета, ноут ушёл в аут..
Так, ноут после жёсткой перезагрузки ожил, но желание дальше проводить губительный эксперимент пропало - на ноуте крутятся несколько советников, поэтому нет желания ловить зависон на целый час.