私のコンピューター グラフィックスの宿題は、点を描画する機能のみを使用して 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;
}
}
}
}
私のエラーがばかげたものになることはわかっていますが、正直なところ、何が間違っているのかわかりません。上記のように一部の線が正しく描かれていないのはなぜですか?