Юля установила цвета c ++ - PullRequest
0 голосов
/ 13 ноября 2018

В настоящее время я работаю над заданием, в котором я должен создать набор Julia на C ++ в последовательном, параллельном и OpenCL.Мне удалось создать изображение, но то, как я использовал цвета, очень неэффективно, есть какие-нибудь идеи о том, как я могу улучшить цветовую часть моего кода на данный момент?ниже приведен последовательный раздел моего кода, любая помощь в улучшении того, как я установил цвета, будет высоко ценится

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 
}

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

В дополнение к отличной идее использования справочной таблицы, вы также можете интерполировать значения в таблице, вместо того, чтобы просто выполнить операцию модуля для ее выбора.Таким образом, у вас может быть 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 для каждого цветового канала (красного, зеленого и синего).

0 голосов
/ 13 ноября 2018

Насколько я помню, генераторы фракталов с начала 90-х (например: Fractint ) использовали индекс итерации-спасения в качестве индекса в таблицу из 256 красно-зелено-синих цветов (это былообщий предел, так как большинство дисплеев в любом случае были ограничены цветовой палитрой такого размера.)

Так что, возможно, вы могли бы определить таблицу цветов RGB, а затем посмотреть на них точно, как вы выполняете colors[i % 5]; теперь, за исключением того, что он вывел бы RGB-тройку colours[i % TABLE_SIZE].red, .green, .blue.Я думаю, что было бы лучше загрузить вашу палитру из отдельного файла.

Я всегда задавался вопросом, как может выглядеть фрактал с цветовой палитрой из 1000 записей.Я думаю, это довольно симпатично.

EDIT: IIRC Fractint имел режим редактирования палитры и мог сохранять их в файлы.

...