41#include "ramCanvas.hpp"
42#include "MRMathLINM.hpp"
43#include "MRMathIVL.hpp"
46const int CSIZE = 2048;
47const int MAXITR = 2048;
48const double BALL = 100;
51double theValues[CSIZE][CSIZE];
53double ranges[5][4] = { { -2.0, 1.0, -1.5, 1.5 },
54 { -0.12, -0.03, -0.92, -0.81 },
55 { 0.0353469, 0.5353469, 0.1153845, 0.6153845 },
56 { -1.5, -1.0, -0.5, 0.0 },
57 { 0.0353469, 0.5353469, 0.1153845, 0.6153845 }
61enum class whyStop { OUTSET,
68 std::chrono::time_point<std::chrono::system_clock> startTime = std::chrono::system_clock::now();
69 mjr::ramCanvas3c8b potRamCanvas(CSIZE, CSIZE), distRamCanvas(CSIZE, CSIZE);
70 mjr::ramCanvas3c8b::colorType theColor;
71 double lightHeight = 1.125;
72 double lightAngle = std::numbers::pi/4;
73 std::complex<double> lightDirection = exp(lightAngle*std::complex<double>(0,1));
76 for(
int i=0; i<3; i++) {
78 potRamCanvas.newRealCoords(ranges[i][0], ranges[i][1], ranges[i][2], ranges[i][3]);
79 potRamCanvas.clrCanvasToBlack();
81 std::complex<double> z;
82 for(
int y=0;y<potRamCanvas.getNumPixY();y++) {
84 std::cout <<
" CASE: " << i <<
" LINE: " << y <<
"/" << CSIZE << std::endl;
85 for(
int x=0;x<potRamCanvas.getNumPixX();x++) {
87 double cr = potRamCanvas.int2realX(x);
88 double ci = potRamCanvas.int2realY(y);
89 std::complex<double> c(cr, ci);
90 std::complex<double> dc = 1.0;
91 std::complex<double> pder = dc;
92 std::complex<double> dder1 = 1.0;
93 std::complex<double> dder2 = 0.0;
94 double p = std::abs(c-0.25);
95 if((cr >= p-2.0*p*p+0.25) && std::abs(c+1.0) >= 0.25) {
97 for(count=0; ; count++) {
99 why = whyStop::MAXCOUNT;
102 if(std::abs(z)>BALL) {
103 why = whyStop::OUTSET;
106 dder2 = 2.0 * (dder2 * z + dder1 * dder1);
107 dder1 = 2.0 * dder1 * z + 1.0;
108 pder = pder * 2.0 * z + dc;
112 why = whyStop::INSET;
115 if(why == whyStop::OUTSET) {
116 if(std::abs(pder) < 0.00001) {
117 potRamCanvas.drawPoint(x, y,
"blue");
119 if(std::abs(z) < 0.00001) {
120 potRamCanvas.drawPoint(x, y,
"green");
122 std::complex<double> potNormal = z/pder;
123 potNormal = potNormal/std::abs(potNormal);
124 double potShade = std::real(potNormal * std::conj(lightDirection)) + lightHeight;
125 potShade = mjr::math::ivl::unit_clamp(potShade/(1+lightHeight));
126 potRamCanvas.drawPoint(x, y, mjr::ramCanvas3c8b::colorType(
static_cast<mjr::ramCanvas3c8b::colorChanType
>(mjr::math::linm::scl_real_to_int(potShade, 255)),
127 static_cast<mjr::ramCanvas3c8b::colorChanType
>(mjr::math::linm::scl_real_to_int(potShade, 255)),
128 static_cast<mjr::ramCanvas3c8b::colorChanType
>(mjr::math::linm::scl_real_to_int(potShade, 255))));
132 potRamCanvas.drawPoint(x, y,
"red");
135 if(why == whyStop::OUTSET) {
136 double zLogMod = 0.5*std::log(std::norm(z));
137 std::complex<double> distNormal = z*dder1*((1.0+zLogMod)*std::conj(dder1*dder1)-zLogMod*std::conj(z*dder2));
138 double distNormalAbs = std::abs(distNormal);
139 if(distNormalAbs < 0.00001) {
140 distRamCanvas.drawPoint(x, y,
"blue");
142 distNormal = distNormal/distNormalAbs;
143 double distShade = std::real(distNormal * std::conj(lightDirection)) + lightHeight;
144 distShade = mjr::math::ivl::unit_clamp(distShade/(1+lightHeight));
145 distRamCanvas.drawPoint(x, y, mjr::color3c8b::csCCdiag01::c(
static_cast<mjr::ramCanvas3c8b::csIntType
>(mjr::math::linm::scl_real_to_int(distShade, 255))));
148 distRamCanvas.drawPoint(x, y,
"red");
153 potRamCanvas.writeTIFFfile(
"mandelbrot_emboss_pot_" + std::to_string(i) +
".tiff");
154 distRamCanvas.writeTIFFfile(
"mandelbrot_emboss_dist_" + std::to_string(i) +
".tiff");
156 std::chrono::duration<double> runTime = std::chrono::system_clock::now() - startTime;
157 std::cout <<
"Total Runtime " << runTime.count() <<
" sec" << std::endl;
int main(int argc, char *argv[])