none
Как нарисовать линию? RRS feed

  • Вопрос

  • Вот пример один в один с книжки. Но масштаб отображается не верно. Линии, которые рисуются в цикле должны быть длиной 2 пикселя, а они рисуются точками. Те линии, что закомментированы отображаются не через одну, как должно быть, а то слитно, то через одну. В общем или я дурак или OpenGL на C# не работает. Это уже вторая опробованная мной библиотека, первая была TaoOpenGL с той же ошибкой. Можете посоветовать что-нибудь для аппаратно ускоренного отображения 2D примитивов? Или может здесь ошибку найдете?
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using OpenTK;
    using OpenTK.Graphics.OpenGL;
    
    namespace AnalyZer
    {
      public partial class Form1 : Form
      {
        bool loaded = false;
    
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          loaded = true;
          SetupViewport();
        }
    
        private void SetupViewport()
        {
          int w = glControl.Width;
          int h = glControl.Height;
          GL.MatrixMode(MatrixMode.Projection);
          GL.LoadIdentity();
          GL.Ortho(0, w, 0, h, -1, 1); // Верхний левый угол имеет кооординаты(0, 0)
          GL.Viewport(0, 0, w, h); // Использовать всю поверхность GLControl под рисование
        }
    
        private void glControl_Resize(object sender, EventArgs e)
        {
          if (!loaded)
            return;
        }
    
        private void glControl_Paint(object sender, PaintEventArgs e)
        {
          if (!loaded) //Пока контекст не создан
            return;
    
          GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
    
          GL.MatrixMode(MatrixMode.Modelview);
          GL.LoadIdentity();
          GL.Color3(Color.White);
          GL.Begin(BeginMode.Lines);
          GL.Vertex2(1, 1);
          GL.Vertex2(299, 299);
          for(int i = 1; i < 400; i+=2)
          {
            GL.Vertex2(i, 1);
            GL.Vertex2(i, 2);
    
            GL.Vertex2(1, i);// отображаются не верно
            GL.Vertex2(2, i);
          }
          GL.End();
    
          glControl.SwapBuffers();
        }
      }
    }

Ответы

  • 1. SmartTrade. Другая платформа создана другими криворукими программистами со своими другими проблемами.

    2. Не совсем понял вопрос. Скорость рисования задается таймером. Минимальное значение 1 мс. Количество отрисованных линий на скорость не влияет. Также скорость зависит от скорости обработки списков, ее не измерял, но она вряд ли превышает 1 мс.

    Проблему я решил. Все дело в том, что, например, линия от точки (1;1) до точки (10;1) понимается OpenGL'ом как линия с левого края пикселя (1;1) до левого края пикселя (10;1). А т.к. левый край пикселя (10;1) означает полностью закрашенный пиксель (9;1), то и получается что мы видим только 9 пикселей линии в данном примере.

    Тему можно закрывать.

    • Помечено в качестве ответа 4dimuser 31 мая 2011 г. 17:08

