2017-02-28 13 views
1

나는 장면을 설명하기 위해 사용자 입력을 읽는 C에서 raytracer 용 파서를 만들고 있습니다. 사용자가 다음 형식으로 색상을 쓸 수있게하려고합니다.사용자 입력에 따라 색상 결정

sphere: 
{ 
position: 0, 0, 0 
radius: 1 
color: white 
} 

나는 여러 가지 옵션을 제공하고자합니다. 과거에 다른 프로젝트의 색상을 위해,이 같은 16 진수 색상에 대한 정의와 함께 큰 헤더 파일 사용 :

# define BLACK 0x000000 
... 

을하지만 난 꽤 내 정의를 통해 반복하고 사용자 입력에 비교할 수 없습니다 .. 사용자 입력을 읽고 사용자가 제공 한 색상을 결정하는 가장 실질적인 방법은 무엇입니까? 기억 나는 수십개의 색이 있으며 나는 새로운 색을 쉽게 추가 할 수 있기를 원한다.

if (!strcmp(user_input, "red")) 
    return (0xFF0000); 
if ... 

그러나 색상 값을 미리 정의 된 테이블과 루프에서이 일을 실제적인 방법이있을 수있다 : 나는 좀 모든 색상이 일을 피하려고?

+0

@Christian Ceballos (의견을 말할 담당자가 충분하지 않음) : 중첩 된 for 루프를 사용해 볼 수 있습니까? –

+0

for 중첩 루프를 사용해 볼 수 있습니까? –

답변

2

음, 가장 쉬운 아마이 하드 코드하지 수 있지만 대신 것 (?) : (단지 이름과 육각 삼중와 슈퍼 간단한 일이 될 수

  1. 색상을 정의하는 텍스트 형식을 정의
  2. 가 시작시 한 번 파일에 읽기) 라인 당
  3. 빠른 검색을 위해 메모리에 데이터를 준비합니다 종류는() qsort()를 사용하여, 당신은() bsearch()를 사용하여 이진 검색을 사용할 수 있도록.

그러면 색상을 검색해야 할 때마다 색상 파일 데이터에서 검색을 수행하면됩니다.

이 같은 아마도 API를 상상 :

// Returns number of loaded colors, or -1 on error. 
int colordb_init(const char *filename); 

// Returns true on success, false if the color is not known. 
bool colordb_lookup(const char *name, uint32_t *rgb); 

모든 코드의 아마 100 ~ 150 선에서 구현 될 수 있으며, 매우 빠른 것 즉,하지 (이진 검색 포장 배열하는 것은 빠르다) 나는 컬러 룩업의 속도가 raytracer에서 병목이 될 것이라고 기대한다. :)

This list from X11은 일반적으로 Unix : y 시스템의 디스크에서 사용할 수 있습니다. 그렇지 않으면 위키 백과에서 복사하여 붙여 넣기를 시작할 수 있습니다.

+0

해시 테이블에 대한 응용 프로그램과 비슷한 모양입니다. 어쨌든, 질문은 너무 광범위합니다. – Olaf

+0

이와 같은 해결책은 내가 찾고있는 것입니다! 이 프로젝트는 학교 프로젝트이므로 사용할 수있는 기능이 제한적입니다. 이 경우에는 필자가 직접 qsort와 bsearch를 만들어야하지만, 외부 파일을 가지고 시작시 파싱한다는 아이디어는 훌륭합니다. 감사! – CptBB

관련 문제