// // Created on 12.10.21. // #ifndef CPP_GEOMETRIC_H #define CPP_GEOMETRIC_H #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "conflict_graph.h" #include "boi.h" using namespace std; namespace planarity { class GeometricInstance { public: vector edges; }; GeometricInstance parse(string &filename) { fstream fl; fl.open(filename, ios::in); auto instance = GeometricInstance(); long lineResult[4]; if (fl.is_open()) { string ln; while (getline(fl, ln)) { if (ln.length() > 0) { // Trim ln.erase(ln.begin(), std::find_if(ln.begin(), ln.end(), std::not1(std::ptr_fun(std::isspace)))); istringstream iss(ln); string tok; for (long i = 0; getline(iss, tok, ' '); i++) { tok.erase(tok.begin(), std::find_if(tok.begin(), tok.end(), std::not1(std::ptr_fun(std::isspace)))); lineResult[i] = stol(tok); } instance.edges.emplace_back(lineResult[0], lineResult[1], lineResult[2], lineResult[3]); } } } return instance; } ConflictGraph createConflictGraph(GeometricInstance &instance) { auto g = ConflictGraph(instance.edges.size()); // auto alg = BentleyOttmannAnyIntersection(instance.edges); // auto result = alg.find_intersection(); // while(result.has_value()) { // g.addEdge(result.value().segment_index[0], result.value().segment_index[1]); // result = alg.find_intersection(); // //result.value().segment_index // } for (size_t i = 0; i < instance.edges.size(); i++) { auto &e1 = instance.edges[i]; for (size_t j = i + 1; j < instance.edges.size(); j++) { auto &e2 = instance.edges[j]; if (e1.intersects(e2)) { g.addEdge(i, j); } } } return g; } } #endif //CPP_GEOMETRIC_H