我有一个从外部csv.The数据中读取和绘图点的函数,类似于Lidar输出。我需要看看是否有办法给一组点不同的颜色。就像xz平面上的所有圆一样,半径在0-50之间的平面有蓝色,50-10有红色,等等。
这是我画点的代码
glBegin(GL_POINTS);
glColor3f(0.961, 0.961, 0.961);
for (int i = 0; i <vx.size(); i++)
{
if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<96.00)
{
glVertex3f(vx[i], vy[i], vz[i]);
}
}
glEnd(); 其中vx、vy和vz分别存储x、y、z值的std::vector<float>数据类型。我已经试过给出如下条件
if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<5.00)
{
glColor3f(1.000, 0.549, 0.000);
glVertex3f(vx[i], vy[i], vz[i]);
}
else if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))>= 5.00 && sqrt((vx[i] * vx[i]) + (vz[i] * vz[i])) <= 10.00)
{
glColor3f(1.000, 0.843, 0.000);
glVertex3f(vx[i], vy[i], vz[i]);
}
else if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))>= 11.00 && sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<= 20.00)
{
glColor3f(1.000, 1.000, 0.000);
glVertex3f(vx[i], vy[i], vz[i]);
}
else if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))>= 21.00 && sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<=30.00)
{
glColor3f(0.678, 1.000, 0.184);
glVertex3f(vx[i], vy[i], vz[i]);
}
-----------------//till radius <96
glend();这为我生成了想要的输出,但是渲染有点慢。我已经包括变焦和pan功能等,这是滞后的多条件检查。有没有更有效的方法来做到这一点?
发布于 2019-12-30 12:50:31
但是请注意,一个现代的解决方案是将所有的点放在一个顶点缓冲对象中,并使用一个着色器程序来计算片段的颜色。另见LearnOpenGL -阴影。
无论如何,主要的性能影响是由欧氏距离的多重计算造成的。sqrt是一个非常耗时的函数。
因为您只是想比较距离,所以根本不需要计算距离。与其比较距离,不如比较距离的平方。例如:
而不是
if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<96.00)做
if ( vx[i]*vx[i] + vz[i]*vz[i] < 96.00*96.00 )此外,我建议简化代码,并只计算一次距离的平方:
```cppglBegin(GL_POINTS);
对于(int = 0;i
{
float dist_sq = vx[i]*vx[i] + vz[i]*vz[i];
if (dist_sq < 5.00 * 5.00)
glColor3f(1.000, 0.549, 0.000);
else if (dist_sq < 10.00 * 10.00)
glColor3f(1.000, 0.843, 0.000);
else if (dist_sq < 20.00 * 20.00)
glColor3f(1.000, 1.000, 0.000);
// [...]
glVertex3f(vx[i], vy[i], vz[i]);
}
glEnd();
https://stackoverflow.com/questions/59531028
复制相似问题