Обсуждение статьи "Торговые инструменты MQL5 (Часть 24): Улучшение восприятия глубины с помощью 3D-кривых, режима панорамирования и навигации через виджет ViewCube"
В настоящее время мы размещаем сегменты 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(); }
Спасибо, что заметили это. Надеюсь, это поможет. Спасибо.
В настоящее время мы размещаем сегменты 3D-кривой на один шаг позже, чем происходит рендеринг сцены, поэтому на первом статическом кадре их еще нет. Просто один раз выполните вращение (перетаскивание левой кнопкой мыши) или масштабирование (колесиком прокрутки) над холстом — это вызовет повторный рендеринг, и кривая появится.
Если вы хотите, чтобы кривая рендерилась мгновенно при переходе в 3D, просто переместите функцию рендеринга кривой перед вызовом рендеринга. См. ниже:
До:
После:
Спасибо, что заметили это. Надеюсь, это поможет. Спасибо.
Точнее услышали не правильно.
У Вас нет 3D кривых, а только 2D кривые. Важно использовать корректную терминологию, особенно в статьях.
вот пример 3D кривой. Когда кривая в 3х мерном пространстве, то проекция такой кривой на любую плоскость никогда не даст прямой линии, как в Вашем случае
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Торговые инструменты MQL5 (Часть 24): Улучшение восприятия глубины с помощью 3D-кривых, режима панорамирования и навигации через виджет ViewCube:
На рынке используем кривую с точной глубиной, вместе с гистограммой, чтобы оценить, совпадает ли пик функции массы вероятности с бином с максимальной частотой, что указывает на хорошо откалиброванную модель. Сместим вид так, чтобы хвосты распределения с низкой вероятностью оказались в центре экрана для более детального анализа перед определением размера позиций вблизи экстремальных исходов. Используем вид сверху куба обзора для одновременного сравнения высоты столбцов во всех бинах, а вид спереди — чтобы удобно читать значения отдельных столбцов.
Мы расширим инструмент, создав сегменты кривой на основе прямоугольников, масштабированные и повернутые для образования непрерывной трубки, реализуем логику панорамирования с использованием векторных вычислений относительно камеры и отрисуем куб обзора с проецированными вершинами, сортировкой граней для корректного порядка отрисовки и билинейной интерполяцией для подразделенных зон при наведении курсора. Мы также интегрируем анимацию, управляемую таймером, для переходов между режимами просмотра, наложение смешанных пикселей для иконок и куба, а также обработку событий для кликов и наведения курсора, чтобы сделать интерфейс полностью отзывчивым. Наши цели обозначены ниже.
Автор: Allan Munene Mutiiria