#include #include using namespace std; struct ColorEmitor { int offset; int color[3]; }; class PaletteFactory { private: PaletteFactory(); public: static void generate(ColorEmitor emitors[], int emitorsCount, int palette[][3], int paletteSize) { ColorEmitor currentEmitor, nextEmitor; currentEmitor = emitors[0]; int nextEmitorIndex = 1; nextEmitor = emitors[1]; int range = nextEmitor.offset - currentEmitor.offset; for(int i = 0; i < paletteSize; i++) { if(i >= nextEmitor.offset) { nextEmitorIndex++; currentEmitor = nextEmitor; nextEmitor = emitors[nextEmitorIndex]; range = nextEmitor.offset - currentEmitor.offset; } float red, green, blue; float opacity1 = (float)(nextEmitor.offset - i) / range; float opacity2 = (float)(i - currentEmitor.offset) / range; red = opacity1 * currentEmitor.color[0] + opacity2 * nextEmitor.color[0]; green = opacity1 * currentEmitor.color[1] + opacity2 * nextEmitor.color[1]; blue = opacity1 * currentEmitor.color[2] + opacity2 * nextEmitor.color[2]; palette[i][0] = (int)red; palette[i][1] = (int)green; palette[i][2] = (int)blue; } } }; void main() { int palette[255][3]; ColorEmitor emitors[3]; emitors[0].offset = 0; emitors[0].color[0] = 255; emitors[0].color[1] = 0; emitors[0].color[2] = 0; emitors[1].offset = 100; emitors[1].color[0] = 128; emitors[1].color[1] = 128; emitors[1].color[2] = 255; emitors[2].offset = 255; emitors[2].color[0] = 255; emitors[2].color[1] = 0; emitors[2].color[2] = 255; PaletteFactory::generate(emitors, 3, palette, 255); for(int i = 0; i < 255; i++) { printf("#%d %d %d %d\n", i, palette[i][0], palette[i][1], palette[i][2]); } scanf("%d"); }