#include "Logger.hpp" #include #include #include #include #include #include "Attractor.hpp" #include "Canvas.hpp" #include "Projector.hpp" #include "canvae/PNG.hpp" #include "ostream_helpers.h" #include "defines.hpp" #include "AwesomeAttractorConfig.h" int verbose; void showHelpText() { std::cout << "Awesome Attractor, version " __DATE__ "\n" "Usage: AwesomeAttractor [OPTION]* [FILE]\n" "Optons:\n" " -h, --help Shows this help\n" " -q quiet mode\n" " -v verbose mode\n" " -V loud mode\n" " -W N Sets width of output image (1024)\n" " -H N Sets height of output image (1024)\n" " -I N Sets number of milions of iterations (100)\n" " -R Random attractor (no file will be read)\n" << std::endl; exit(0); } int main(int argc, char* argv[]) { verbose = 0; std::string attractorFile = ""; std::string output_path = "render/"; bool generate_random = false; unsigned int iterations = DEFAULT_ITERATIONS; unsigned int width = DEFAULT_WIDTH; unsigned int height = DEFAULT_HEIGHT; srand(time(0)); if(argc <= 1) { showHelpText(); } for(int i = 1; i < argc; ++i) { if(strcmp(argv[i], "-v") == 0) { verbose = 1; } else if(strcmp(argv[i], "-V") == 0) { verbose = 3; } else if(strcmp(argv[i], "-q") == 0) { verbose = -1; } else if(strcmp(argv[i], "--help") == 0) { showHelpText(); } else if(strcmp(argv[i], "-h") == 0) { showHelpText(); } else if(strcmp(argv[i], "-W") == 0) { width = atoi(argv[++i]); } else if(strcmp(argv[i], "-H") == 0) { height = atoi(argv[++i]); } else if(strcmp(argv[i], "-I") == 0) { iterations = atoi(argv[++i]); } else if(strcmp(argv[i], "-P") == 0) { output_path = argv[++i]; } else if(strcmp(argv[i], "-R") == 0) { generate_random = true; } else { attractorFile = argv[i]; } } LogInfo("Awesome Attractor, version %s\n", __DATE__); Attractor* my_attractor_ptr = 0; if(attractorFile != "") my_attractor_ptr = new Attractor(attractorFile); else if(generate_random) my_attractor_ptr = new Attractor(); if(my_attractor_ptr == 0){ LogError("Nothing todo\n"); exit(0); } Attractor& myAttractor = *my_attractor_ptr; myAttractor.projector->canvas = new PNG(width, height, 1); myAttractor.init_range(); LogInfo("\nRendering\n"); clock_t start, end; start = clock(); for(unsigned int j = 1; j <= iterations; ++j) { for(unsigned int i = 0; i < 1000000; ++i) { myAttractor.iterate(); myAttractor.plot(); } sleep(1); if(verbose >= 0) { std::cout << "\r" << j << " out of " << iterations << " done." << std::flush; } } end = clock(); double totalIterations = 1000000.0*iterations; double totalTime = ((double)(end-start)/(double)(CLOCKS_PER_SEC)); LogInfo("\nTotal clock time: %f\n", totalTime); LogMoreInfo("Average iterations per second: %f\n\n", totalIterations/totalTime); // saving output char filename[256]; time_t t = time(0); struct tm* lt = localtime(&t); int r = rand() % 10; sprintf(filename, (output_path+"attractor_%04d-%02d-%02d_%02d-%02d-%02d-%01d").c_str(), lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec, r); start = clock(); myAttractor.projector->canvas->output_file(filename); end = clock(); totalTime = ((double)(end-start)/(double)(CLOCKS_PER_SEC)); LogInfo("Total clock time for writing png: %f\n", totalTime); std::ofstream file(std::string(filename)+".stf"); file << myAttractor.stf_output() << std::endl; delete my_attractor_ptr; return 0; }