2012-04-08 37 views
8

私のコンピュータグラフィックスの宿題は、ポイントを描画する能力だけを使ってOpenGLアルゴリズムを実装することです。Bresenhamのラインアルゴリズムを使った描画ライン

明らかに私は何かを描く前にdrawLine()を働かせる必要があります。 drawLine()は、整数だけを使用して行う必要があります。浮動小数点はありません。

これは私が教えたものです。基本的に、ラインは、4つの異なるカテゴリ、正の急峻な、正の浅い、負の急峻な浅い浅い浅い壊れることができます。これは、私が描くことになっていますの画像です:

expected result

、これが私のプログラムが描画された画像です:

actual result

色が私たちのために行われます。頂点が与えられており、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; 
         } 
       } 
     } 
} 

は、私は私のエラーは愚かなものになるだろうが、私は正直に私が間違っているのかを把握することはできません知っています。上記のように線の一部が正しく描かれないのはなぜですか?

+0

働いていないでしょうか? –

+0

私のコードの上の段落にある2枚の写真を見ると、「第2象限」と「第4象限」は正しく描かれていません。ポイント(0,0)が画像の左下隅にあるので、それらを引用符で囲みます。基本的に、最初のelseステートメントには、正しく動作しないコード、-shallowおよび-steepが含まれています。 – ToastyMallows

+0

あなたのコードを2つの簡単な例で動作させます。一つは動作し、もう一つは動作しない例です。 (0,0)、(5,5)と(0,5)、(5,0)は両方を通ってトレースし、それらは発散しています。これは、あなたのために誰かにそれをさせるよりもはるかに優れた練習になります。 –

答えて

0

問題が何であるか疑問に思っていた場合でも、私はまだそれが何であるかは分かりません。私がやったことは、自分のコードを再絞り込みして、-shallowと-steepがそれぞれ+ shallowと+と同じアルゴリズムを使用するようにしました。 x、y座標を調整した後(x座標またはy座標を無効にする)、それらをプロットするとき、私は元の否定を否定して正しい位置にプロットしました。

+0

私はC言語に精通していませんが、実際の値のいくつかを絶対値に変換する必要がありますか? –

5

あなたはhttp://www.etechplanet.com/codesnippets/computer-graphics-draw-a-line-using-bresenham-algorithm.aspxでブレゼンハムアルゴリズムを使用して線を描画するためにC++に完全なコードを見つけることができます。

/*BRESENHAAM ALGORITHM FOR LINE DRAWING*/ 
#include<iostream.h> 
#include<graphics.h> 
#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<math.h> 
#include<dos.h> 
void bhm_line(int,int,int,int,int); 
void main() 
{ 
int ghdriver=DETECT,ghmode,errorcode,x1,x2,y1,y2; 
initgraph(&ghdriver,&ghmode,"..\\bgi"); 
errorcode = graphresult(); 
if(errorcode !=grOk) 
{ 
    cout<<"Graphics error:%s\n"<<grapherrormsg(errorcode); 
    cout<<"Press any key to halt:"; 
    getch(); 
    exit(1); 
} 
clrscr(); 
cout<<"Enter the coordinates (x1,y1): "; 
cin>>x1>>y1; 
cout<<"Enter the coordinates (x2,y2): "; 
cin>>x2>>y2; 
bhm_line(x1,y1,x2,y2,1); 
getch(); 
} 
void bhm_line(int x1,int y1,int x2,int y2,int c) 
{ 
int x,y,dx,dy,dx1,dy1,px,py,xe,ye,i; 
dx=x2-x1; 
dy=y2-y1; 
dx1=fabs(dx); 
dy1=fabs(dy); 
px=2*dy1-dx1; 
py=2*dx1-dy1; 
if(dy1<=dx1) 
{ 
    if(dx>=0) 
    { 
    x=x1; 
    y=y1; 
    xe=x2; 
    } 
    else 
    { 
    x=x2; 
    y=y2; 
    xe=x1; 
    } 
    putpixel(x,y,c); 
    for(i=0;x<xe;i++) 
    { 
    x=x+1; 
    if(px<0) 
    { 
    px=px+2*dy1; 
    } 
    else 
    { 
    if((dx<0 && dy<0) || (dx>0 && dy>0)) 
    { 
    y=y+1; 
    } 
    else 
    { 
    y=y-1; 
    } 
    px=px+2*(dy1-dx1); 
    } 
    delay(0); 
    putpixel(x,y,c); 
    } 
} 
else 
{ 
    if(dy>=0) 
    { 
    x=x1; 
    y=y1; 
    ye=y2; 
    } 
    else 
    { 
    x=x2; 
    y=y2; 
    ye=y1; 
    } 
    putpixel(x,y,c); 
    for(i=0;y<ye;i++) 
    { 
    y=y+1; 
    if(py<=0) 
    { 
    py=py+2*dx1; 
    } 
    else 
    { 
    if((dx<0 && dy<0) || (dx>0 && dy>0)) 
    { 
    x=x+1; 
    } 
    else 
    { 
    x=x-1; 
    } 
    py=py+2*(dx1-dy1); 
    } 
    delay(0); 
    putpixel(x,y,c); 
    } 
} 
} 
+3

これはリンクのみの回答です。リンクだけでなく、実際のコードを含めるように回答を編集してください。 – LittleBobbyTables

+0

bhm_line()の "delay(0)"とは何ですか? –

関連する問題