Обсуждение статьи "Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R" - страница 5

 
Anatoli Kazharski #:

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

Речь шла о попытке нарисовать полностью непрозрачный круг со сглаженными краями (по алгоритму Ву) без потери сглаженности.

Для этого нужны специальные методы заливки со сглаженными краями.

Понимаю, что самостоятельно не сделать?

 
Artyom Trishkin #:

Понимаю, что самостоятельно не сделать?

Почему нет? Попробуй! )

Можно даже тот случай решить, о котором ты упомянул:

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

Обсуждение статьи "Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R"

Artyom Trishkin, 2023.07.31 12:39

Все методы сглаживания сильно зависят от непрозрачности линии. При примерно 50% прозрачности уже всё становится не сглаженным и имеет артефакты.

То есть отрисовку на полностью прозрачном холсте (CCanvas) можно сделать с учётом нижнего слоя (график и другие объекты) и это будет без артефактов.

Правда представляется это весьма костыльно и громоздко. Непонятно также пока, насколько это скажется на производительности. Хотелось бы всё же, чтобы этот баг исправили разработчики терминала. 

 
Anatoli Kazharski #:

Почему нет? Попробуй! )

Можно даже тот случай решить, о котором ты упомянул:

То есть отрисовку на полностью прозрачном холсте (CCanvas) можно сделать с учётом нижнего слоя (график и другие объекты) и это будет без артефактов.

Правда представляется это весьма костыльно и громоздко. Непонятно также пока, насколько это скажется на производительности. Хотелось бы всё же, чтобы этот баг исправили разработчики терминала. 

Я бы такую задачку (если не разработчики, а участники форума) направил для решения Николаю @Nikolai Semko ;)

 
Artyom Trishkin #:

Я бы такую задачку (если не разработчики, а участники форума) направил для решения Николаю @Nikolai Semko ;)

Он работает только с одним холстом. 

А я пока не готов переписывать свою графическую библиотеку, чтобы всё работало на одном холсте. 

Хоть это и интересно, но зная, сколько на это может уйти времени не могу в данный момент решиться на такое испытание. Времени сейчас нет так много, как раньше. 

 
Anatoli Kazharski #:

Он работает только с одним холстом. 

А я пока не готов переписывать свою графическую библиотеку, чтобы всё работало на одном холсте. 

Хоть это и интересно, но зная, сколько на это может уйти времени не могу в данный момент решиться на такое испытание. Времени сейчас нет так много, как раньше. 

Ну так ведь это же алгоритм. Какая разница - на одном холсте, или нескольких?

 
Artyom Trishkin #:

Ну так ведь это же алгоритм. Какая разница - на одном холсте, или нескольких?

Мы обсудили две задачи:

1. Если речь о той, о которой я говорил изначально, то тогда для некоторых случаев алгоритмического решения было бы достаточно.

2. Если о той, которую упомянул ты, то тогда здесь парой функций не обойтись. Нужна схема, где в массивах сохраняются все слои. Каждый слой должен отрисовываться с учётом того, что нарисовано на слоях под ним. Кроме этого нужно корректировать все методы в классе CCanvas. Цвет каждого пикселя должен смешиваться с тем, который находится под ним с учётом прозрачности. Тогда не будет артефактов (просветы, рваные края и т.д.). Если всё сделать правильно, то тогда можно реализовать полупрозрачность с размытием. Всё это достаточно просто реализовать на одном холсте. Но когда используется несколько холстов, то это реализовать значительно сложнее.

 
Anatoli Kazharski #:

Он работает только с одним холстом. 

А я пока не готов переписывать свою графическую библиотеку, чтобы всё работало на одном холсте. 

Хоть это и интересно, но зная, сколько на это может уйти времени не могу в данный момент решиться на такое испытание. Времени сейчас нет так много, как раньше. 

