我目前正在做一个作业,我必须在C ++中以顺序,并行和OpenCL生成Julia集。我设法产生图像,但是我使用颜色的方式对目前如何改善代码的颜色部分没有任何想法?以下是我代码的顺序部分,对于改善颜色设置的任何帮助将不胜感激
void sequentialJulia(const complex<float> C, const UINT size = 1000,
const UINT MAX_ITERATIONS = 100, const float limit = 1.7f) {
int start_s = clock();// starts the timer
// Setup output image
fipImage outputImage;
outputImage = fipImage(FIT_BITMAP, size, size, 24);
UINT bytesPerElement = 3;
BYTE* outputBuffer = outputImage.accessPixels();
vector<int> colors{ 100, 140, 180, 220, 225 };// this sets the intsity of the image, if i was to remove 225 the image would be darker
//vector<int> colors{9, 19, 29, 39, 49 }; //THIS DOESNT WORK DO NOT UNCOMMENT
//RGBQUAD color;
complex<float> Z;
std::cout << "Processing...\n";
for (UINT y = 0; y < size; y++) {
//tracking progress;
cout << y * 100 / size << "%\r";
cout.flush();
for (UINT x = 0; x < size; x++) {
Z = complex<float>(-limit + 2.0f * limit / size * x, -limit + 2.0f * limit / size * y);
UINT i;
for (i = 0; i < MAX_ITERATIONS; i++) {
Z = Z * Z + C;
if (abs(Z) > 2.0f) break;
}
if (i < MAX_ITERATIONS ) { //only changing red byte
// bytes per element 9 = blue
// bytes per element 2 = red
// bytes per element 7 = green
outputBuffer[( y * size + x) * bytesPerElement + 9] = colors[i % 5];
}
}
}
cout << "Saving image...\n";
ostringstream name;
name << "..\\Images\\" << C << " size=" << size << " mIterations=" << MAX_ITERATIONS << " sequential19.png" ;
cout << "saving in: " << name.str().c_str() << "\n";
outputImage.save(name.str().c_str());
cout << "...done\n\n";
int stop_s = clock();
cout << "time: " << (stop_s - start_s) / double(CLOCKS_PER_SEC) * 1000 << endl;// stops the timer once code has executed
}
答案 0 :(得分:2)
据我所知,90年代初的分形生成器(例如:Fractint)使用迭代救援指数作为256种红绿蓝颜色表的索引(这是一个常见的限制,因为当时的大多数显示器无论如何都限于这种尺寸的调色板。)
因此,也许您可以定义一个RGB颜色表,然后在这些表上查找您现在如何执行colors[i % 5];
,除非它会输出一个colours[i % TABLE_SIZE].red
,{{1 }},.green
。我认为最好从一个单独的文件中加载调色板。
我一直想知道带有1000个条目的调色板的分形是什么样的。我觉得挺漂亮的。
编辑:IIRC Fractint具有调色板编辑模式,可以将它们保存到文件中。
答案 1 :(得分:0)
除了使用查找表的绝妙主意外,您还可以在表中的值之间进行插值,而不仅仅是进行模运算以选择一个。因此,您可能有一个5色查找表,但可以通过在5种颜色之间进行线性插值将其应用于数百或数千次迭代。例如,如果您的最大迭代次数为256,而当前计算需要168次迭代才能转为无穷大,并且您有5种颜色的查找表,则可以这样做来获得颜色:
float lookupVal = static_cast<float>((colors.size - 1) * i) / MAX_ITERATIONS;
int lookupIndex = static_cast<int>(floor(lookupValue));
float fraction = lookupVal - floor(lookupVal);
float colorF = static_cast<float>(colors [ lookupIndex ]) + fraction * static_cast<float>(colors [ lookupIndex + 1 ] - colors [ lookupIndex ]);
uint8_t color = static_cast<uint8_t>(colorF);
如果查找表具有RGB值而不是灰度值,则需要为每个颜色通道(红色,绿色和蓝色)计算colorF
和color
。