我正在使用 glut 在 OpenGL 中创建一个程序,用户可以通过选择适当的选项并在屏幕上拖动鼠标左键在屏幕上绘制线条或圆圈。另外,我希望用户在单击鼠标右键时能够在多边形中填充颜色(可以通过几条线的组合绘制)。
我尝试通过使用 glReadPixels() 来实现洪水填充算法,以便递归地确定每个像素的颜色,但它太慢并且导致较大尺寸像素的堆栈溢出。
(最初我在单击鼠标右键以将 RGB 值存储在 3 个浮点元素的 backColor 数组中的位置执行此指令)
glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,backColor);
我实现的洪水填充代码是 -
void floodfill(int x, int y)
{
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glReadPixels(x-1,y,1,1,GL_RGB,GL_FLOAT,curColor);
if (checkColor(backColor,curColor))
{
floodfill(x-1,y);
}
glReadPixels(x,y-1,1,1,GL_RGB,GL_FLOAT,curColor);
if (checkColor(backColor,curColor))
{
floodfill(x,y-1);
}
glReadPixels(x+1,y,1,1,GL_RGB,GL_FLOAT,curColor);
if (checkColor(backColor,curColor))
{
floodfill(x+1,y);
}
glReadPixels(x,y+1,1,1,GL_RGB,GL_FLOAT,curColor);
if (checkColor(backColor,curColor))
{
floodfill(x,y+1);
}
}
int checkColor(float a[], float b[])
{
if ((a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]))
return 1;
return 0;
}
那么,在鼠标右键单击时为多边形(可能是凹多边形)着色的最佳方法是什么?另外,使程序更高效的各种方法是什么?例如。将像素值存储为 GL_FLOAT 并为每个像素比较 3 个浮点数可能不是我觉得最有效的方式,但我不知道我们可以比较像素值的其他可能方式是什么。
但最重要的是,最好的算法是什么?