2013-04-15 37 views
0

該代碼在第一次調用positionGenerator(1046,1623,750,1290);時正常工作,但在第二次調用positionGenerator(1046,1623,375,810);中遇到無限循環。Bresenham畫線失敗的一個特定的座標?

#include<iostream> 
    #include<string> 
    #include<cmath> 
    using namespace std; 



void positionGenerator(int xa,int ya, int xb,int yb) 
{ 
int dx=0,dy=0,x_inc=0,y_inc=0,m=0,p=0,i=0; 
dx=xb-xa; 
dy=yb-ya; 
m=dy/dx; 
x_inc=dx>0?2:-2; 
y_inc=dy>0?2:-2; 
cout<<"x_incr"<<x_inc<<"y_incr"<<y_inc<<endl; 
cout<<"dx"<<dx<<"dy"<<dy<<endl; 
dx=abs(dx); 
dy=abs(dy); 
cout<<"dx"<<dx<<"dy"<<dy<<endl; 
p=(2*dy)-(dx); 
for(i=1;((xa!=xb) && (ya!=yb));i++) 
{ 
    if(p>0) 
    { 
     xa=xa+x_inc; 
     ya=ya+y_inc; 
     p=p+(2*dy)-(2*dx); 
    } 
    else 
    { 
     if(m<1) 
     { 
      xa=xa+x_inc; 
      p=p+(2*dy); 
     } 
     else 
     { 
      ya=ya+y_inc; 
      p=p-(2*dx); 
     } 

    } 

cout<<"x"<<xa<<"y"<<ya<<endl; 

    } 
} 

int main() 
{ 
    //first_call 
    positionGenerator(1046,1623,750,1290); 

    //second_call 
    positionGenerator(1046,1623,375,810); 
    return 0; 
} 

我相信該算法適用於正斜率和負斜率。

+1

由於每次循環都用'2'增加/減少,想想如果'xa'是偶數而xb'不均勻時(和'ya' /'yb'相同)會發生什麼? –

回答

1

您應該使用最長的直線投影來計算沿軸的像素數,而不是依賴於(xa!=xb) && (ya!=yb)。然後可能還有其他一些缺陷需要修復。

1

你在條件問題((xa!=xb) && (ya!=yb))

增量值等於2爲x和y。 因此,你應該至少有一個來自(xb-xa)和(yb-ya)的值是均勻的。 然而,第二次調用你有兩個奇怪的差異。

0

當距離| xa-xb |時,您當前的循環終止條件永遠不會成立。和| ya-yb |都很奇怪。

您需要找到更好的終止條件。