Demo/src/MathFunctions.cpp

79 lines
2.0 KiB
C++

#include "vkvm.hpp"
#include <cmath>
#include <internal.hpp>
long double map(long double value, long double inputMin, long double inputMax, long double outputMin, long double outputMax) {
return (value - inputMin) * (outputMax - outputMin) / (inputMax - inputMin) + outputMin;
}
void mandelbrot() {
int width = 800;
int height = 600;
vkvm::setWidth(width);
vkvm::setHeight(height);
vkvm::setRedrawInterval(-1);
long double min = -2.84;
long double max = 1;
int maxIterations = 200;
double factor = 1;
for (int count = 0; count < 50; count++) {
max -= 0.1 * factor;
min += 0.15 * factor;
factor *= 0.9349;
maxIterations += 5;
if(count > 30) {
maxIterations *= 1.02;
}
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
long double xMap = map(x, 0, width, min, max);
long double yMap = map(y, 0, height, min, max);
long double xInitial = xMap;
long double yInitial = yMap;
int n = 0;
for (int i = 0; i < maxIterations; ++i) {
long double x1 = xMap * xMap - yMap * yMap;
long double y1 = 2 * xMap * yMap;
xMap = x1 + xInitial;
yMap = y1 + yInitial;
if ((xMap + yMap) > 2) {
break;
}
n++;
}
int brightness = map(n, 0, maxIterations, 0, 255);
if (n == maxIterations || (brightness < 20)) {
brightness = 0;
}
int red = map(brightness * brightness, 0, 255 * 255, 0, 255);
int green = brightness;
int blue = map(sqrt(brightness), 0, sqrt(255), 0, 255);
vkvm::setPixel(x, y, vkvm::Color(red, green, blue));
}
}
vkvm::callEvent(vkvm::EventType::Redraw);
}
vkvm::setRedrawInterval(500);
}