|
음 Bresenham 의 소스는 어디서 베껴온거기 때문에 원리는 저두 모릅니다.
굳이 알 필요도 없을것 같구요...
수학적 계산으로 원을 그리는것은 여러가지로 부적합하지요..특히 속도측면에서 보면
Bresenham 알고리즘과는 비교할수 없을겁니다.
그리고 소스 보시면 아시겠지만 Bresenham 알고리즘는 원의 1/4 을 그리는겁니다.
그래서 외곽선을 그리는 부분(put)은 점을 네개 찍습니다.
fill의 경우는 한점(x,y)과 그의 대칭되는 부분의점(-x,y)을 라인으로 그은겁니다.
put 루틴에 sleep 을 넣어서 천천이 보시면 그리는 과정을 보실수 있을겁니다.
MoveToEx(hDC, xx+x, yy+y, NULL); 는 문제가 없어보입니다만...
Bresenham 에 대해서는
각종 검색사이트에서 검색키를 Bresenham 이라고 치시면 많은자료가 나올겁니다.
fighting yo ^^
김인구.구야 님이 쓰신 글 :
: 태윤님이 답변해주신 21115번글 소스를 분석하고 있습니다.
:
: 덕분에 함수 포인터를 어떻게 쓰는지도 알게되었습니다.
: 감사드리구요... 근데 Bresenham 알고리즘이 도무지 분석이 안됩니다.
: 소스상의 S와 T가 어떤 기하학적 의미인지 전혀 모르겠습니다.
: 타원 방정식을 가지고 타원은 어떻게 그리긴 했습니다만
: 님이 주신 소스로 하니까 깔끔하게 삐져나오는거 없이 잘됩니다.
: (제껀 한픽셀이 삐져나왔다 들어갔다 합니다. double형이 int형으로 들어가면서
: 생기는 현상같습니다. 문제는 더이상 손을 못 대겠습니다.)
: 그런데 문제는 님이 주신 소스는 타원의 내부가 검게 채워진 타원이 됩니다.
: MoveTo, LineTo만 썼는데 왜 이런 현상이 일어나는지 모르겠습니다.
: 제가 VC++에서 작업을해서
: Form1->Canvas->MoveTo(xx+x,yy+y);을
: MoveToEx(hDC, xx+x, yy+y, NULL);로 바꾸었는데 이것때문은 아니겠죠?
: 만약에 타원의 외곽선을 그리는게 아니라 내부를 라인으로 채워서 타원을 나타낸다면
: 지금 당장은 Bresenham 알고리즘을 이해하기보단 다른걸 찾아봐야 할꺼 같습니다.
: 좀더 자세한 설명이나 자료 혹은 웹사이트를 가르쳐 주신다면 감사하겠습니다.
|