Canvas - это круто! - страница 64

 
Vladimir Pastushak:

Всем привет, появилось желание углубить свои знания в Canvas 

но даже не знаю с чего начать. Сейчас представляю что канва это сложные логарифмические формулы и все в этом духе.

Подскажите на примере, как на канве сделать кнопку как ниже. Для понимания нужен код.


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Делаем краудсорсовый проект по Canvas

Nikolai Semko, 2017.05.24 02:20


Вот что получилось. 


Кнопку можно выводить за задний план и на передний, задавать фиксацию нажатия или без фиксации.

В файле примера CanvasButton.mq5 реализована возможность перетаскивания кнопки мышью. Для этого просто нужно нажать Ctrl для перемещения синей кнопки, и Shift для перемещения красной кнопки.

Т.к. класс GButton является потомком класса CCanvas, в примере продемонстрирована  возможность использования функций класса CCanvas на примере окружности CircleWu (Это реализовано в OnInit). А значит можно и текст писать на кнопке с помощью функций класса CCanvas. 

Данный класс, конечно же не претендует на чистовой. Графика не блещет совершенством и 3D весьма условно, не реализованы тени, не проведена оптимизация скорости выполнения. И скорей всего есть масса шероховатостей и отсутствие различных проверок. Так что не судите строго.

Если чуть больше времени потратить, конечно и такое можно сделать:


Просто я попробовал... можно сказать, - задать направление.


файл Canvas.mqh отличается от оригинала только тем что массив m_pixels определен как public.


 

Николаю конечно респект за его живой энтузиазм по экспериментам с Canvas ) Почитал ветку с удовольствием. И с не меньшим ознакомился с примерами кода.

Увы конечно, но Canvas в его текущей реализации - это исключительно CPU-bound алгоритмы по заполнению bitmap-массива графическими примитивами. Т.е. через циклы с перебором элементов массива и вот это вот все... А меж тем шел 21 год...

Эксперименты это конечно хорошо, но реализация для практических задач должна быть не только красивой, но и эффективной. Ибо сидя на каком либо топовом 8-ядернике конечно можно этим пренебречь, но у основной массы потребителей - ПК как правило довольно средние по характеристикам. И какой либо GUI полноэкранный с визуализацией рыночных данных, будь он даже очень удобным и красивым - не будет пользоваться популярностью, если будет нагружать CPU процентов под 75. Это факт. Именно поэтому, а не потому, что им просто больше не чем было заняться - в реализации Canvas во всех основных браузерах завезли аппаратное ускорение.

Вот собственно подходя к сути - в MQL5 бы какой либо wrapper для Direct2D (и DirectWrite) - вот это была бы действительно бомба, открывающая путь и к эффективной аппаратно ускоренной реализации многих практических задач в области GUI и визуализации данных. Можно конечно сказать, что вот есть же уже DirectX. Но представлена только Direct3D его часть, а это 3D проекции, шейдеры и прочие атрибуты 3D и это все же довольно узкая ниша для практического применения. Да, конечно можно путем определенной настройки проекций и прочих манипуляций и тесселяций добиться отрисовки 2D-графики и через Direct3D - но это означает ни много ни мало создать свою собственную реализацию Direct2D over Direct3D. А это лишено всякого смысла, так как Direct2D реализован давным давно.

Такие вот мысли...
 
Но при этом и на CPU все быстро рисуется.

Примеры выше это доказывают. Плюс у нас прикладная область, где нет жестких требований к конечной красоте и навороченности изображений.
 
Codexample:

Николаю конечно респект за его живой энтузиазм по экспериментам с Canvas ) Почитал ветку с удовольствием. И с не меньшим ознакомился с примерами кода.

Увы конечно, но Canvas в его текущей реализации - это исключительно CPU-bound алгоритмы по заполнению bitmap-массива графическими примитивами. Т.е. через циклы с перебором элементов массива и вот это вот все... А меж тем шел 21 год...

Эксперименты это конечно хорошо, но реализация для практических задач должна быть не только красивой, но и эффективной. Ибо сидя на каком либо топовом 8-ядернике конечно можно этим пренебречь, но у основной массы потребителей - ПК как правило довольно средние по характеристикам. И какой либо GUI полноэкранный с визуализацией рыночных данных, будь он даже очень удобным и красивым - не будет пользоваться популярностью, если будет нагружать CPU процентов под 75. Это факт. Именно поэтому, а не потому, что им просто больше не чем было заняться - в реализации Canvas во всех основных браузерах завезли аппаратное ускорение.

