我正在为我的 raytracer 使用 C 语言开发一个解析器,该解析器读取用户输入(以描述场景)。我希望用户能够以这种格式书写颜色:
sphere:
{
position: 0, 0, 0
radius: 1
color: white
}
我想给用户很多选择。过去,对于其他项目中的颜色,我使用了一个大型头文件,其中包含十六进制格式的颜色定义,如下所示:
# define BLACK 0x000000
...
但我不能完全遍历我的定义并与用户输入进行比较...... 读取用户输入并确定用户给出的颜色的最实用方法是什么?请记住,我有几十种颜色,我希望能够轻松添加新颜色。我有点想避免对每种颜色都这样做:
if (!strcmp(user_input, "red"))
return (0xFF0000);
if ...
但是否有一种实用的方法可以在循环中使用预定义的颜色和值表来执行此操作?
最佳答案
嗯,最简单的(?)可能是不硬编码,而是:
- 定义一个定义颜色的文本格式(可以是 super 简单的东西,每行只有一个名称和一个十六进制三元组)
- 启动时读入一次文件
- 准备内存中的数据以进行快速搜索:对其进行排序(使用
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 系统的磁盘上可用,否则您可以从维基百科复制粘贴它作为起点。
关于c - 根据用户输入确定颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42512257/