2017-02-28 50 views
1

我正在为C中的我的raytracer解析器工作,该解析器读取用户输入(描述场景)。我希望用户能够在一个颜色写在这个格式:根据用户输入确定颜色

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

我想给用户多种选择。在过去,在其他项目中的颜色,我用十六进制格式定义的颜色像这样一个大的头文件:

# 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可能行代码来实现,将是非常快(二进制搜索堆积阵列快),而不是我预计颜色查找的速度很快就会成为光线追踪器的瓶颈。 :)

This list from X11通常在Unix:y系统上的磁盘上可用,否则您可以从Wikipedia复制粘贴它作为起点。

+0

看起来更像是一个散列表的应用程序。无论如何,这个问题太广泛了。 – Olaf

+0

像这样的解决方案正是我期待的!由于这是一个学校项目,我只限于我可以使用的功能。在这种情况下,我将不得不创建自己的qsort和bsearch,但在启动时创建外部文件并对其进行解析的想法非常好。谢谢! – CptBB