Meine Hausaufgabe für Computergrafiken besteht darin, OpenGL-Algorithmen zu implementieren, die nur die Fähigkeit zum Zeichnen von Punkten verwenden.Zeichnen von Linien mit dem Linienalgorithmus von Bresenham
Also offensichtlich muss ich drawLine()
arbeiten, bevor ich noch etwas zeichnen kann. drawLine()
muss nur mit ganzen Zahlen gemacht werden. Kein Gleitkomma.
Das wurde mir beigebracht. Grundsätzlich können Linien in 4 verschiedene Kategorien unterteilt werden: positiv steil, positiv flach, negativ steil und negativ flach. Das ist das Bild soll ich machen:
und das ist das Bild, mein Programm zeichnet:
Die Farben sind für uns getan hat. Wir haben Vertices und müssen den Bresenham-Linienalgorithmus verwenden, um die Linien basierend auf den Start- und Endpunkten zu zeichnen. Diese
ist das, was ich bisher:
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;
}
}
}
}
Ich kenne meine Fehler etwas albern, sein wird, aber ich kann ehrlich nicht, was ich falsch mache. Warum werden einige der Linien falsch gezeichnet, wie oben gezeigt?
, was nicht funktioniert? –
Wenn Sie sich die zwei Bilder im Absatz über meinem Code ansehen, zeichnen sich der "2. Quadrant" und der "4. Quadrant" nicht richtig aus. Ich gebe diese in Anführungszeichen, weil Punkt (0,0) in der unteren linken Ecke des Bildes ist. Im Grunde enthält die erste else-Anweisung den Code, der nicht richtig funktioniert, -shallow und -steep. – ToastyMallows
führen Sie Ihren Code auf 2 einfache Beispiele, eines, das funktioniert, und eines, das nicht funktioniert. Sage (0,0), (5, 5) und (0,5), (5,0), gehe durch beide und sieh, wo sie auseinandergehen. Dies wird eine viel bessere Übung sein, als wenn jemand auf SO es für Sie tut. –