Все ответы

  • Вы вдумайтесь! Для чего существует аппаратное ускорение? Неужели для рисовки линий между точками,
    которые следуют с интервалом 1 секунда.
    Зачем весь этот огород?
  • Уважаемый, у меня торговый терминал тормозит на четырехядернике i5-750, если там больше двух тиковых графиков поставить. И кто Вам сказал, что одна секунда? В пик движухи там и 1500 тиков за 20 секунд проходит. Этот огород нужен, поверьте, я сам с дивана не встану, если на это не будет веских причин.

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


  • Специально для Вас.
    У меня 2 ядерная старушка, по 1.83 Ггц каждое ядро, WinXP, 
    System.Windows.Forms.DataVisualization.Charting рисует мне линейный график в скользящем окне
    со скоростью ~ 200 точек в секунду в одном потоке.
    Может быть сможет и больше, но надо покувыркаться.
    Кстати о Вашей 4-х ядерной машине. Вам еще придется серьезно потрудиться, чтобы ее достойно загрузить.




  • Что тут стараться? Два графика и у меня загрузка одного ядра упирается в 100%.

    И все таки касательно темы: по ссылке объяснение проблемы. Но указанное решение glTranslatef (0.375, 0.375, 0), все равно не убирает искажения. Может здесь есть кто с опытом в OpenGL, растолкуйте?

    http://basic4gl.wikispaces.com/2D+Drawing+in+OpenGL

  • Не обижайтесь, еще пара вопросов, 
    хочу сориентироваться, каков современный уровень инструментария.
    1. Каким торговым терминалом пользуетесь?
    Настораживает, что 2 тиковых графика могут серьезно влиять на работоспособность 
    современного компьютера. Может быть стоит переехать на другую платформу?
    2. Какой скорости рисовки на OpenGL Вы достигли, пусть даже и с искажениями?
  • 1. SmartTrade. Другая платформа создана другими криворукими программистами со своими другими проблемами.

    2. Не совсем понял вопрос. Скорость рисования задается таймером. Минимальное значение 1 мс. Количество отрисованных линий на скорость не влияет. Также скорость зависит от скорости обработки списков, ее не измерял, но она вряд ли превышает 1 мс.

    Проблему я решил. Все дело в том, что, например, линия от точки (1;1) до точки (10;1) понимается OpenGL'ом как линия с левого края пикселя (1;1) до левого края пикселя (10;1). А т.к. левый край пикселя (10;1) означает полностью закрашенный пиксель (9;1), то и получается что мы видим только 9 пикселей линии в данном примере.

    Тему можно закрывать.

    • Помечено в качестве ответа 4dimuser 31 мая 2011 г. 17:08
  • 1. "... криворукими программистами ..." - круто и, главное, очень и очень скромно...

    2. Механизм рисовки графиков в OpenGL, судя по Вашему сообщению, аналогичен механизму рисовки графиков в 
    System.Windows.Forms.DataVisualization.Charting или наоборот,
    если учесть, что OpenGL появился раньше.

    Если бы количество отрисованных линий и скорость обработки списков не влияли бы на скорость рисовки,
    то эта скорость составляла бы как минимум 1000 точек (линий) в секунду.
    На самом деле эта скорость колеблется в зависимости от количества точек в скользящем окне
    от 170 точек в секунду, при окне в 300 точек, 
    до 250 точек в секунду, при окне в 1 точку.
    Для окна в 100 точек скорость рисовки составляет 200 точек (линий) в секунду.

    Вывод. По скорости рисовки графиков у OpenGL преимуществ нет.
    System.Windows.Forms.DataVisualization.Charting - это часть дотнета со всеми вытекающими положительными качествами -
    целостность, обновляемость, документированность и пр.
    Чем пользоваться? - у каждого свои предпочтения. 




  • 1. А как бы вы назвали профессионального (не такого как я) программиста или даже коллектив программистов, у которых больше двух графиков запущенных одновременно уже тормозят?

    Так у меня и есть 1000 кадров в секунду, таймер ведь на 1 мс выставлен. А скорость обработки например в цикле 10 000 элементов явно не превышает 1 мс. Т.е за эту 1 мс метод, рисующий всю картинку успевает завершиться, иначе бы то, что он не успел нарисовать кешировалось и становилось в очередь, что неминуемо привело бы к 100% загрузке ядра через некоторое время.

  • 1."1500 тиков за 20 секунд"  - На какой акции?
    2. "
    1000 кадров в секунду" - это предположение, а нужно измерение. 
    Попробуйте при заданном размере окна
    StopWatch-ем измерить время,
    и счетчиком посчитать количество новых точек.

    1 июня 2011 г. 20:20
  • 1. Судя по вопросу Вы никогда с этим не сталкивались. Велкам! Это деривативы.

    Что тут измерять? У меня монитор больше 60 Гц не показывает.


    2 июня 2011 г. 11:09
  • 1. Не сталкивался и не собираюсь.
    Насколько мне известно, солидные фирмы не позволяют новичкам работать с этими инструментами
    в интересах самих же новичков. По крайней мере, так было в более разумные времена.
    2. В таком случае, что же такое "1000 кадров в секунду"? Из-за чего сыр-бор?
    Да, мы совсем забыли про 60 Гц, хотя для современных экранов этот показатель - величина условная.
    Т.е, если программное обеспечение обновляет 600 картинок в секунду,
    то каждый обновленный экран показывает только лишь каждую 10-ую.
    Подробнее не получится, да и не нужно - глазами этого не заметишь, и тем более не среагируешь.
    А еще есть задержки в интернете - в лучшем случае 1-2 секунды, и задержки исполнения ордеров...
    В общем, быстрая графика ничего не решает.

    Ну, а к измерениям, как я понял, Вы не готовы?


     
    2 июня 2011 г. 17:02
  • Не сталкивались, а уже имеете мнение. Если говорить на языке программистов, то вижуал студия подчеркнула бы это красным.

    1-2 секунды? Вы плохо представляете то, о чем вы говорите.

    Измерения на данном этапе, думаю, излишни.

    2 июня 2011 г. 18:34
  • Не сталкивался только потому, что имею свое мнение на этот счет.
    Плохо представляет тот, для кого измерения излишни...
    А я привык измерять, поэтому представляю...
    2 июня 2011 г. 18:55
  • В этом деле иметь свое мнение нельзя, это очень дорого обходится, выигрывает только тот, кто может быстро отказаться от своего мнения в зависимости от ситуации.

    Измерения уже проведены, для обычной ситуации цифры на порядок меньше, чем Вы назвали. 1-2 секунды возможны только в моменты пиковой нагрузки на сервера.

    Если Вы так любите все считать, очень интересно было бы услышать от Вас математическое обоснование того что торговля одной акцией, например, опаснее торговли одним фьючерсом на эту акцию. Ставлю $10 что я его не услышу:)

  • Сорри, был занят.

    "В этом деле иметь свое мнение нельзя, это очень дорого обходится,
    выигрывает только тот, кто может быстро отказаться от своего мнения в зависимости от ситуации"
    - Пустой разговор. No comment.

    "... 
    цифры на порядок меньше... " - какие цифры? 
    "
    Измерения уже проведены...1-2 секунды..." - если Вы собираетесь заниматься тиковым трейдингом,
    что само по себе совершенно бессмысленно, то Вам необходимо постоянно анализировать состояние канала.
    Я в свое время совсем по другому поводу в течении месяца измерял задержки и строил гистограммы.
    Получались интересные вещи, иногда необъяснимые и парадоксальные.
    Имеет значение многое, включая качество программного обеспечения клиента.
    Поанализируйте, это несложно. Есть время приемника и время источника - время сообщений, котировок, сделок.
    Рассинхронизация сервера и клиента - величина постоянная, 1-2 сек., а остальная разница - задержки.

    "...математическое обоснование..." - трейдер должен понимать, что в случае экспирации он должен будет 
    продать или купить подлежащий актив в оговоренном объеме и по оговоренной цене.
    А это может быть полным разорением. Опционы - это шахматы трейдинга, а в шахматы нужно уметь играть.

    Но это уже совсем другая тема. 








    3 июня 2011 г. 23:06
  • Действительно, "No comment".

    "в случае экспирации..." смеялсо:) Ликбез: Изменение цены на 1% и в том и в другом случае приводит к одному и тому же результату. А комиссии на срочке ниже, чем на споте. Вот и вся математика.

    Вам лучше программированием заниматься, там Вы хорошо разбираетесь.

    Предлагаю тему закрыть.

  • Спасибо за науку - напомнили мне прописную истину - Не научить музыке глухого.
    Жаль потраченного на Вас времени... 
    4 июня 2011 г. 17:42