用C ++绘制标量和矢量场的最简单方法是什么?

时间:2015-11-14 00:02:59

标签: c++ opengl vector-graphics scalar

最简单的方法是将数据(例如,100 x 100)的标量值绘制为C ++中的数值行中的颜色和向量,这是最简单的方法吗?纯OpenGL?像这样:

enter image description here

我打算使用基本的OpenGL或SDL。这个Windows程序将是一个实时演示(非静态图像),应该能够处理用户(光标)输入。我不认为单独的OpenGL可以处理输入。

2 个答案:

答案 0 :(得分: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进行简单缩放,也可以放大为纹理过滤结果。

这里是纹理加载的例子。

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

在这里你可以看到平滑的颜色过渡。

还有其他方法可以使用着色器执行此操作。

矢量可以单独绘制为单线,其末端为锥形,而不是通过仿射变换定位。

这一切都将为实时应用程序和人机交互的广泛功能提供可接受的性能水平,因为操作系统将处理所有OS事件支持的本机OpenGL窗口。

答案 1 :(得分:1)

SDL_FillRectSDL_RenderDrawLine足以达到此目的。