Моя домашняя работа по компьютерной графике состоит в том, чтобы реализовать алгоритмы 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;
}
}
}
}
Я знаю, что моя ошибка будет какой-то глупой, но я, честно говоря, не могу понять, что я делаю неправильно. Почему некоторые линии нарисованы неправильно, как показано выше?