본문 바로가기

NDS

PA_Draw 는 어떻게 그려질까? 2

2008/08/22 - [NDS/NDS_Palib] - PA_Draw 는 어떻게 그려질까?

주석 처리 되어있던 PA_DrawCircle를 적용시켜 보았다.
void PA_DrawCircle(u8 screen, int color){
int xCenter = Stylus.X;
int yCenter = Stylus.Y;
int radius = PA_drawsize[screen] / 2;
int x = 0;
int y = radius;
int p = 3 - 2 * radius;

	while (x <= y){
		PA_Put16bitPixel(screen, xCenter + x, yCenter + y, color);
		PA_Put16bitPixel(screen, xCenter - x, yCenter + y, color);
		PA_Put16bitPixel(screen, xCenter + x, yCenter - y, color);
		PA_Put16bitPixel(screen, xCenter - x, yCenter - y, color);
		PA_Put16bitPixel(screen, xCenter + y, yCenter + x, color);
		PA_Put16bitPixel(screen, xCenter - y, yCenter + x, color);
		PA_Put16bitPixel(screen, xCenter + y, yCenter - x, color);
		PA_Put16bitPixel(screen, xCenter - y, yCenter - x, color);
      if (p < 0) p += 4 * x++ + 6;
      else p += 4 * (x++ - y--) + 10;
   }
}

사용자 삽입 이미지
생각보다 문제 되는 부분은 없었다. 위에 적용 시킨건 터치가 인식된 좌표에만 원을 그려넣은거라서 원끼리 이어주는 부분은 아직 없다. 이 부분만 추가하면 의도한 대로 나올것 같다.
테스트 해보면서 왜 주석처리 당해야했는지 알았는데 X좌표에서 0이하, 255이상으로 넘어가게 되면 반대편으로 삐져나오는 문제가 있다. 출력시 if문으로 제어하면 쉽게 처리할수있을거 같다.

남은건 이제 원끼리 이어주는 부분인데 다음 함수에서 찾아볼수있다.

이전 함수들보다 단순해보이면서도 복잡하다.
솔직히... 복잡해서 자세한 설명은 못하겠다; 대충 알아보면...

4-17행은 x, y축의 길이의 절대값과 방향을 잡기위한 변수(sdx, sdy)를 구하고있다. 선의 종료위치가 시작위치보다 항상 큰건 아니기때문에 증가 시킬지 감소시킬지를 구한다.

24행은 첫 위치를 찍어주는것이겠고...

27행의 if문은 시작위치와 종료위치를 직사각형으로 봤을때 x,y 어느축의 길이가 더 긴지 체크한다.

28-36행을 대충 설명한다면 x축을 따라서 점을 계속 찍어주는데 x,y 축을 비교해서 y축을 증가시켜주는것이다.
(x축 길이/2)+y축 길이가 x축 길이보다 크면 y축을 증가 시키고 있는데 이해 될듯하면서도 안되니 넘어가자.

이 함수를 위 원을 그리는 함수와 같이 적용 시키면 원하는 함수를 얻을수있다.

결과는 마지막 다음편에 계속...

2008/08/25 - [NDS/NDS_Palib] - Palib - PA_16bitDrawCircle 함수

'NDS' 카테고리의 다른 글

Palib - 문자인식 Shape Recognition  (0) 2008.08.25
Palib - PA_16bitDrawCircle 함수  (6) 2008.08.25
PA_Draw 는 어떻게 그려질까?  (2) 2008.08.22
NDS SuChupDS 0.2.1 BMP 저장 이미지  (0) 2008.08.22
SuChupDS - changelog  (2) 2008.08.22