OpenCV3/OpenCV3_MacOS_Fractal/OpenCV3_Project/fractal.cpp
Source: OpenCV3/OpenCV3_MacOS_Fractal/OpenCV3_Project/fractal.cpp
/*
* Acid Cam v2 - OpenCV Edition
* written by Jared Bruni ( http://lostsidedead.com )
* (C) 2016 GPL
*/
#include "fractal.h"
namespace frac {
double paramA = 1.0;//0.519;
double paramB = 0.688;
float zoom_x = 0.5, zoom_y = 0.5, zoom_w = 0.5, zoom_h = 0.5;
double red_color = 3.3;
double green_color = 3.3;
double blue_color = 2.4;
float mod_x = 0.5;
float mod_y = 0.5;
double color_r = 0;
double color_g = 100;
double color_base = 0.0;
float radius = 180.0f;
int dir = 1;
long max_iter = 100;
}
void frac::FractalLogic() {
if(dir == 1) {
paramA -= 0.01f;
if(paramA <= 0.2f) {
dir = 0;
radius -= rand()%50;
if(radius > 60) radius = 180;
}
} else {
paramA += 0.01f;
if(paramA >= 1.0f) dir = 1;
}
}
void frac::DrawFractal(cv::Mat &frame, bool neg)
{
float x1=mod_x-1.0f*zoom_x;
float x2=mod_x+1.0f*zoom_w;
float y1=mod_y-1.0f*zoom_y;
float y2=mod_y+1.0f*zoom_h;
int width=frame.cols, height=frame.rows;
std::complex<double> C (paramA, paramB);
std::complex<double> Z;
int i = 0;
for (int x = 0; x < width; ++x)
{
for (int y = 0; y < height; ++y)
{
//C=std::complex<double>((double)(x*(x2-x1)/width+x1), (double)(y*(y2-y1)/height+y1));
Z=std::complex<double>((double)(x*(x2-x1)/width+x1), (double)(y*(y2-y1)/height+y1));
//Z=std::complex<double>(0, 0);
for (i = 0; i < max_iter && std::abs(Z) < 2; i++)
{
Z=Z*Z+C;
}
cv::Vec3b &cf = frame.at<cv::Vec3b>(y, x);
if(i == max_iter) {
cf[0] = 0;
cf[1] = 0;
cf[2] = 0;
} else {
cf[2] = sin(i*red_color/100)*255;
cf[1] = sin(i*green_color/100)*255;
cf[0] = sin(i*blue_color/100)*255;
}
}
if(x > frame.size().width) break;
}
std::cout << i << ": paramA: " << paramA << " paramB: " << paramB << ": " << radius << "\n";
}