Это линейное масштабирование. Давайте делать это в 1D. У вас есть пространство экрана (экранные координаты) и пространство изображения (комплексная плоскость, в вашем случае)
- экранное пространство => [0, 255]
- пространство изображения => [-2, 1]
Таким образом, чтобы преобразовать координату X из пространства экрана в пространство изображения X '
X '= (X / 255) * (1 - (-2)) + (-2)
Чтобы сделать его более общим
- экранное пространство => [SMin, SMax]
- пространство изображения => [IMin, IMax]
X '= ((X - SMin) / (SMax - SMin)) * (IMax - IMin) + IMin
В своем коде вы делаете
double newMinRe = MinRe + (Re_factor* x1);
что эквивалентно тому, что я показываю. Но тогда вы делаете
double newMaxRe = MaxRe + (Re_factor* x2);
что не правильно и должно быть
double newMaxRe = MinRe + (Re_factor* x2);
Та же проблема в вашем цикле, она должна быть
for(unsigned y=0; y<ImageHeight; ++y) {
double c_im = MinIm + y*Im_factor;
for(unsigned x=0; x<ImageWidth; ++x) {
double c_re = MinRe + x*Re_factor;
// ComputeMandelbrot();
}
}
Дополнительные детали для дополнительного качества: для правильной выборки пространства изображения я предлагаю это
for(unsigned SX = SMin; x < SMax; ++x) {
double k = (double(SX + 0.5) - SMin) / (SMax - SMin);
double IX = (k * (IMax - IMin)) + IMin;
}
Слагаемое +0,5 - это выборка прямо в середине пикселя ...