package de.wwwu.awolf.presenter.data.generator;

import de.wwwu.awolf.model.Line;

import java.util.*;
import java.util.concurrent.Callable;

import static de.wwwu.awolf.presenter.data.generator.DatasetGenerator.generateDataLines;

/**
 * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
 *
 * @Author: Armin Wolf
 * @Email: a_wolf28@uni-muenster.de
 * @Date: 01.08.2017.
 */
public class CircleDatasetGenerator implements Callable<Set<Line>> {

    private final int size;

    public CircleDatasetGenerator(int size) {
        this.size = size;
    }

    /**
     * Generiert einen Datensatz des typen: Gerade mit zirkulärer Störung. Zuerst wird die
     * zirkuläre Störung zu der Liste der (dualen-)Geraden hinzugefügt danach wird die wrapper Methode
     * <code>generateDataLines()</code> aufgerufen.
     *
     * @return Liste der Geraden
     */
    @Override
    public Set<Line> call() throws Exception {
        Set<Line> lines = new HashSet<>();

        double from = 0;
        double to = Math.PI * 5;
        //obere Grenze für die neuen Punkte
        int n = size / 2 + lines.size();

        //calculate the distance between every two points
        double distance = (to - from) / ((double) n);

        //create points
        double currentDistance = from;
        //an die aktuelle Liste dranhängen
        for (int i = lines.size(); i < n; i++) {
            double x = Math.cos(currentDistance);
            double y = Math.sin(currentDistance);

            Line line = new Line(x, y);
            line.setId(i + "");
            lines.add(line);

            //distance for the next iteration
            currentDistance += distance;
        }

        int generateSize = (int) (size * 0.5);

        return generateDataLines(lines, generateSize);
    }
}

