2014-04-16 3 views
0

위키피디아 단순화 된 버전 인 C에서 Bresenham의 라인 알고리즘을 구현하려고합니다. 내 코드가 무한 루프에 갇혀서 왜 그럴 수 없는지! (내 확신이 있지만 내 지식과 관련이 있음)Bresenham의 라인 함수 C

void Draw_line (unsigned int x0, unsigned int y0,unsigned int x1, unsigned int y1) 
{ 
    unsigned int dx = abs(x1-x0); 
    unsigned int dy = abs(y1-y0); 
    signed short sx,sy; 
    signed int err,e2; 

    if (x0 < x1) {sx = 1;} else {sx = -1;} 
    if (y0 < y1) {sy = 1;} else {sy = -1;} 
    err = dx-dy; 

    while (!(x0==x1 && y0==y1)) 
    { 
     GLCD_PutPixel(x0, y0); 
     e2 = 2*err; 
     if (e2 > -dy) 
     { 
      err = err - dy; 
      x0 += sx; 
     } 
     if (e2 < dx) 
     { 
      err = err + dx; 
      y0 += sy; 
     } 
    } 
} 

고마워!

편집 : 루프의 조건부가 잘못되어 직선을 플롯하지 않았으므로 올바른 것으로 변경했습니다.

+0

http://www.roguebasin.com/index.php?title=Bresenham%27s_Line_Algorithm – user1095108

+0

다른 기술을 모르는 경우 코드를 디버깅하는 가장 좋은 방법은 printf 문을 추가하는 것입니다. –

+1

전체에서 부호있는 정수를 사용하면 코드가 작동합니다. –

답변

1

-dy은 부호가없는 값이므로 (음수는 아님) 여전히 긍정적일 수 있습니다. 서명되지 않은 것을 제거하면 문제가 해결됩니다.

1

답변을 수락 한 후.

부호있는 정수로 변경하면 하지일반 경우 문제를 해결하지만, @ 영업 이익의 제한적인 경우를 해결 한 수 않습니다.

int을 변경하면 X 것이면 작동 Y 점은 분명 극단적 범위 int 또는 unsignedx0,x1 등의 큰 값의 모든 종류에 대해 아래에 오버 플로우 (UB)이 아니다.

int dx = abs(x1-x0); 

매개 변수가 |x| < INT_MAX/2 인 경우 모두 괜찮습니다.


입력의 모든 조합을 처리하는 일반 솔루션은주의해서 취급해야합니다.

[편집]

영업 이익은 전 범위의 솔루션이 필요합니다 (그리고 약간 게으른 것)하지 않는 한, 내가 발굴 및 일반 솔루션을 게시 연기 할 수 있습니다.

+0

당신이 옳다. 나의 스크린은 320x240이다. 그래서 나는 이것을 고려하지 않았다. 귀하의 의견을 보내 주셔서 감사합니다. – user3541254