#include // cin, cout #include // ifstream #include // srand, rand #include // time #include // strcmp #include // TODO: or use arrays for maximum performance? #include "Display.h" #include "Point.h" // TODO: check if there is a usable SFML or c++ class #include "Timing.h" // TODOs: // - use SFML vec2 instead of Point class // - calc min and max points for x, y // *) just a loop and save/override points -> maybe in Data Block? // *) std::minmax_element for x, y -> not saving just temp draw // https://en.cppreference.com/w/cpp/algorithm/minmax_element // - actual algorithm :p // - architecture: // # vis in own thread, calls "lib" functions? // # seperate implementation for vis and perf? int main (int argc, char **argv) { // read program arguments // -v mode with enabled visualization // -f read random numbers from file // TODO: care a little more <3 std::string fileRnd = ""; bool vis = false; for (int i = 0; i < argc; ++i) { if (strcmp(argv[i], "-v") == 0) vis = true; else if (strcmp(argv[i], "-f") == 0) fileRnd = argv[i + 1]; } int valCount = 10; std::vector points; if (fileRnd.empty()) // generate random numbers { std::cout << "generating random numbers..." << std::endl; //srand(static_cast (time(0))); srand(static_cast (0)); // fixed seed for testing for (int i = 0; i < valCount; ++i) { float x = static_cast (rand()) / (static_cast (RAND_MAX / WIDTH)); float y = static_cast (rand()) / (static_cast (RAND_MAX / HEIGHT)); points.push_back(Point(x, y)); } } else // read random numbers { std::cout << "reading random numbers from file: " << fileRnd << "..." << std::endl; std::ifstream in(fileRnd.c_str()); if (in.is_open()) { std::string line; std::getline(in, line); // get first line for explizit valueCount valCount = std::stoi(line); for (int i = 0; i < valCount; ++i) { getline(in, line); //getline(in, line, ','); // could also be used slightly different but includes newlines :/ size_t pos = line.find(','); if (pos != std::string::npos) { float x = std::stof(line.substr(0, pos)); float y = std::stof(line.substr(pos + 1)); points.push_back(Point(x, y)); } else { throw "invalid format!"; } } } } // TODO: need sort here? for (Point& pt : points) { std::cout << "pt: " << pt.x() << ", " << pt.y() << std::endl; } if (vis) { // TODO: use data as ctor argument? pointer? Display display; display.setData(points); display.show(); } std::cout << "any key to exit..."; std::cin.get(); return 0; }