根据用户输入确定颜色

时间:2017-02-28 15:07:15

标签: c parsing input compare

我正在使用C中的光线跟踪器解析器读取用户输入(描述场景)。我希望用户能够以这种格式写一种颜色:

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

我想给用户很多选择。在过去,对于其他项目中的颜色,我使用了一个大的头文件,其中包含十六进制格式的颜色定义,如下所示:

# define BLACK 0x000000
...

但我不能完全迭代我的定义并与用户输入进行比较...... 阅读用户输入并确定用户提供的颜色最实用的方法是什么?请记住,我有几十种颜色,我希望能够轻松添加新颜色。我有点想避免为每种颜色做这件事:

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

但是有没有一种实用的方法可以在一个带有预定颜色和值表的循环中执行此操作?

1 个答案:

答案 0 :(得分:2)

嗯,最简单的(?)可能不是硬编码,而是:

  1. 定义一种定义颜色的文本格式(可能只是名称和每行的十六进制三元组,非常简单)
  2. 在启动时读入文件
  3. 准备内存中的数据以进行快速搜索:对其进行排序(使用qsort()),以便您可以使用二分搜索(使用bsearch())。
  4. 然后,只要您需要查找颜色,请在颜色文件数据中搜索并完成。

    我想象一个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系统的磁盘上可用,否则你可以从维基百科中复制粘贴它作为起点。