2013-04-15 3 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 для обоих х и у. Следовательно, вы должны иметь хотя бы одно значение из (xb-xa) и (yb-ya) будет четным. Однако у вас есть две нечетные отличия для второго вызова.

0

Ваше текущее условие завершения цикла никогда не будет истинным, когда расстояния | xa-xb | и | ya-yb | являются нечетными.

Вам необходимо найти лучшее условие прекращения.

Смежные вопросы