2010-07-25 61 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