На самом деле я использую несколько холстов ( как правило не больше 4) 
Всегда существует золотая середина. Одна крайность - всю статику и всю динамику рисовать на одном холсте, другая крайность - все объекты рисовать, как отдельные холсты.
Важно не забывать, что если у вас есть два холста с прозрачностью, перекрывающие друг друга, то все равно процессор, ( может быть в Win10-11  GPU,,но думаю все же CPU), будут смешивать каждый пиксель даже однородного (ненулевой прозрачности) фона.
Здесь можно позаимствовать у JS практику кэширования канваса или его части для повышения производительности.
Что касается сглаженных кругов, то я уже публиковал вариант такого круга, которая идеальна (по производительности) для кругов радиусом меньше ~5 пикселей. Функция вроде называлась iDot(),  и была в коде 3DStars. Она очень примитивная и короткая (примерно 10 строк кода). Для кругов большего радиуса она далеко не оптимальна в плане производительности. Для больших радиусов высокопроизводительная функция уже больше 100 строк кода. 
Да, после многих лет установления новых нейронных связей в мозгу по холсту, я сейчас могу сделать библиотеку по холсту любого уровня. Было бы время и мотивация. 
Алгоритм Wu считаю устаревшим.
 
Anatoli Kazharski #:

Мы обсудили две задачи:

1. Если речь о той, о которой я говорил изначально, то тогда для некоторых случаев алгоритмического решения было бы достаточно.

2. Если о той, которую упомянул ты, то тогда здесь парой функций не обойтись. Нужна схема, где в массивах сохраняются все слои. Каждый слой должен отрисовываться с учётом того, что нарисовано на слоях под ним. Кроме этого нужно корректировать все методы в классе CCanvas. Цвет каждого пикселя должен смешиваться с тем, который находится под ним с учётом прозрачности. Тогда не будет артефактов (просветы, рваные края и т.д.). Если всё сделать правильно, то тогда можно реализовать полупрозрачность с размытием. Всё это достаточно просто реализовать на одном холсте. Но когда используется несколько холстов, то это реализовать значительно сложнее.

Я вроде говорил лишь об алгоритме сглаживания. Безотносительно к наложению прозрачных холстов друг на друга. Хотя... Если наложить, то наверняка всплывут новые задачи. Потому и сослался на Николая - у него вон, видишь, всё нейронными связями давно закреплено, и мозг уже сам наверное мыслит с учётом всех возможных проблем с канвасом )

 
Artyom Trishkin #:

Я вроде говорил лишь об алгоритме сглаживания. Безотносительно к наложению прозрачных холстов друг на друга. Хотя... Если наложить, то наверняка всплывут новые задачи. Потому и сослался на Николая - у него вон, видишь, всё нейронными связями давно закреплено, и мозг уже сам наверное мыслит с учётом всех возможных проблем с канвасом )

Артем, это реально не тривиальные задачи, которые требуют новых нейронных связей. Например в SVG есть такое понятие как viewBox. Уже кучу видосов посмотрел как он работает, кучу документации прочитал, кучу кода написал, а до сих пор иногда впадаю в ступор. Нужных нейронных связей до сих пор нет, хотя уже несколько раз казалось, что во всем разобрался. 

 
Nikolai Semko #:
На самом деле я использую несколько холстов ( как правило не больше 4) 
Всегда существует золотая середина. Одна крайность - всю статику и всю динамику рисовать на одном холсте, другая крайность - все объекты рисовать, как отдельные холсты.
Важно не забывать, что если у вас есть два холста с прозрачностью, перекрывающие друг друга, то все равно процессор, ( может быть в Win10-11  GPU,,но думаю все же CPU), будут смешивать каждый пиксель даже однородного (ненулевой прозрачности) фона.
Здесь можно позаимствовать у JS практику кэширования канваса или его части для повышения производительности.
Что касается сглаженных кругов, то я уже публиковал вариант такого круга, которая идеальна (по производительности) для кругов радиусом меньше ~5 пикселей. Функция вроде называлась iDot(),  и была в коде 3DStars. Она очень примитивная и короткая (примерно 10 строк кода). Для кругов большего радиуса она далеко не оптимальна в плане производительности. Для больших радиусов высокопроизводительная функция уже больше 100 строк кода. 
Да, после многих лет установления новых нейронных связей в мозгу по холсту, я сейчас могу сделать библиотеку по холсту любого уровня. Было бы время и мотивация. 
Алгоритм Wu считаю устаревшим.

Не удалось найти поиском iDot() или 3DStars, чтобы посмотреть код.

Я имел в виду учитывать всё, что находится под холстом, включая и сам график (цвет фона) и цвет его элементов (бары, линии ask/bid и т.д.).

В процессе перемещения этого холста с прозрачным фоном с нарисованными на нём полупрозрачными элементами все пиксели должны отрисовываться корректно. 

Сейчас это не так:


Причина обращения: