File:Mandelbrot Set Image 08.jpg
| Uploaded by | Aokoroko |
|---|---|
| Upload date | 2026-07-05T16:39:02Z |
| MIME type | image/jpeg |
| Dimensions | 2160 × 2160 px |
| File size | 6.4 MB |
Summary
| Description |
Русский: Фрагмент множества Мандельброта, координаты центра: -0.12442258427175, 0.83909934452202, ширина изображения 0.0000000001
English: Fragment of the Mandelbrot set, coordinates: -0.12442258427175, 0.83909934452202, width 0.0000000001 |
| Date | |
| Source | Own work |
| Author | Aokoroko |
| Other versions |
|
| Source code (C++) |
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <cstdint>
#include <string>
#include <cstdio>
#include <iomanip>
using namespace std;
const long double PI = 3.14159265358979323846264338327950288L;
#pragma pack(push, 1)
struct BMPHeader {
uint16_t type{0x4D42};
uint32_t size{0};
uint16_t reserved1{0};
uint16_t reserved2{0};
uint32_t offBits{54};
uint32_t structSize{40};
int32_t width{0};
int32_t height{0};
uint16_t planes{1};
uint16_t bitCount{24};
uint32_t compression{0};
uint32_t sizeImage{0};
int32_t xpelsPerMeter{2834};
int32_t ypelsPerMeter{2834};
uint32_t clrUsed{0};
uint32_t clrImportant{0};
};
#pragma pack(pop)
int main() {
long double rx = stold("-0.12442258427175");
long double ry = stold("0.83909934452202");
long double sz = stold("0.0000000001");
const int targetW = 2160;
const int targetH = 2160;
const int scale = 8;
const int rawW = targetW * scale;
const int rawH = targetH * scale;
const int frame = 34;
const int max_iter = 50000;
long double step_d = sz / (long double)rawW;
uint8_t pal[256][3];
for (int a = 0; a < 255; ++a) {
pal[a][0] = (uint8_t)round(127.0 + 127.0 * cos(2.0 * PI * a / 255.0)); // Blue
pal[a][1] = (uint8_t)round(127.0 + 127.0 * sin(2.0 * PI * a / 255.0)); // Green
pal[a][2] = (uint8_t)round(127.0 + 127.0 * sin(2.0 * PI * a / 255.0)); // Red
}
pal[255][0] = 255; pal[255][1] = 255; pal[255][2] = 255;
cout << "Step 1: Rendering Mandelbrot using 80-bit long double (" << targetW << "x" << targetH << ")..." << endl;
int rowSize = (targetW * 3 + 3) & ~3;
BMPHeader header;
header.width = targetW;
header.height = targetH;
header.sizeImage = rowSize * targetH;
header.size = header.sizeImage + 54;
ofstream f("Mandelbrot Set Image 08.bmp", ios::binary);
f.write(reinterpret_cast<char*>(&header), 54);
#pragma omp parallel for schedule(dynamic)
for (int y = 0; y < targetH; ++y) {
vector<uint8_t> threadRowBuffer(rowSize, 0);
for (int x = 0; x < targetW; ++x) {
uint32_t rSum = 0, gSum = 0, bSum = 0;
for (int j = 0; j < scale; ++j) {
size_t b = (size_t)y * scale + j;
long double c_im = ry + (long double)((long long)b - (rawH / 2)) * step_d;
for (int i = 0; i < scale; ++i) {
size_t a = (size_t)x * scale + i;
long double c_re = rx + (long double)((long long)a - (rawW / 2)) * step_d;
long double z_re = 0.0L;
long double z_im = 0.0L;
int iter = 0;
while (iter < max_iter) {
long double z_re2 = z_re * z_re;
long double z_im2 = z_im * z_im;
if ((z_re2 + z_im2) >= 40000.0L) {
break;
}
z_im = 2.0L * z_re * z_im + c_im;
z_re = z_re2 - z_im2 + c_re;
iter++;
}
int final_t = max_iter - iter;
uint8_t t = (final_t == 0) ? 255 : (uint8_t)(final_t % 254);
int colorIdx = (t == 255) ? 255 : (t - frame + 255) % 255;
bSum += pal[colorIdx][0];
gSum += pal[colorIdx][1];
rSum += pal[colorIdx][2];
}
}
int outIdx = x * 3;
threadRowBuffer[outIdx + 0] = (uint8_t)(bSum >> 6);
threadRowBuffer[outIdx + 1] = (uint8_t)(gSum >> 6);
threadRowBuffer[outIdx + 2] = (uint8_t)(rSum >> 6);
}
#pragma omp critical
{
f.seekp(54 + (streamoff)y * rowSize);
f.write(reinterpret_cast<const char*>(threadRowBuffer.data()), rowSize);
}
if ((y + 1) % 10 == 0 || y == targetH - 1) {
#pragma omp critical
{
cout << "Progress: " << (y + 1) << "/" << targetH << "\r" << flush;
}
}
}
f.close();
cout << "\nDone! Mandelbrot Set Image 08.bmp successfully saved." << endl;
return 0;
}
|
Technical details
- Method: 80-bit long double precision.
- True 8x8 SSAA: Pristine, anti-aliased image quality with 64 independent samples per pixel.
- OpenMP Multi-threading: High-speed parallel computing to maximize CPU utilization.
- Software: C++ (compiled with g++), GNU C++ Compiler.
Related images
-
Previous step
-
Next step
Notes
- Rosetta Code: https://rosettacode.org/wiki/Mandelbrot_set#High-Fidelity_C++_Implementation_(80-bit,_64x_SSAA,_OpenMP)
- github: https://github.com/Divetoxx/Mandelbrot
Licensing
I, the copyright holder of this work, hereby publish it under the following license:
| This file is made available under the Creative Commons CC0 1.0 Universal Public Domain Dedication. | |
| The person who associated a work with this deed has dedicated the work to the public domain by waiving all of their rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission.
|
Category:CC-Zero
Category:Complex quadratic map
Category:Creative Commons CC0 1.0 Universal Public Domain Dedication with different SDC copyright license
Category:Files by User:Aokoroko
Category:Fractal art
Category:Fractals created by User: Aokoroko
Category:Images with C++ source code
Category:Mandelbrot sets
Category:Mandelbrot sets (detail)
Category:Misiurewicz point
Category:Near-copies of the Mandelbrot set within itself
Category:Self-published work