Вот собственно подходя к сути - в MQL5 бы какой либо wrapper для Direct2D (и DirectWrite) - вот это была бы действительно бомба, открывающая путь и к эффективной аппаратно ускоренной реализации многих практических задач в области GUI и визуализации данных. Можно конечно сказать, что вот есть же уже DirectX. Но представлена только Direct3D его часть, а это 3D проекции, шейдеры и прочие атрибуты 3D и это все же довольно узкая ниша для практического применения. Да, конечно можно путем определенной настройки проекций и прочих манипуляций и тесселяций добиться отрисовки 2D-графики и через Direct3D - но это означает ни много ни мало создать свою собственную реализацию Direct2D over Direct3D. А это лишено всякого смысла, так как Direct2D реализован давным давно.

Такие вот мысли...

Спасибо на добром слове.
На самом деле MQ в этом плане молодцы и позаботились о графических и вычислительных инструментах с использованием GPU, а не только CPU.
Я имею ввиду OpenCL и DirectX.
Вот примеры сравнения реализации одной и той же графической задачи (8 центров гравитации) в трех вариантах - CPU, OpenCL(GPU) и DirectX(GPU):

1.CPU -14 кадров в секунду. (скрипт Swirl2.mq5)

2. OpenCL - 162 кадра в секунду (требуется установить на компьютер драйвера OpenCL)  (скрипт Swirl2_OCL.mq5)

3. DirectX - 37 кадров в секунду.  (скрипт Swirl2_GPU.mq5)


поэтому не так уж все и меланхолично. 
Если нужна максимальная производительность, то можно задействовать и графическую карту.
Должен отметить, что эти тесты проводились на достаточно слабом ноутбуке со слабой видеокартой Intel® HD Graphics 620.
Не смотря на то, что использование мощности видеокаты дает весьма приличный прирост производительности, я согласен с Ренатом, что даже использование CPU для вывода графики покрывает более 99% всех графических задач в области задач MQL5.
Пока мой кадр формируется за менее чем 10 миллисекунд, я особо не дергаюсь в сторону GPU (хотя соблазн есть иногда, хорошо, что такая возможность для маневра существует).
А за 10 миллисекунд можно вывести, например, такое c тенями, сглаженностью и прозрачностью:


ЗЫ  коды для GPU подсмотрел в этой ветке, за что большое спасибо @Rorschach и @Serhii Shevchuk 

Файлы:
Swirl2.mq5  5 kb
Swirl2_OCL.mq5  14 kb
 
Народ, а ресайз графических ресурсов с использованием интерполяции на Canvas кто-нибудь делал?
 
Nikolay Kositsin:
Народ, а ресайз графических ресурсов с использованием интерполяции на Canvas кто-нибудь делал?

Здесь приводил пример кода. Правда код далёк от совершенства. Сейчас бы сделал все совсем по другому.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Canvas - это круто!

Nikolai Semko, 2018.03.24 04:13

Демонстрация скрипта с растровым масштабированием 

В файле Ex5 сидит достаточно большой BMP файл в виде ресурса.



 
Nikolai Semko:

Здесь приводил пример кода. Правда код далёк от совершенства. Сейчас бы сделал все совсем по другому.


Вот прям интересно как бы ты сделал сейчас. Чисто в моих шкурных интересах :)

 
Nikolai Semko:

Здесь приводил пример кода. Правда код далёк от совершенства. Сейчас бы сделал все совсем по другому.


Красота неописуемая :)

 

OpenCL: https://www.mql5.com/ru/forum/162864

DirectX: Remnant 3D в стандартной поставке

Вот что можно сделать с OpenCL прямо в терминале MetaTrader 5 без всяких DLL
Вот что можно сделать с OpenCL прямо в терминале MetaTrader 5 без всяких DLL
  • 2016.12.10
  • www.mql5.com
Это демонстрация не только расчетов на GPU в MQL5 коде, но и графических возможностей терминала: Полный исходный код в виде скрипта приложен...
 
Artyom Trishkin:

Вот прям интересно как бы ты сделал сейчас. Чисто в моих шкурных интересах :)

Ну если очень коротко, Артем,  то раньше я воспринимал пиксель как квадрат с вычислением его весового участия в пикселе нового масштаба через площадь, то сейчас бы воспринимал, как круг с вычислением весового участия через расстояние до центра пикселя новго масштаба.
Причина обращения: