Обсуждение статьи "Торговые инструменты MQL5 (Часть 24): Улучшение восприятия глубины с помощью 3D-кривых, режима панорамирования и навигации через виджет ViewCube"

 

Опубликована статья Торговые инструменты MQL5 (Часть 24): Улучшение восприятия глубины с помощью 3D-кривых, режима панорамирования и навигации через виджет ViewCube:

В этой статье мы улучшим инструмент построения 3D-графиков биномиального распределения в MQL5, добавим сегментированную 3D-кривую для улучшения восприятия глубины функции массы вероятности. Также интегрируем режим панорамирования для смещения целевой точки камеры и реализуем интерактивный куб обзора с зонами наведения курсора и анимацией для обеспечения быстрой смены ориентации. Мы добавим кликабельные подзоны на кубе обзора для граней, ребер и углов, чтобы анимировать переходы камеры к стандартным видам, сохраняя при этом переключаемые 2D/3D режимы, обновления в реальном времени и настраиваемые параметры для иммерсивного вероятностного анализа в торговле.

На рынке используем кривую с точной глубиной, вместе с гистограммой, чтобы оценить, совпадает ли пик функции массы вероятности с бином с максимальной частотой, что указывает на хорошо откалиброванную модель. Сместим вид так, чтобы хвосты распределения с низкой вероятностью оказались в центре экрана для более детального анализа перед определением размера позиций вблизи экстремальных исходов. Используем вид сверху куба обзора для одновременного сравнения высоты столбцов во всех бинах, а вид спереди — чтобы удобно читать значения отдельных столбцов.

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

3D CURVE, PAN MODE AND VIEWCUBE FRAMEWORK


Автор: Allan Munene Mutiiria

 
Не вижу 3D кривых
Вижу 2D кривые в 3х мерном представлении
 
Nikolai Semko #:
Я не вижу 3D-кривые
Я вижу 2D-кривые в 3D-виде
Спасибо за отзыв.

В настоящее время мы размещаем сегменты 3D-кривой на один шаг позже, чем происходит рендеринг сцены, поэтому на первом статическом кадре их еще нет. Просто один раз выполните вращение (перетаскивание левой кнопкой мыши) или масштабирование (колесиком прокрутки) над холстом — это вызовет повторный рендеринг, и кривая появится.

Если вы хотите, чтобы кривая рендерилась мгновенно при переходе в 3D, просто переместите функцию рендеринга кривой перед вызовом рендеринга. См. ниже:

До:

   //+------------------------------------------------------------------+
   //| Отобразить 3D-сцену и наложить на неё 2D-элементы интерфейса            |
   //+------------------------------------------------------------------+
   void render3DVisualization()
     {
      //--- Прервать, если данные не загружены
      if(!m_isDataLoaded) return;

      //--- Пересчитать преобразования вида и освещения для этого кадра
      updateCameraPosition();
      //--- Переместить все столбцы 3D-гистограммы в соответствии с текущими данными
      update3DHistogramBars();

      //--- Использовать настроенный цвет фона для прозрачного прохода
      color bgColor     = backgroundTopColor;
      uint  bgColorArgb = ColorToARGB(bgColor, 255);
      //--- Очистить буферы цвета и глубины, затем вывести 3D-сцену
      m_mainCanvas.Render(DX_CLEAR_COLOR | DX_CLEAR_DEPTH, bgColorArgb);

      //--- Наложить 2D-рамку на 3D-рендеринг
      if(showBorderFrame)
         draw3DBorder();
      //--- Наложить панель заголовка на отображаемое 3D-изображение
      drawHeaderBarOn3D();
      //--- Отобразить панель статистики и легенду, если они включены
      if(showStatistics)
        {
         drawStatisticsPanelOn3D();
         drawLegendOn3D();
        }
      //--- Переместить все сегменты кривой PMF для данного кадра
      update3DCurveSegments(); // THIS IS AFTER THE SCENE RENDERS, SO THE 3D SEGMENTS DELAY RENDERING UNTIL INTERACTION. SEE THE CANVAS RENDER ABOVE IN YELLOW
      //--- Нарисовать значок переключения режима панорамирования
      drawPanIconOverlay();
      //--- Нарисовать интерактивный виджет в виде куба
      drawViewCubeOverlay();
      //--- Отображать индикатор точки изменения размера при наведении курсора
      if(m_isHoveringResizeZone && enableResizing)
         drawResizeIndicatorOn3D();
      //--- Сбросить буфер пикселей в объект диаграммы
      m_mainCanvas.Update();
     }

После:

   //+------------------------------------------------------------------+
   //| Отобразить 3D-сцену и наложить на неё 2D-элементы интерфейса            |
   //+------------------------------------------------------------------+
   void render3DVisualization()
     {
      //--- Прервать, если данные не загружены
      if(!m_isDataLoaded) return;

      //--- Пересчитать преобразования вида и освещения для этого кадра
      updateCameraPosition();
      //--- Переместить все столбцы 3D-гистограммы в соответствии с текущими данными
      update3DHistogramBars();
      //--- Переместить все сегменты кривой PMF ПЕРЕД рендерингом
      update3DCurveSegments(); // JUST MOVE THE FUNCTION BEFORE THE 3D RENDER FOR INSTANT RENDERING, TO BE COUPLED WITH THE 3D BARS

      //--- Использовать настроенный цвет фона для прозрачного прохода
      color bgColor     = backgroundTopColor;
      uint  bgColorArgb = ColorToARGB(bgColor, 255);
      //--- Очистить буферы цвета и глубины, затем вывести 3D-сцену
      m_mainCanvas.Render(DX_CLEAR_COLOR | DX_CLEAR_DEPTH, bgColorArgb);

      //--- Наложить 2D-рамку на 3D-рендеринг
      if(showBorderFrame)
         draw3DBorder();
      //--- Наложить панель заголовка на отображаемое 3D-изображение
      drawHeaderBarOn3D();
      //--- Отобразить панель статистики и легенду, если они включены
      if(showStatistics)
        {
         drawStatisticsPanelOn3D();
         drawLegendOn3D();
        }
      //--- Нарисовать значок переключения режима панорамирования
      drawPanIconOverlay();
      //--- Нарисовать интерактивный виджет в виде куба
      drawViewCubeOverlay();
      //--- Отображать индикатор точки изменения размера при наведении курсора
      if(m_isHoveringResizeZone && enableResizing)
         drawResizeIndicatorOn3D();
      //--- Сбросить буфер пикселей в объект диаграммы
      m_mainCanvas.Update();
     }

Спасибо, что заметили это. Надеюсь, это поможет. Спасибо.

 
Nikolai Semko #:
Не вижу 3D кривых
Вижу 2D кривые в 3х мерном представлении
Согласен.
 
Allan Munene Mutiiria #:
Спасибо за отзыв.

В настоящее время мы размещаем сегменты 3D-кривой на один шаг позже, чем происходит рендеринг сцены, поэтому на первом статическом кадре их еще нет. Просто один раз выполните вращение (перетаскивание левой кнопкой мыши) или масштабирование (колесиком прокрутки) над холстом — это вызовет повторный рендеринг, и кривая появится.

Если вы хотите, чтобы кривая рендерилась мгновенно при переходе в 3D, просто переместите функцию рендеринга кривой перед вызовом рендеринга. См. ниже:

До:

После:

Спасибо, что заметили это. Надеюсь, это поможет. Спасибо.

не услышали меня.
Точнее услышали не правильно.
У Вас нет 3D кривых, а только 2D кривые. Важно использовать корректную терминологию, особенно в статьях. 

вот пример 3D кривой. Когда кривая в 3х мерном пространстве, то проекция такой кривой на любую плоскость никогда не даст прямой линии, как в Вашем случае