quickhull/main.cpp

102 lines
3.3 KiB
C++

#include <iostream> // cin, cout
#include <fstream> // ifstream
#include <cstdlib> // srand, rand
#include <ctime> // time
#include <cstring> // strcmp
#include <vector> // 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"
#include "Utility.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 <filename> 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<Point> points;
if (fileRnd.empty()) // generate random numbers
{
std::cout << "generating random numbers..." << std::endl;
//srand(static_cast <unsigned> (time(0)));
srand(static_cast <unsigned> (0)); // fixed seed for testing
for (int i = 0; i < valCount; ++i)
{
float x = OFFSET + static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / (WIDTH - OFFSET)));
float y = OFFSET + static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / (HEIGHT - OFFSET)));
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: sort here, once and for all? xD
sortPoints(points);
for (Point& pt : points)
{
std::cout << "pt: " << pt.x() << ", " << pt.y() << std::endl;
}
if (vis)
{
// TODO: use data as ctor argument? pointer?
// TEST to check SFML coordinate system
points.push_back(Point(0, 0));
Display display;
display.setData(points);
display.show();
}
std::cout << "any key to exit...";
std::cin.get();
return 0;
}