61#include "ramCanvas.hpp"
62#include "MRMathODE.hpp"
64typedef mjr::ramCanvas1c16b drc_t;
65typedef mjr::color3c8b oc_t;
66typedef mjr::ramCanvasPixelFilter::FuncHomoTransform<drc_t, oc_t> hpf_t;
69std::array<drc_t::coordFltType, 3> eq(std::array<drc_t::coordFltType, 3>
const& p) {
70 const drc_t::coordFltType alpha = 0.95;
71 const drc_t::coordFltType beta = 0.7;
72 const drc_t::coordFltType lambda = 0.6;
73 const drc_t::coordFltType omega = 3.5;
74 const drc_t::coordFltType rho = 0.25;
75 const drc_t::coordFltType epsilon = 0.1;
76 return { (p[2] - beta) * p[0] - omega * p[1],
77 omega * p[0] + (p[2] - beta) * p[1],
78 lambda + alpha * p[2] - (p[2]*p[2]*p[2] / 3) - (p[0]*p[0] + p[1]*p[1]) * (1 + rho * p[2]) + epsilon * p[2] * p[0]*p[0]*p[0] };
83 std::chrono::time_point<std::chrono::system_clock> startTime = std::chrono::system_clock::now();
84 const int XSIZ = 7680/1;
85 const int YSIZ = 7680/1;
87 drc_t theRamCanvas(XSIZ, YSIZ, -1.6, 1.6, -0.5, 3);
89 const drc_t::colorChanType maxPtsPerCurve = drc_t::colorType::maxChanVal;
90 const drc_t::coordFltType tDelta = 0.005;
91 const drc_t::coordFltType zOff = 0.75;
92 const drc_t::coordFltType inRad = 0.50;
94# pragma omp parallel for schedule(static,1)
95 for(drc_t::coordIntType yi=0;yi<theRamCanvas.getNumPixY();yi++) {
96 std::cout <<
"Line: " << yi << std::endl;
97 for(drc_t::coordIntType xi=0;xi<theRamCanvas.getNumPixX();xi++) {
98 std::array<drc_t::coordFltType, 3> p {theRamCanvas.int2realX(xi), 0.0, theRamCanvas.int2realY(yi)};
99 for(drc_t::colorChanType i=0;i<maxPtsPerCurve;i++) {
100 std::array<drc_t::coordFltType, 3> p_new = mjr::math::vec::sum(p, mjr::math::ode::rk1<drc_t::coordFltType, 3>(p, eq, tDelta));
101 if (mjr::math::vec::dist2sqr(p_new, {0.0, 0.0, zOff}) < inRad*inRad) {
102 theRamCanvas.drawPoint(xi, yi, i);
109 theRamCanvas.writeRAWfile(
"3da_frac_langford.mrw");
112 theRamCanvas.autoHistStrech();
113 theRamCanvas.writeTIFFfile(
"3da_frac_langford.tiff", hpf_t(theRamCanvas,[](
auto inColor) {
return oc_t::csCCfractal0RYBCW::c(inColor.getC0()); }));
115 std::chrono::duration<double> runTime = std::chrono::system_clock::now() - startTime;
116 std::cout <<
"Total Runtime " << runTime.count() <<
" sec" << std::endl;
int main(int argc, char *argv[])