Рисование линий с помощью алгоритма линий Брезенхэма

Моя домашняя работа по компьютерной графике состоит в том, чтобы реализовать алгоритмы OpenGL, используя только возможность рисовать точки.

Так что, очевидно, мне нужно заставить drawLine()работать, прежде чем я смогу рисовать что-то еще. drawLine()необходимо использовать только целые числа. Без плавающей запятой.

Вот чему меня учили. По сути, линии можно разделить на 4 категории: положительная крутая, положительная пологая, отрицательная крутая и отрицательная пологая. Это изображение, которое я должен нарисовать:

expected result

и это изображение, которое рисует моя программа:

actual result

Цвета для нас готовы. Нам даны вершины, и нам нужно использовать алгоритм линии Брезенхэма, чтобы нарисовать линии на основе начальной и конечной точек.

Вот что у меня есть на данный момент:

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;
                        }
                }
        }
}

Я знаю, что моя ошибка будет какой-то глупой, но я, честно говоря, не могу понять, что я делаю неправильно. Почему некоторые линии нарисованы неправильно, как показано выше?

8
задан In silico 8 April 2012 в 03:25
поделиться