2012-12-06 7 views
0

저를 괴롭히는 Bresenham의 부동 소수점 알고리즘에 뭔가가 있습니다. 우리는 Y = 0.6 배을 그리려는Bresenham 선 그리기 알고리즘

void line(x0, x1, y0, y1) 
{ 
    int deltax = x1 - x0; 
    int deltay = y1 - y0; 
    float error = 0; 
    float deltaerr = Math.abs((float)deltay/(float)deltax); 
    int y = y0 

    for(int x=x0;x<=x1;x++) 
    { 
    SetPixel(x,y) 
    error = error + deltaerr 
    if (error >= 0.5) 
    { 
      y = y + 1 
      error = error - 1.0 
    } 
    } 
} 

가정합니다

알고리즘은 아래와 같습니다. 그래서 x = 0에 대한 첫 번째 단계에서 : 오류는 0.6으로 설정되고 if 문으로 실행되고 y 이 증가합니다. 오류는 -0.4로 설정됩니다. -0.4가 다음 단계에서 우리를 도울 수있는 방법은 무엇입니까?

error = error - 1.0 

왜 우리가 1 오류가 사망한다 :

그래서 내 문제는이 코드 라인입니까? 나는 우리가 재조정 때문에 이것을했다고 읽었습니다! 어떻게 우리를 도울 수 있습니까? 우리는 우리가 y을 건드리지 않고 x 증가 루프의 다음 반복에 들어갔을 때

+3

[실제 알고리즘] (http://en.wikipedia.org/wiki/Bresenham's_line_algorithm#Algorithm)을 보셨습니까? 당신이 보여주는 사람은 단지 부분적으로 정확하기 때문에 –

+0

위키 피 디아가 그것을 왜 페이지 상단에 놓았 는가? –

답변

5

오류가 누적됩니다. 그것이 절반 픽셀보다 클 때, 라인은 1 픽셀 위로 이동되고, 에러는 다시 전체 픽셀에 의해 보정되어야한다.

오류를 단순히 0으로 설정하면 오류의 일부만 취소되므로 줄이 너무 일찍 다시 단계적으로 표시되고 잘못된 그라데이션이됩니다. 오류를 계산하지만 그것을 제로 경우 Y = 0.6에 대한 예에서

는 다음과 같은 상황이 발생합니다

error = 0; 
plot pixel; 
increment error. error = 0.6; 
error > 0.5, so move over and reset error to 0; 
plot pixel; 
increment error. error = 0.6; 
error > 0.5, so move over and reset error to 0; 
plot pixel; 
increment error. error = 0.6; 
error > 0.5, so move over and reset error to 0; 
... 

그래서 라인이 실제로 1의 기울기를 가지고; 그라디언트> = 0.5 인 모든 라인이 똑같이 나올 것이고, 이는 그리 유용하지는 않습니다.

error = 0; 
plot pixel; 
increment error. error = 0.6; 
error > 0.5, so move over and subtract one; error = -0.4; 
plot pixel; 
increment error. error = 0.2; 
plot pixel; 
increment error. error = 0.8; 
error > 0.5, so move over and subtract one; error = -0.2; 
... 

라인이 정확한 기울기를 가지고, 오류가 고정 소수점 계산의 소수 부분의 역할을하기 때문에 : 당신이 올바르게 할 경우

.

+0

more .... –

+0

ur 설명에 감사드립니다. 빼기 위해 1을 선택하는 이유가 있습니까? 왜 0.5 아닌가? –

+0

그건 위의 설명에 있습니다. 오류는 픽셀의 분수 부분을 나타냅니다. 1 픽셀 이상 이동하면 오류에서 1을 빼야합니다. – JasonD

0

errorideal_y-current_y

입니다. error=error+deltaerr은이 작업 이후에 error의 업데이트입니다.

y을 증가 시키려면 다시 error을 업데이트해야합니다. 즉, error=error-1입니다.

+0

나는 우리가 오류를 조정해야한다고 언급했다. 나의 질문은 왜 e = e-1인가, e = 0이 아닌 이유인가? –

+0

오류 = error + deltaerr가 현재 x에 대한 이상적인 y로 오류를 설정합니까? –

+0

ideal_y는 정수가 아니기 때문에 current_y는 항상 그렇기 때문에 오류가 0이되지 않을 수도 있습니다. – maxim1000