Обсуждение статьи "Пользовательские индикаторы и инфографика в CCanvas"

 

Опубликована статья Пользовательские индикаторы и инфографика в CCanvas:

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

Мы уже рассмотрели классы и принципы построения сложных фигур с помощью примитивов. А в классе построения индикаторов гистограммного типа частично была затронута тема построения в двухмерном пространстве объектов, кажущихся объемными (рис.13) за счет цветовой подборки. Однако пирамида — не плоская фигура, поэтому при ее построении в заданной двухмерной системе координат мы используем ее изометрическую проекцию. Базовая структура не отличается большим числом элементов (рис.14), но тем не менее, способ построения проекции пирамиды и ее визуализация — основная часть реализации этого класса.

Рис.14. Базовая структура класса CPyramid.

Автор: Alexander Fedosov

 

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

Вот пример, который демонстрирует, что сглаживание существует в природе:


 
Nikolai Semko:

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

Вот пример, который демонстрирует, что сглаживание существует в природе:


А код?

 
Rashid Umarov:

А код?


А пожалуйста:

#property copyright   "2009-2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property description "Demonstrating Canvas features"
#property script_show_inputs 
//---
#include <Canvas\CanvasPro.mqh>
//+------------------------------------------------------------------+
//| inputs                                                           |
//+------------------------------------------------------------------+
input int pause = 20;   // задержка в миллисекундах между выводом на экран
input bool top = false; // рисовать под графиком?
input ENUM_COLOR_FORMAT format=COLOR_FORMAT_ARGB_NORMALIZE; //Способ обработки цвета
input int Ncirl =30;    // число окружностей
input int MaxSizeCircle = 200; // максимальный размер окружностей
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int OnStart(void)
  {

   double r1[],r2[],k1[],k2[];
   int x[],y[];
   uint col[];
   int j=0;
   ArrayResize(r1,Ncirl);
   ArrayResize(r2,Ncirl);
   ArrayResize(k1,Ncirl);
   ArrayResize(k2,Ncirl);
   ArrayResize(x,Ncirl);
   ArrayResize(y,Ncirl);
   ArrayResize(col,Ncirl);
   
   ChartSetInteger(0,CHART_FOREGROUND,top);
   int Width =(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // получаем Ширину окна
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту окна
   uint ColorScreen=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND,0);// получаем цвет фона окна

   CCanvasPro canvas;
   if(!canvas.CreateBitmapLabel("SampleCanvas",0,0,Width,Height,format))
     {
      Print("Error creating canvas: ",GetLastError());
      return(-1);
     }
   canvas.SetBack(false);
   canvas.Erase(ColorScreen);
   canvas.Update();
   srand(GetTickCount());
   for(int i=0;i<Ncirl;i++)
     {
      x[i]=rand()%Width;
      y[i]=rand()%Height;
      r1[i]=rand()%MaxSizeCircle;
      r2[i]=rand()%MaxSizeCircle;
      k1[i]=(double)(rand()%10)/1000;
      k2[i]=(double)(rand()%10)/1000;
      col[i]=XRGB(rand()%255,rand()%255,rand()%255);
     }
   while(!IsStopped())
     {
      canvas.Erase(ColorScreen);
      for(int i=0;i<Ncirl;i++) canvas.CircleSS(x[i],y[i],r1[i]*fabs(sin(j*k1[i])),r2[i]*fabs(sin(j*k2[i])),col[i]);
      Sleep(pause);
      canvas.Update();
      j++;
     }

   ObjectDelete(0,"SampleCanvas");
   canvas.Destroy();
   return(0);
  }
Файлы:
 
Rashid Umarov:

А код?


В стандартном сCanvas уже ведь есть несколько методов сглаживания для всех форм. 

 
Andrey Barinov:

В стандартном сCanvas уже ведь есть несколько методов сглаживания для всех форм. 

Увы. Даже последняя функция окружности на основе метода Ву,  содержит баги и даёт  заметную погрешность в сглаживании   в диагональных местах окружности из-за примитивности этого метода,  и очень не оптимальная в плане скорости. Тем более сглаженных  фигур с заливкой просто не существует. 
 
Nikolai Semko:
Увы. Даже последняя функция окружности на основе метода Ву,  содержит баги и даёт  заметную погрешность в сглаживании   в диагональных местах окружности из-за примитивности этого метода,  и очень не оптимальная в плане скорости. Тем более сглаженных  фигур с заливкой просто не существует. 
Ну тогда мне остается только присоединиться к вопросу. 

А код?
 
Rashid Umarov:

А код?

Andrey Barinov:
Ну тогда мне остается только присоединиться к вопросу. 

А код?

Странно, почему этот вопрос вы задаете мне. Я не работаю в компании Metaquotes, хотя и мечтаю там работать. Вот если бы я работал в этой компании, тогда бы я смог хорошо поработать над этим вопросом, а также не только над вопросом сглаживания в библиотеке CCanvas, но и , например, полноценными 3D функциями в канвасе. 
Но сейчас пока только эксперименты, собранные на скорую руку на коленках, которые и публиковать то стрёмно, т.к. знаю, что можно сделать лучше, но для этого нужно время.

Я, действительно не понимаю, почему все реализации с помощью канваса ( в этой статье, или ,например, здесь), реализованы без сглаживания.  Ведь, согласитесь, бросается в глаза эта корявость из-за пиксельной пилы и как бы на много круче это смотрелось с применением сглаживания. Ну зайдите на любой сайт, загляните в свой iPhone или Android, там сплошные круглые или закругленные  кнопочки. Вы там найдете круги без сглаживания? Но почему до сих пор нет полноценной реализации сглаживания в MQL5!?, в языке, который претендует занять место под солнцем. Разве я не прав? Поэтому я затеял эту тему и выложил этот пример,  чтоб показать что в этом нет ничего сверхестественного :
Файлы:
 
Nikolai Semko:

Странно, почему этот вопрос вы задаете мне. Я не работаю в компании Metaquotes, хотя и мечтаю там работать. Вот если бы я работал в этой компании, тогда бы я смог хорошо поработать над этим вопросом, а также не только над вопросом сглаживания в библиотеке CCanvas, но и , например, полноценными 3D функциями в канвасе. 
Но сейчас пока только эксперименты, собранные на скорую руку на коленках, которые и публиковать то стрёмно, т.к. знаю, что можно сделать лучше, но для этого нужно время.

Сделайте работу, напишите статью. И оплату получите и польза будет.
 

В 10-й раз тема отмечается непрочитанной, хотя ни правок сообщений, ни новых сообщений нет.

Кто-то шалит или форум ключит?

 
Andrey Khatimlianskii:

В 10-й раз тема отмечается непрочитанной, хотя ни правок сообщений, ни новых сообщений нет.

Кто-то шалит или форум ключит?


У меня подозрение, что авторы (автор?) правит свой пост.

Ещё вариант: кто-то начал писать пост и бросил, теперь этот пост висит в режиме редактирования, а форум каждую минуту (5, 10 минут?) отмечает, что в теме что-то происходит.