https://github.com/ASchidler/coloring
Raw File
Tip revision: dd03517187447fd44cfd9f03db6ab7313a21a64a authored by Andre Schidler on 14 March 2022, 12:24:58 UTC
Initial commit
Tip revision: dd03517
geometric.h
//
// Created on 12.10.21.
//

#ifndef CPP_GEOMETRIC_H
#define CPP_GEOMETRIC_H

#pragma once
#include <queue>
#include <vector>
#include <map>
#include <unordered_map>
#include <optional>
#include <limits>
#include <exception>
#include <stdexcept>
#include <tuple>
#include <utility>
#include <algorithm>
#include <cassert>
#include <memory>
#include <random>
#include <string>
#include <iostream>
#include <boost/algorithm/string.hpp>
#include <fstream>
#include <sstream>
#include "conflict_graph.h"
#include "boi.h"

using namespace std;

namespace planarity {
    class GeometricInstance {
    public:
        vector<Line> 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<int, int>(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<int, int>(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
back to top