package presenter.algorithms.naiv; import model.Line; import model.Point; import presenter.algorithms.Algorithm; import presenter.algorithms.util.FastElementSelector; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. * * @Author: Armin Wolf * @Email: a_wolf28@uni-muenster.de * @Date: 15.09.2017. */ public class NaivRepeatedMedianEstimator implements Algorithm{ private LinkedList lines; private HashMap> slopesPerLine; private HashMap> interceptPerLine; private ArrayList xMedians, yMedians; private Double medianX; private Double medianY; public NaivRepeatedMedianEstimator(LinkedList lines) { this.lines = lines; slopesPerLine = new HashMap<>(); interceptPerLine = new HashMap<>(); xMedians = new ArrayList<>(); yMedians = new ArrayList<>(); } @Override public void run() { //init the List for the slopes for (int j=0;j()); } if (interceptPerLine.get(leq.getId()) == null) { interceptPerLine.put(leq.getId(), new ArrayList<>()); } } //calculate all slopes for each line Point ret; for (int i=0;i list = slopesPerLine.get(l); int size = list.size() / 2; if (size > 0) { Double medianX = FastElementSelector.randomizedSelect(list, size); xMedians.add(medianX); } } //calculate median of slopes for each line for (String l : interceptPerLine.keySet()) { ArrayList list = interceptPerLine.get(l); int size = list.size() / 2; if (size > 0) { Double medianY = FastElementSelector.randomizedSelect(list, size); yMedians.add(medianY); } } medianX = FastElementSelector.randomizedSelect(xMedians, xMedians.size()/2); medianY = FastElementSelector.randomizedSelect(yMedians, yMedians.size()/2); System.out.printf("Naiv RM: %6.2f * x + %6.2f \n", medianX, medianY); } @Override public void getResult() { } private Point calculateSlope(Line lineA, Line lineB){ Double xi; Double xj; Double yi; Double yj; if (lineB.getM() > lineA.getM()){ xi = lineA.getM(); yi = lineA.getB(); xj = lineB.getM(); yj = lineB.getB(); } else { xj = lineA.getM(); yj = lineA.getB(); xi = lineB.getM(); yi = lineB.getB(); } Double m = (yj - yi) / (xj -xi); Double b = ((xj * yi) - (xi * yj)) / (xj - xi); return new Point(m,b); } public Double getM() { return medianX * -1; } public Double getB() { return medianY * -1; } }