4. 2D 클리핑.

반응형

지금 정리하는 내용들이 예전에 아카데미에서 했던 내용들을 

잊지 않기 위해 적는것들이 대부분이라 그다지 중요하지 않다고 생각되는 것들은

빠르게 스킵.

클리핑의 경우 사실 나중에 더 자세히 다룰 내용이라 간단하게만 짚고 넘어감

 

2D에서의 클리핑.

클리핑에 대한 설명은 패스.

1. 클리핑 영역을 임시로 잡아준다.

그림 1.

2. 라이을 클리핑 영역 바깥에서 클리핑 영역을 관통되게 그려준다.

그림2

코드 내용도 별고 없다.

라인의 시작점과 끝점을 기준으로 기존에 만들었던 라인을 그리는데 그 영역중에

클리핑 영역에 속하지 않는 것들은 제외해주기만 하면 된다.

 

코드는 아래쪽을 클릭

더보기
/*
v1 : 마우스 시작점
v2 : 마우스 끝점
xmin,ymin,xmax,ymax : 미리 정해둔 클리핑 영역
*/
void Dib::Cliping(NVertex v1, NVertex v2, int xmin, int ymin, int xmax, int ymax)
{
	bool accept, done;
	Outcode outcode0, outcode1, outcodeOut;
	float x,y;
	accept = false;
	done = false;

	//비트를 채운다.
	outcode0 = CompOutCode(v1.x,v1.y,xmin,xmax,ymin,ymax);
	outcode1 = CompOutCode(v2.x,v2.y,xmin,xmax,ymin,ymax);

	//그리기가 될때까지 반복
	do 
	{
		//1. trival accepted 인지 조사 -> 두 점이 모두 0인지 조사.
		if(outcode0.all == 0 && outcode1.all == 0)
		{
			accept = true;
			done = true;
			break;
		}

		//2. trival rejected 두점을 AND 했을 때 0이 아닐경우.
		else if((outcode0.all & outcode1.all) != 0)
		{
			done = true;
			break;
		}

		else	//trival accepted도 아니고 rejected도 아닌 경우. 조사를 하여야 한다.
		{
			//조사해야 할 부분은 outcode이다. 

			//0이 아닌 경우
			if(outcode0.all != 0)
				outcodeOut = outcode0;		//step1. 0이 아닌 부분을 넣는다.

			else
				outcodeOut = outcode1;


			//step2. 새로운 x와 y를 찾는다.

			//outcode가 top?-> ymax를 이용해서 교점을 찾아야 한다. ymax위에 있다. ymax를 넣어서 x를 찾으면 된다.
			if(outcodeOut.top)		//or if(outcodeOut.all & 8)
			{	
				y = ymax;
				x = v1.x + (v2.x-v1.x) * (ymax - v1.y) / (v2.y-v1.y);
			}

			//outcode가 bottom?-> ymin를 이용해서 교점을 찾아야 한다. ymin아래 있다. ymin를 넣어서 x를 찾으면 된다.
			else if (outcodeOut.bottom)
			{
				y = ymin;
				x = v1.x + (v2.x-v1.x) * (ymin - v1.y) / (v2.y-v1.y);  
			}

			//outcode가 right?-> xmax를 이용해서 교점을 찾아야 한다. xmax오른편에 있다. xmax를 넣어서 y를 찾으면 된다.
			else if (outcodeOut.right)
			{
				x = xmax;
				y = v1.y + (v2.y-v1.y) * (xmax - v1.x) / (v2.x-v1.x);  
			}

			//outcode가 left?-> xmin를 이용해서 교점을 찾아야 한다. xmin왼편에 있다. xmin를 넣어서 y를 찾으면 된다.
			else if (outcodeOut.left)
			{
				x = xmin;
				y = v1.y + (v2.y-v1.y) * (xmin - v1.x) / (v2.x-v1.x);
			}

			//step3. 새로운 x와 y를 대입한다.
			if(outcodeOut.all == outcode0.all)								//out이 적용되어 들어갔다는 이야기가 된다.
			{
				v1.x = x;
				v1.y = y;
				outcode0 = CompOutCode(v1.x, v1.y, xmin, xmax, ymin, ymax);
			}

			else
			{
				v2.x = x;
				v2.y = y;

				outcode1 = CompOutCode(v2.x, v2.y, xmin, xmax, ymin, ymax);
			}
		}

	} while(!done);	//done : true(trivial accept[완전이 빠진경우], reject[완전히 거부경우]

	if(accept)		//true인 경우만 그리자.
		DrawLineMid(v1, v2); 
}

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

5. 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