5. 2d 원 그리기

반응형

라인으로 사각형도 그리고 삼각형도 그리고,

쉽게쉽게 할수 있다.

그렇다면 원은 어떨까?

 

예전에 이 원그리기를 만들때 자료구조책을 보면서 만들었었는데

그 책이 어떤책인지 기억이 잘 나지 않는다.

결국 내용은 이전에 다루었던 브레즌햄? 알고리즘으로 그림.

그림 1.

 

지금보니 알고리즘이 잘 이해가 안가지만 굳이 시간을 쏟고 싶지 않아서 넘김.

코드를 기록으로 남김.

더보기
void Dib::DrawCircle(NVertex v1, NVertex v2)
{
	int      x_coor;
	int      y_coor;
	int      p_value;
	int		 r;

	NVertex coor;
	coor.x = 0;
	// 원의 방정식을 사용하여 원의 반지름 (coor.y)를 구한다.
	coor.y = sqrt((double)(v2.x - v1.x) * (v2.x - v1.x) + (v2.y - v1.y) * (v2.y - v1.y));
	
	p_value   = 3 - 2 * coor.y;

	while   ( coor.x < coor.y)
	{
		PloatCircle(v1, coor);
		if ( p_value < 0)
		{
			p_value   += 4 * coor.x +6;
		}
		else
		{
			p_value   += 4 * ( coor.x - coor.y) +10;
			coor.y--;
		}
		coor.x++;
	}
	if ( coor.x == coor.y)
		PloatCircle(v1, coor);

}

void Dib::PloatCircle(NVertex v, NVertex coor)
{
	//8방향.
	DrawPixel( v.x +coor.x, v.y +coor.y);
	DrawPixel( v.x -coor.x, v.y +coor.y);
	DrawPixel( v.x +coor.x, v.y -coor.y);
	DrawPixel( v.x -coor.x, v.y -coor.y);
	DrawPixel( v.x +coor.y, v.y +coor.x);
	DrawPixel( v.x -coor.y, v.y +coor.x);
	DrawPixel( v.x +coor.y, v.y -coor.x);
	DrawPixel( v.x -coor.y, v.y -coor.x);
}

'작업장 > Software Renderer' 카테고리의 다른 글

4. 2D 클리핑.  (0) 2021.02.07
3. [software renderer] 선 그리기  (0) 2021.01.07
2. [software renderer] 점찍기  (0) 2021.01.07
1. [software renderer] 시작  (0) 2020.09.08
TAGS.

Comments