package skyline;
import java.util.TreeSet;
/**
* Klasse die het algoritme implementeert om een optimale stad te bouwen.
* Het is NIET toegelaten bestaande methodes en/of signaturen te wijzigen, maar
* het staat je vrij naar behoefte methodes en velden toe te voegen.
* @author Timbermont Bouke
**/
public class SkylineSolver{
private BuildingList list;
private double o,l;
private TreeSet<Skyline> set;
/**
* Creeert een nieuwe instantie van SkylineSolver met gegeven
* lijst van Buildings.
* @param list de Buildings die gebruikt moeten worden.
**/
public SkylineSolver(BuildingList list) {
this.list=list;
set=new TreeSet<Skyline>();
set.add(listToSkyline(list));
}
/**
* Geeft een lijst van optimale Skylines terug.
* @param o Vrij in te stellen parameter O uit de opgave
* @param l Vrij in te stellen parameter L uit de opgave
* @param x Maximaal aantal verschuivingen
**/
TreeSet<Skyline> getOptimalSkylines(double o, double l, int x) {
this.o=o;
this.l=l;
return set;
}
/*De volgende methode neemt een skyline en berekend ervan de verhouding
*die aangeeft in hoeverre die skyline ideaal is.
*/
private double verhouding(Skyline s){
double teller=s.getSurface()-Math.min((double)s.getSurface(),o);
double len=s.coords[s.coords.length-2]-s.coords[0];
double noemer=1+len-Math.min(len,l);
return teller/noemer;
}
public static Skyline listToSkyline(BuildingList list){
if(list.size()>1){
BuildingList[] halflist=new BuildingList[2];
halflist[0]=new BuildingList();
halflist[1]=new BuildingList();
int i=0;
for(Building building:list){
halflist[i%2].addBuilding(building);
i++;
}
return Skyline.merge(listToSkyline(halflist[0]),listToSkyline(halflist[1]));
}else{
return new Skyline(list.getBuilding(0));
}
}
}