diff --git a/build/CMakeFiles/HLlib.dir/src/HiddenLines.cpp.o b/build/CMakeFiles/HLlib.dir/src/HiddenLines.cpp.o index 98ba2bd..446f934 100644 Binary files a/build/CMakeFiles/HLlib.dir/src/HiddenLines.cpp.o and b/build/CMakeFiles/HLlib.dir/src/HiddenLines.cpp.o differ diff --git a/build/CMakeFiles/linelib.dir/src/Line.cpp.o b/build/CMakeFiles/linelib.dir/src/Line.cpp.o index 661e98f..f96f2df 100644 Binary files a/build/CMakeFiles/linelib.dir/src/Line.cpp.o and b/build/CMakeFiles/linelib.dir/src/Line.cpp.o differ diff --git a/build/libHLlib.a b/build/libHLlib.a index 4307d52..36a817b 100644 Binary files a/build/libHLlib.a and b/build/libHLlib.a differ diff --git a/build/liblinelib.a b/build/liblinelib.a index 2f9a1dc..4d0b3e1 100644 Binary files a/build/liblinelib.a and b/build/liblinelib.a differ diff --git a/build/main b/build/main index 37d4c92..2df4b94 100755 Binary files a/build/main and b/build/main differ diff --git a/src/HiddenLines.cpp b/src/HiddenLines.cpp index a36763b..87a04cc 100644 --- a/src/HiddenLines.cpp +++ b/src/HiddenLines.cpp @@ -220,9 +220,8 @@ std::vector HL::construct_HWprob(){ std::vector merge(std::vector lh, std::vector rh){ std::vector merged; - std::cout << "Merging a left half of size " << lh.size() << " and a right half of size " << rh.size() << std::endl; - auto litr = lh.begin(); - auto ritr = rh.begin(); + std::vector::iterator litr = lh.begin(); + std::vector::iterator ritr = rh.begin(); while(litr != lh.end() && ritr != rh.end()){ Line l1 = *litr; @@ -235,6 +234,8 @@ std::vector merge(std::vector lh, std::vector rh){ if(isec < l1.get_vis_end()){ l1.set_vis_end(isec); l2.set_vis_start(isec); + *litr = l1; + *ritr = l2; } merged.push_back(l1); //merged.push_back(l2); @@ -263,15 +264,25 @@ std::vector merge(std::vector lh, std::vector rh){ if(isec < l1.get_vis_start()){ l1.set_vis_start(isec); l2.set_vis_end(isec); + *litr = l1; + *ritr = l2; } - - //merged.push_back(l1); merged.push_back(l2); ritr++; } } - return merged; + while (litr != lh.end()){ + merged.push_back(*litr); + litr++; + } + while (ritr != rh.end()){ + merged.push_back(*ritr); + ritr++; + } + + //Remove invisible lines + return remove_invis(merged); } std::vector HL::get_lines(){ @@ -286,3 +297,38 @@ void HL::set_sol(std::vector>> &new_sol { sol = new_sol; } + +std::vector remove_invis(std::vector &merged){ + std::vector tmp_vis; + tmp_vis.push_back(merged.front()); + merged.erase(merged.begin()); + tmp_vis.push_back(merged.front()); + merged.erase(merged.begin()); + + int num_vis = 2; + + for(Line line : merged){ + Line last = tmp_vis.at(num_vis -1); + Line seclast = tmp_vis.at(num_vis -2); + + double vis_isec = last.get_isec(seclast); + double merg_isec = line.get_isec(seclast); + while(merg_isec < vis_isec){ + tmp_vis.erase(tmp_vis.begin() + (num_vis -1)); + num_vis--; + + if(num_vis == 1) + break; + + last = tmp_vis.at(num_vis -1); + seclast = tmp_vis.at(num_vis -2); + vis_isec = last.get_isec(seclast); + merg_isec = line.get_isec(seclast); + } + + tmp_vis.push_back(line); + num_vis++; + } + + return tmp_vis; +} diff --git a/src/HiddenLines.h b/src/HiddenLines.h index c8eb947..36dcab3 100644 --- a/src/HiddenLines.h +++ b/src/HiddenLines.h @@ -30,4 +30,6 @@ class HL std::vector merge(std::vector lh, std::vector rh); void print_sol(std::vector& lines); +std::vector remove_invis(std::vector &merged); + diff --git a/src/Line.cpp b/src/Line.cpp index ac40f35..a85a089 100644 --- a/src/Line.cpp +++ b/src/Line.cpp @@ -81,3 +81,8 @@ void Line::set_vis_end(double x) { vis_end = x; } + +double Line::get_isec(Line &l2) +{ + return ((l2.get_ycept() - get_ycept())/(get_slope() - l2.get_slope())); +} diff --git a/src/Line.h b/src/Line.h index 87542d6..eb67ad0 100644 --- a/src/Line.h +++ b/src/Line.h @@ -21,6 +21,8 @@ class Line bool is_vis(); void set_id(); int get_id() const; + double get_isec(Line &l2); + bool operator==(const Line &l2) const; bool operator<(const Line &l2) const;