2015-11-14 9 views
3

Что является самым легким, будучи прилично быстрым, способом рисования сетки (скажем, 100 х 100) скалярных значений в виде цветов и векторов в виде строк из массивов значений в C++? Чистый OpenGL? Что-то вроде этого:Самый простой способ рисовать скалярное и векторное поле с помощью C++?

Я планирую использовать либо базовую OpenGL или SDL. Эта программа Windows будет демонстрацией в реальном времени (а не статическим изображением) и должна иметь возможность обрабатывать вход пользователя (курсора). Я не думаю, что только OpenGL может обрабатывать ввод.

+1

Не используйте C++ ... Есть ли причина, по которой вам нужно? Если он будет быстрым и грязным, используйте 'python' с matplotlib, или matlab, или scilab? –

+0

@Ben Я делаю некоторое вычислительное интенсивное моделирование жидкости ... хотя, возможно, будет работать numpy, я действительно не думаю, что python достаточно быстр – qwr

+0

OpenGL довольно неэффективен при рисовании линий. Просто используйте GDI +. –

ответ

1

В OpenGL вы можете создать массив из поплавков которым может быть представляет в виде растрового изображения

float computations[10000][3] = { 
    { 1, 0.5, 0.5 }, // ..... 100 elements in row 
    //.............................. 
    // 100 rows 
}; 

чем функции вызова OpenGL

glDrawPixels(100 /*width*/, 100 /*height*/, GL_RGB, GL_FLOAT, computations); 

или с помощью glTexImage()

glTexImage(GL_TEXTURE_2D, 0, GL_RGB, 100 /*width*/, 100 /*height*/, GL_RGB, GL_FLOAT, computations); 

Но это очень важно представлять данные по плаванию в диапазоне от [0; 1].

, например, этот код рисует 8x8 изображение

float pixels[64][3]= { 
    { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, 
    { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, 
    { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, 
    { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, 
    { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, 
    { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, 
    { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, 
    { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f }, { 0.0f, .0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f } }; 

void RenderScene(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glRasterPos2i(0, 0); 
    glDrawPixels(8, 8, GL_RGB, GL_FLOAT, pixels); 

    glFlush(); 
} 

результат будет

enter image description here

В результате картина может быть просто масштабируется с помощью glPixelZoom или magnificated в результате фильтрации текстур.

вот пример загрузки текстуры.

glGenTextures(1, &g_nTexture); 

glBindTexture(GL_TEXTURE_2D, g_nTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0, GL_RGB, GL_FLOAT, pixels); 

glEnable(GL_TEXTURE_2D); 

результат фильтрации.

enter image description here

здесь вы можете увидеть плавный переход цвета.

Есть другие способы сделать это с помощью шейдеров.

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

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

+0

@qwr: Я обновил свой ответ. – Mykola

+0

Было бы так же, как рисовать прямоугольники? – qwr

+0

@qwr: Да. Вы можете нарисовать прямоугольники, и они будут выглядеть так же, как рисование. – Mykola

 Смежные вопросы

  • Нет связанных вопросов^_^