Raw File
WeakVisibility.cpp
#include "pch.h"
#include "ArrangementFunctions.h"
#include "IOHandling.h"
#include "IPSolver.h"
#include "WeakVisibility.h"
#include "Convex_expansion_visibility_2_temp.h"

typedef Convex_expansion_visibility_2 CEV;

class WeakVisibilityImpl {
public:
	WeakVisibility* wrapper;
	CEV visibility;
	Arrangement_2 polygonBoundary;
	Arrangement_2 weakVisPolygon;


	WeakVisibilityImpl(WeakVisibility* wrapper) {
		this->wrapper = wrapper;
	}

	bool initialize() {
		IOHandling::GetTestPolygon(wrapper->testPolygonID, 20, false, polygonBoundary);
		IOHandling::SetDimensions(polygonBoundary);
		visibility.attach(polygonBoundary);
		
		return IOHandling::DrawWeakVis(visibility, testPolygonNames[wrapper->testPolygonID] + "/" + wrapper->initSVGString);			
	}

	bool compute() {
		vector<Segment_2> testFace;
		if (wrapper->testPolygonID == 0) {
			//diagonal intersects face, but no endpoints in face
			//testFace = { Segment_2(Point_2(35,30), Point_2(53,51)),  Segment_2(Point_2(53,51), Point_2(40,43)),
				//Segment_2(Point_2(40,43), Point_2(35,37)), Segment_2(Point_2(35,37), Point_2(35,30)) };

			//testFace = { Segment_2(Point_2(35,30),Point_2(37,39)),
				//Segment_2(Point_2(37,39), Point_2(35,37)), Segment_2(Point_2(35,37), Point_2(35,30)) };

			//incredibly glitchy face (sees too much):
			/*testFace = { Segment_2(Point_2(40,37),Point_2(40,30)),
				Segment_2(Point_2(40,30), Point_2(48.75, 37)), Segment_2(Point_2(48.75, 37), Point_2(40,37)) };*/

			//something wrong with beta tangents
		/*	testFace = {
				Segment_2(Point_2(29.230769230769234,65),Point_2(16,65)),
				Segment_2(Point_2(16,65), Point_2(15, 48.653846153846160)),
				Segment_2(Point_2(15, 48.653846153846160), Point_2(36,43)),
				Segment_2(Point_2(36,43), Point_2(29.230769230769234,65))				
			};*/

			//something wrong with beta tangents volume 2
			testFace = {
				Segment_2(Point_2(29.230769230769234,65),Point_2(16,65)),
				Segment_2(Point_2(16,65), Point_2(15, 48.653846153846160)),
				Segment_2(Point_2(15, 48.653846153846160), Point_2(36,43)),
				Segment_2(Point_2(36,43), Point_2(29.230769230769234,65))
			};

			//Some strange triangle?
			/*testFace = {
				Segment_2(Point_2(30,35),Point_2(30,37)),
				Segment_2(Point_2(30,37), Point_2(27.647058823529413, 36.176470588235290)),
				Segment_2(Point_2(27.647058823529413, 36.176470588235290), Point_2(30,35))
			};*/

			//Sees too leetle
			/*testFace = {
				Segment_2(Point_2(15,65),Point_2(29.230769230769234, 65)),
				Segment_2(Point_2(29.230769230769234, 65), Point_2(24.615384615384613, 80)),
				Segment_2(Point_2(24.615384615384613, 80), Point_2(15,80)),
				Segment_2(Point_2(15,80), Point_2(15,65))
			};*/

			//large face, diagonal end points in face (boundary)
			//testFace = { Segment_2(Point_2(40,30), Point_2(65,50)), Segment_2(Point_2(65,50), Point_2(36,43)),
			//Segment_2(Point_2(36,43), Point_2(30,37)), Segment_2( Point_2(30,37),Point_2(40,30) )};
		}
		else if (wrapper->testPolygonID == 2) {

			testFace = { Segment_2(Point_2(20,33), Point_2(20,33)),  Segment_2(Point_2(40,33), Point_2(40,42)),
				Segment_2(Point_2(40,42), Point_2(20,42)), Segment_2(Point_2(20,42), Point_2(20,33)) };
		} 
		else if (wrapper->testPolygonID == 3) {
			testFace = {
				Segment_2(Point_2(65,50) ,Point_2(16,65)),
				Segment_2(Point_2(16,65), Point_2(15, 48.653846153846160)),
				Segment_2(Point_2(15, 48.653846153846160), Point_2(65,50)),
			};
		}
		else if (wrapper->testPolygonID == 4) {
			testFace = {
				Segment_2(Point_2(2,0), Point_2(2, -0.63157894736842102)),
				Segment_2(Point_2(2, -0.63157894736842102), Point_2(0, -0.63157894736842102)),
				Segment_2(Point_2(0, -0.63157894736842102), Point_2(0, -0.47058823529411764)),
				Segment_2(Point_2(0, -0.47058823529411764), Point_2(2, 0)),
			};
		}
		else if (wrapper->testPolygonID == 6) { //P7

			testFace = { Segment_2(Point_2(22,42), Point_2(28,42)),  Segment_2(Point_2(28,42), Point_2(38,58)),
				Segment_2(Point_2(38,58), Point_2(12,58)), Segment_2(Point_2(12,58), Point_2(22,42)) };
		}

		visibility.compute_visibility(testFace, weakVisPolygon);

		for (int i = 0; i < visibility.vis_polygons.size(); i++) 
			IOHandling::DrawWeakVis(visibility, testPolygonNames[wrapper->testPolygonID] + "/" + wrapper->intermediateSVGString + to_string(i),
				testFace, {}, i);

		wrapper->intermediateSteps = visibility.vis_polygons.size();

		IOHandling::DrawWeakVis(
			visibility, testPolygonNames[wrapper->testPolygonID] + "/" + wrapper->intermediateSVGString + to_string(wrapper->intermediateSteps),
			testFace, arrangementToPolygon(weakVisPolygon).container());
		wrapper->intermediateSteps++;
		return true;
	}

};

WeakVisibility::WeakVisibility(int tId) {
	this->testPolygonID = tId;
	this->saveIntermediate = saveIntermediate;
	this->implementation = wvPTR(new WeakVisibilityImpl(this));
	//this->implementation = new WeakVisibilityImpl(this);
	this->intermediateSteps = 0;
}

bool WeakVisibility::initialize() {
	return implementation->initialize();
}

bool WeakVisibility::compute() {
	implementation->compute();
	//delete this->implementation;
	return true;
}
back to top