0

ユーザーが適切なオプションを選択して画面上でマウスの左ボタンをドラッグすることで、画面上に線や円を描くことができる glut を使用して、OpenGL でプログラムを作成しています。また、マウスの右ボタンをクリックしたときに、ユーザーが多角形 (複数の線の組み合わせで描画できる) に色を塗りつぶせるようにしたいと考えています。

glReadPixels() を使用してすべてのピクセルの色を再帰的に決定するフラッド フィル アルゴリズムを実装しようとしましたが、遅すぎてサイズの大きいピクセルのスタック オーバーフローが発生します。

(最初は、マウスの右ボタンをクリックして RGB 値を 3 つの float 要素の 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 つの浮動小数点数を比較することは、私が感じる最も効率的な方法ではないかもしれませんが、ピクセル値を比較できる他の方法が何であるかはわかりません。

しかし、最も重要なことは、これに最適なアルゴリズムは何ですか?

4

0 に答える 0