I compiti di grafica del computer sono di implementare algoritmi OpenGL utilizzando solo la possibilità di disegnare punti.Linee di disegno con Algoritmo della linea di Bresenham
Quindi ovviamente ho bisogno di far funzionare drawLine()
prima di poter disegnare qualsiasi altra cosa. drawLine()
deve essere eseguito utilizzando solo numeri interi. Nessun punto mobile.
Questo è quello che mi è stato insegnato. Fondamentalmente, le linee possono essere suddivise in 4 diverse categorie, ripide positive, superficiali positive, ripide negative e negative poco profonde. Questo è il quadro che dovrei disegnare:
e questo è il mio programma quadro è il disegno:
I colori sono fatto per noi. Ci vengono dati dei vertici e dobbiamo utilizzare l'algoritmo della linea di Bresenham per disegnare le linee in base ai punti di inizio e di fine.
Questo è quello che ho finora:
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;
}
}
}
}
So che il mio errore sta per essere qualcosa di sciocco, ma onestamente non riesco a capire cosa sto facendo male. Perché alcune linee sono disegnate in modo errato come mostrato sopra?
ciò che non funziona? –
Se si guardano le due immagini nel paragrafo sopra il mio codice, il "2 ° quadrante" e il "4 ° quadrante" non disegnano correttamente. Inserisco quelle tra virgolette perché il punto (0,0) si trova nell'angolo in basso a sinistra dell'immagine. Fondamentalmente, la prima istruzione else contiene il codice che non funziona correttamente, -shallow e -steep. – ToastyMallows
esegui il tuo codice su 2 semplici esempi, uno che funziona e quello che non funziona. Dire (0,0), (5, 5) e (0,5), (5,0), tracciare entrambi e vedere erano divergenti. Questo sarà un esercizio molto migliore di quello di avere qualcuno su SO farlo per te. –