2010-07-25 64 views
1

嘿,所有,我正在清理我的代码从以前的学期。创建一个色板库

以前我在C++中创建了一个151颜色色板库。然而,由于我的时间紧迫和缺乏经验,我完全将它作为一个定义语句块来创建。其中,为硬编码值的点工作正常。但是这种方法存在一些明显的弱点。

到目前为止,我所做的是创建一个命名空间'swatch',并且在命名空间内我将有一个枚举有效颜色。我还会有一个'getSwatch'函数或类似的东西,它会返回一个vec3(我的一个类,代表一个3元素的向量,具有一些很好的功能),并且该函数将使用switch语句通过有效的色板。

这将是这个样子:

namespace swatch{ 

    enum color{ 
     red, 
     blue, 
     green 
    } 

    inline 
    const vec3 getColor(const color& c){ 
     // Switch and return red blue or green. 
    } 
} 

我的问题:我想知道你会如何建议这样做?性能与特点,和可用性的了好处是什么,我最感兴趣的。

在此先感谢朋友,

编码愉快。

编辑:我刚刚改变了这个例子,让那些不知道我如何使用我的vec类的人更有意义。 (即:除我之外的每个人)。另外,你可以看看其他使用者的使用情况。他们对将rgb值传递给构造函数做了一个很好的猜测,那不是我如何做到的,但我仍然可以很好地遵循你的意思。

+0

我不明白你想要做什么。为什么'getColor' *接受*一种颜色,为什么它是一个模板? – Thomas 2010-07-25 19:09:40

+0

对不起,我会解释。 这与vec类有关。 vec类接受一个模板。并且让颜色接受颜色,所以它可以返回以vec表示的颜色。 例如: vec backgroundCol(3); backgroundCol = swatch :: getColor(red); 所以backgroundCol [0]等于1,然后backgroundCol [1]和backgroundCol [2]都等于零。假设每个值为0到1的RGB比例尺。 – Xoorath 2010-07-25 22:22:12

回答

1

使用查找表:

/************* .h *************/ 

enum color{ 
    red, 
    blue, 
    green, 

    colors_count 
} 

const vec3 &getColor(color c) 
{ 
    extern const vec3 colors_table[colors_count]; 
    return colors_table[c]; 
} 

/************* .cpp *************/ 

extern const vec3 colors_table[colors_count] = { 
    vec3(255, 0, 0), // red 
    vec3(0, 0, 255), // blue 
    vec3(0, 255, 0), // green 
}; 

你没有写关于使用模板的目的什么,所以我只是消除他们。如果你解释更多,那么我可能会帮助你。

//编辑
它非常简单,速度非常快。
在C++中,枚举值不仅仅是一些标识符,它们是数字。如果你没有指定其他的数字,他们将从0开始计算数字:'红'是0,'蓝'是1,'绿'是2,'colors_count'是3(见http://www.google.com/search?q=c%2B%2B+enum)。 您可以使用这些数字来索引数组。然后,您只需在给定索引处从数组中选取一个项目。

+0

是的,对不起,我很快就会从上面的例子中找到模板。这很有趣。我将不得不做一些阅读,并尝试一下。我其实不确定这将如何工作。 – Xoorath 2010-07-25 22:30:57

+0

我做了一些编辑,现在应该都清楚了。 – adf88 2010-07-26 09:00:43

+0

是的。看起来很棒的男人,谢谢。 – Xoorath 2010-07-26 15:19:30

0

你可以只使用一个std::map<color, vec>

class ColorClass { 
    private: 
    std::map<color, vec> colors; 
    // ... etc ... 

然后你有一个很大的初始化函数,设置起来:

colors["red"] = new vec(0xFF, 0x00, 0x00); 
    colors["blue"] = new vec(0x00, 0xFF, 0x00); 
    // ... etc ... 

然后你的getColor函数是:

return colors[color]; 

完成!

+0

好吧,先生,我喜欢那样。添加一些更多的关联到颜色,然后是switch语句。但是,通过这种颜色分类方法,我是不是每次都要在内存中保存每种颜色的副本? – Xoorath 2010-07-25 19:22:31

+0

@Xoorath:你有多少种颜色?如果它小于10^6,那有什么问题? – 2010-07-25 20:45:29

+0

@Mike:我有151.不一定有'问题'。不过,我会在制作视频游戏时使用这种方式,在潜在有限内存的平台上进行;假设每个vec有4个元素(RGBA),那么当我可以使用处理能力在颜色之间进行切换而不是存储数据时,我将在内存中保存604浮点数或双精度值。 我只是想知道如果我能找到一个好的中间地带吃CPU的功率与内存之间。尽管如此,这仍然是一个可行的选择。 – Xoorath 2010-07-25 22:27:58