Mi tarea de gráficos por computadora es implementar algoritmos OpenGL utilizando solo la capacidad de dibujar puntos.Dibujando líneas con el algoritmo de línea de Bresenham
Así que obviamente necesito hacer que drawLine()
funcione antes de que pueda dibujar algo más. drawLine()
tiene que hacerse usando enteros solamente. Sin punto flotante
Esto es lo que me enseñaron. Básicamente, las líneas se pueden dividir en 4 categorías diferentes, empinadas positivas, positivas superficiales, negativas empinadas y negativas superficiales. Esta es la imagen que debo dibujar:
y esta es la imagen de mi programa está llegando:
Los colores se hacen por nosotros. Nos dan vértices y necesitamos usar el algoritmo Bresenham's Line para dibujar las líneas basadas en los puntos de inicio y final.
Esto es lo que tengo hasta ahora:
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;
}
}
}
}
Sé que mi error va a ser algo tonto, pero sinceramente no puedo averiguar lo que estoy haciendo mal. ¿Por qué algunas de las líneas se dibujan incorrectamente como se muestra arriba?
lo que no funciona? –
Si miras las dos imágenes en el párrafo arriba de mi código, el "2 ° cuadrante" y el "4 ° cuadrante" no están dibujando bien. Los pongo entre comillas porque el punto (0,0) está en la esquina inferior izquierda de la imagen. Básicamente, la primera declaración else contiene el código que no está funcionando correctamente, -shallow y -steep. – ToastyMallows
ejecuta tu código en 2 ejemplos simples, uno que funciona y el que no funciona. Di (0,0), (5, 5) y (0,5), (5,0), traza a través de ambos y observa si divergieron. Este será un ejercicio mucho mejor que tener a alguien en SO que lo haga por usted. –