私のコンピュータグラフィックスの宿題は、ポイントを描画する能力だけを使ってOpenGLアルゴリズムを実装することです。Bresenhamのラインアルゴリズムを使った描画ライン
明らかに私は何かを描く前にdrawLine()
を働かせる必要があります。 drawLine()
は、整数だけを使用して行う必要があります。浮動小数点はありません。
これは私が教えたものです。基本的に、ラインは、4つの異なるカテゴリ、正の急峻な、正の浅い、負の急峻な浅い浅い浅い壊れることができます。これは、私が描くことになっていますの画像です:
、これが私のプログラムが描画された画像です:
色が私たちのために行われます。頂点が与えられており、BresenhamのLineアルゴリズムを使用して開始点と終了点に基づいて線を描画する必要があります。
これは私がこれまで持っているものです。
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;
}
}
}
}
は、私は私のエラーは愚かなものになるだろうが、私は正直に私が間違っているのかを把握することはできません知っています。上記のように線の一部が正しく描かれないのはなぜですか?
働いていないでしょうか? –
私のコードの上の段落にある2枚の写真を見ると、「第2象限」と「第4象限」は正しく描かれていません。ポイント(0,0)が画像の左下隅にあるので、それらを引用符で囲みます。基本的に、最初のelseステートメントには、正しく動作しないコード、-shallowおよび-steepが含まれています。 – ToastyMallows
あなたのコードを2つの簡単な例で動作させます。一つは動作し、もう一つは動作しない例です。 (0,0)、(5,5)と(0,5)、(5,0)は両方を通ってトレースし、それらは発散しています。これは、あなたのために誰かにそれをさせるよりもはるかに優れた練習になります。 –