9

私のコンピューター グラフィックスの宿題は、点を描画する機能のみを使用して OpenGL アルゴリズムを実装することです。

drawLine()だから明らかに、他のものを描く前に仕事に 取り掛かる必要があります. drawLine()整数のみを使用して行う必要があります。浮動小数点なし。

これが私が教えられたことです。基本的に、ラインは、正の急勾配、正の急勾配、負の急勾配、負の急勾配の 4 つのカテゴリに分けることができます。これは私が描くことになっている絵です:

期待される結果

これは私のプログラムが描いている絵です:

実結果

色は私たちのために行われます。頂点が与えられ、ブレゼンハムの線アルゴリズムを使用して、始点と終点に基づいて線を描画する必要があります。

これは私がこれまでに持っているものです:

int dx = end.x - start.x;
int dy = end.y - start.y;

//initialize varibales
int d;
int dL;
int dU;

if (dy > 0){
        if (dy > dx){
                //+steep
                d = dy - 2*dx;
                dL = -2*dx;
                dU = 2*dy - 2*dx;

                for (int x = start.x, y = start.y; y <= end.y; y++){
                        Vertex v(x,y);
                        drawPoint(v);

                        if (d >= 1){
                                d += dL;
                        }else{
                                x++;
                                d += dU;
                        }
                }              
        } else {
                //+shallow
                d = 2*dy - dx;
                dL = 2*dy;
                dU = 2*dy - 2*dx;

                for (int x = start.x, y = start.y; x <= end.x; x++) {
                        Vertex v(x,y);
                        drawPoint(v);

                        // if choosing L, next y will stay the same, we only need
                        // to update d by dL
                        if (d <= 0) {
                                d += dL;
                        // otherwise choose U, y moves up 1
                        } else {
                                y++;
                                d += dU;
                        }
                }
        }
} else {
        if (-dy > dx){
                cout << "-steep\n";
                //-steep
                d = dy - 2*dx;
                //south
                dL = 2*dx;
                //southeast
                dU = 2*dy - 2*dx;

                for (int x = start.x, y = start.y; y >= end.y; --y){
                        Vertex v(x,y);
                        drawPoint(v);

                        //if choosing L, next x will stay the same, we only need
                        //to update d
                        if (d >= 1){
                                d -= dL;
                        } else {
                                x++;
                                d -= dU;
                        }
                }

        } else {
                cout << "-shallow\n";
                //-shallow
                d = 2*dy - dx;
                dL = 2*dy;
                dU = 2*dy - 2*dx;

                for (int x = start.x, y = start.y; x <= end.x; x++){
                        Vertex v(x,y);
                        drawPoint(v);

                        if (d >= 0){
                                d += dL;
                        } else {
                                --y;
                                d -= dU;
                        }
                }
        }
}

私のエラーがばかげたものになることはわかっていますが、正直なところ、何が間違っているのかわかりません。上記のように一部の線が正しく描かれていないのはなぜですか?

4

3 に答える 3

2

何が問題なのか疑問に思っている人がいれば、私はまだそれが何であったかわかりません。私がやったのは、コードをリファクタリングして、-shallow と -steep がそれぞれ +shallow と +steep と同じアルゴリズムを使用するようにすることでした。x、y座標を調整した後(xまたはy座標を否定)、それらをプロットするときに元の否定を否定して、正しい場所にプロットしました。

于 2012-04-12T05:16:11.183 に答える