Skip to content
ChangHyun Jang edited this page Apr 21, 2022 · 22 revisions

mandatory 기준 Parse 설명

1. 인자값 및 open 체크

  • 인자값 - 확장자명 .rt 체크
./minirt cjang.rt		(o)

./minirt test1.rt test2.rt	(x)
./minirt			(x)
./minirt cjang			(x)
  • open - fd 체크
./minirt cjang.rt		(o)

./minirt cjam.rt		(x)

2. gnl과 split을 이용하여 문자열로 파싱

  • gnl - open한 결과값인 fd값을 이용하여 get_next_line으로 read를 이용하여 한 줄씩 읽음
  • split - 개행문자를 제외한 white space를 기준으로 split한다.

3. 문자열에서 도형의 타입, 들어와야 할 정보 개수 체크

  • 도형 타입 - split한 문자열의 맨 앞의 값이 해당하는 도형의 문자열인지 아닌지 체크
  • 정보 개수 - 도형 타입과 들어와야 할 정보 개수가 유효한지 체크
A 0.2				255,255,255	(o)
C -2,2,1	-1,1,1	90			(o)
L 0,20,0		0.6	255,255,255	(o)
sp 0,-100.5,-1		200	204,204,0	(o)
cy 1,-0.5,-1	0,1,0   1 1	204,153,51	(o)
pl 0,0,-5	0,0,1		30,127,30	(o)

# 도형 타입
0.2				255,255,255	(x)
PL 0,0,-5	0,0,1		30,127,30	(x)
B -2,2,1	-1,1,1	90			(x)

# 정보 개수
pl 0,0,-5	0,0,1	1 1	30,127,30	(x)
pl 1,2,3					(x)
pl 1, 2, 3	0, 0, 1		30,127,30	(x)
pl 1 , 2 , 3	0,0,1		30,127,30	(x)

4. vector값 쉼표 기준 파싱, char * 형에서 double형으로 변경.

  • vector(x,y,z)값 - 쉼표를 기준으로 파싱. 이 때, split이 아니라 strsep을 이용하여 쉼표를 구분한다.
pl 0,0,-5	0,0,1		30,127,30	(o)

pl 0a,0,-5	0,0,1		30,127,30	(x)
pl 0a,0,-5	0,0,1		30,,127,30	(x)
pl 0a,0,-5	0,0,1		30,127,30,	(x)
pl 0,0,-5	0,0		bb,127,30	(x)

sp 0,-100.5,-1		2.	204,204,0	(o)
sp 0,-100.5,-1		2..	204,204,0	(x)

5. double형으로 변경하면서 값 범위 체크

  • 값 범위 - 과제에 나와있는 기준값 이내인지 체크
    다만, FOV에서는 180 미만으로 처리하였다. 180도가 될 경우 화면의 영역과 화각이 서로 평행하기 때문에 이론상 화면이 그려지지 않기 때문이다.
#  [x,y,z point]		[normalized vector]	[ratio]	[diameter]	[height]	[FOV]	[RGB]
A							[0-1]						[0-255],[0-255],[0-255]	(o)
C  [none],[none],[none]		[-1~1],[-1~1],[-1~1]						[0-180)				(o)
L  [none],[none],[none]					[0-1]						[0-255],[0-255],[0-255]	(o)
sp [none],[none],[none]						[0-]					[0-255],[0-255],[0-255]	(o)
cy [none],[none],[none]		[-1~1],[-1~1],[-1~1]		[0-]		[0-]			[0-255],[0-255],[0-255]	(o)
pl [none],[none],[none]		[-1~1],[-1~1],[-1~1]							[0-255],[0-255],[0-255]	(o)
# 이외는 x

6. double 값들을 해당 타입의 구조체에 정의

  • 값 - 필요한 값에 맞게 정의
[normalized vector]	벡터의 길이를 1로 재설정.
[diameter]		diameter / 2
[RGB]			[0-255],[0-255],[0-255] -> [0-1],[0-1],[0-1]

기타사항

폴더를 실행하려고 할 경우

open에선 실행이 되지만, get_next_line 내부의 read함수에서 읽지 못한다. 이 부분에서 예외처리를 하여 잘못 읽었음을 에러로 출력한다.