Remove invisible line function

This commit is contained in:
Noah L. Schrick 2022-03-09 15:15:22 -06:00
parent 4622be5121
commit d53ee2d03d
9 changed files with 61 additions and 6 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -220,9 +220,8 @@ std::vector<Line> HL::construct_HWprob(){
std::vector<Line> merge(std::vector<Line> lh, std::vector<Line> rh){ std::vector<Line> merge(std::vector<Line> lh, std::vector<Line> rh){
std::vector<Line> merged; std::vector<Line> merged;
std::cout << "Merging a left half of size " << lh.size() << " and a right half of size " << rh.size() << std::endl; std::vector<Line>::iterator litr = lh.begin();
auto litr = lh.begin(); std::vector<Line>::iterator ritr = rh.begin();
auto ritr = rh.begin();
while(litr != lh.end() && ritr != rh.end()){ while(litr != lh.end() && ritr != rh.end()){
Line l1 = *litr; Line l1 = *litr;
@ -235,6 +234,8 @@ std::vector<Line> merge(std::vector<Line> lh, std::vector<Line> rh){
if(isec < l1.get_vis_end()){ if(isec < l1.get_vis_end()){
l1.set_vis_end(isec); l1.set_vis_end(isec);
l2.set_vis_start(isec); l2.set_vis_start(isec);
*litr = l1;
*ritr = l2;
} }
merged.push_back(l1); merged.push_back(l1);
//merged.push_back(l2); //merged.push_back(l2);
@ -263,15 +264,25 @@ std::vector<Line> merge(std::vector<Line> lh, std::vector<Line> rh){
if(isec < l1.get_vis_start()){ if(isec < l1.get_vis_start()){
l1.set_vis_start(isec); l1.set_vis_start(isec);
l2.set_vis_end(isec); l2.set_vis_end(isec);
*litr = l1;
*ritr = l2;
} }
//merged.push_back(l1);
merged.push_back(l2); merged.push_back(l2);
ritr++; 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<Line> HL::get_lines(){ std::vector<Line> HL::get_lines(){
@ -286,3 +297,38 @@ void HL::set_sol(std::vector<std::pair<int, std::pair<double, double>>> &new_sol
{ {
sol = new_sol; sol = new_sol;
} }
std::vector<Line> remove_invis(std::vector<Line> &merged){
std::vector<Line> 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;
}

View File

@ -30,4 +30,6 @@ class HL
std::vector<Line> merge(std::vector<Line> lh, std::vector<Line> rh); std::vector<Line> merge(std::vector<Line> lh, std::vector<Line> rh);
void print_sol(std::vector<Line>& lines); void print_sol(std::vector<Line>& lines);
std::vector<Line> remove_invis(std::vector<Line> &merged);

View File

@ -81,3 +81,8 @@ void Line::set_vis_end(double x)
{ {
vis_end = x; vis_end = x;
} }
double Line::get_isec(Line &l2)
{
return ((l2.get_ycept() - get_ycept())/(get_slope() - l2.get_slope()));
}

View File

@ -21,6 +21,8 @@ class Line
bool is_vis(); bool is_vis();
void set_id(); void set_id();
int get_id() const; int get_id() const;
double get_isec(Line &l2);
bool operator==(const Line &l2) const; bool operator==(const Line &l2) const;
bool operator<(const Line &l2) const; bool operator<(const Line &l2) const;