|
|
|
|
|
|
|
|
|
|
|
|
|
|
import android.location.Location; |
|
|
import android.location.Location; |
|
|
import android.os.Build; |
|
|
import android.os.Build; |
|
|
|
|
|
import android.util.Log; |
|
|
|
|
|
|
|
|
import androidx.annotation.RequiresApi; |
|
|
import androidx.annotation.RequiresApi; |
|
|
import com.google.common.collect.ImmutableSet; |
|
|
import com.google.common.collect.ImmutableSet; |
|
|
import com.google.common.collect.Sets; |
|
|
import com.google.common.collect.Sets; |
|
|
|
|
|
|
|
|
import de.edotzlaff.detection.detektion.Detektionssignal; |
|
|
import de.edotzlaff.detection.detektion.Detektionssignal; |
|
|
import de.edotzlaff.detection.detektion.Epizentrum; |
|
|
import de.edotzlaff.detection.detektion.Epizentrum; |
|
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Koordinaten; |
|
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Koordinaten; |
|
|
|
|
|
|
|
|
public class EpizentrumRechnung { |
|
|
public class EpizentrumRechnung { |
|
|
|
|
|
|
|
|
//ToDo Schrittweite und Abstand auf Szenario anpassen |
|
|
//ToDo Schrittweite und Abstand auf Szenario anpassen |
|
|
private static final double SCHRITTWEITE = 0.0001; |
|
|
|
|
|
private static final double MAX_ABSTAND = 0.001; |
|
|
|
|
|
private static final int DOUBLESTELLEN = 8; |
|
|
|
|
|
|
|
|
private static final double SCHRITTWEITE = 0.000050; |
|
|
|
|
|
private static final double MAX_ABSTAND = 0.000058; |
|
|
|
|
|
private static final int DOUBLESTELLEN = 24; |
|
|
|
|
|
private static final int SCHLEIFENDURCHLAUFTE = 5000; |
|
|
|
|
|
|
|
|
|
|
|
private static final String TAG = "EPIZENTRUMRECHNUNG"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@RequiresApi(api = Build.VERSION_CODES.O) |
|
|
@RequiresApi(api = Build.VERSION_CODES.O) |
|
|
public ArrayList<Endpunkt> initEndpunkte(ArrayList<Detektionssignal> detektionssignal) { |
|
|
|
|
|
Detektionssignal nahegelegensteMessung = detektionssignal.get(0); |
|
|
|
|
|
|
|
|
public ArrayList<Endpunkt> initEndpunkte(ArrayList<Detektionssignal> detektionssignal, Detektionssignal ersteMessung) { |
|
|
ArrayList<Endpunkt> arrBerechnungsObjekte = new ArrayList<>(); |
|
|
ArrayList<Endpunkt> arrBerechnungsObjekte = new ArrayList<>(); |
|
|
for (int i = 1; i < detektionssignal.size(); i++) { |
|
|
|
|
|
if (detektionssignal.get(i).getAnkunftsZeit().isBefore(nahegelegensteMessung.getAnkunftsZeit())) { |
|
|
|
|
|
nahegelegensteMessung = detektionssignal.get(i); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
for (Detektionssignal aufzeichnung : detektionssignal) { |
|
|
for (Detektionssignal aufzeichnung : detektionssignal) { |
|
|
int zeitunterschied = aufzeichnung.getAnkunftsZeit().getHour() * 3600 + aufzeichnung.getAnkunftsZeit().getMinute() * 60 + aufzeichnung.getAnkunftsZeit().getSecond() |
|
|
int zeitunterschied = aufzeichnung.getAnkunftsZeit().getHour() * 3600 + aufzeichnung.getAnkunftsZeit().getMinute() * 60 + aufzeichnung.getAnkunftsZeit().getSecond() |
|
|
- nahegelegensteMessung.getAnkunftsZeit().getHour() * 3600 - nahegelegensteMessung.getAnkunftsZeit().getMinute() * 60 - nahegelegensteMessung.getAnkunftsZeit().getSecond(); |
|
|
|
|
|
double startradius = zeitunterschied * aufzeichnung.getGeschwErdbeben(); |
|
|
|
|
|
|
|
|
- ersteMessung.getAnkunftsZeit().getHour() * 3600 - ersteMessung.getAnkunftsZeit().getMinute() * 60 - ersteMessung.getAnkunftsZeit().getSecond(); |
|
|
|
|
|
|
|
|
|
|
|
double startradius = zeitunterschied * aufzeichnung.getGeschwErdbeben()*0.0000114130224932113000000; |
|
|
|
|
|
|
|
|
|
|
|
Log.i(TAG, "Init Daten: " + aufzeichnung.getDeviceId() + "Startradius: " + startradius); |
|
|
Endpunkt tempEndpunkt = new Endpunkt(aufzeichnung.getDeviceId()); |
|
|
Endpunkt tempEndpunkt = new Endpunkt(aufzeichnung.getDeviceId()); |
|
|
Kreis k = new Kreis(aufzeichnung.getKoordinaten().getX(), aufzeichnung.getKoordinaten().getY(), startradius); |
|
|
Kreis k = new Kreis(aufzeichnung.getKoordinaten().getX(), aufzeichnung.getKoordinaten().getY(), startradius); |
|
|
tempEndpunkt.setKreis(k); |
|
|
tempEndpunkt.setKreis(k); |
|
|
arrBerechnungsObjekte.add(tempEndpunkt); |
|
|
arrBerechnungsObjekte.add(tempEndpunkt); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Log.i(TAG, "Daten Erfolgreich initialisiert"); |
|
|
return arrBerechnungsObjekte; |
|
|
return arrBerechnungsObjekte; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@RequiresApi(api = Build.VERSION_CODES.O) |
|
|
|
|
|
public Detektionssignal ermittleErstesDetektionssignal(ArrayList<Detektionssignal> detektionssignale) |
|
|
|
|
|
{ |
|
|
|
|
|
Detektionssignal erstesDetektionssignal = detektionssignale.get(0); |
|
|
|
|
|
for (int i = 1; i < detektionssignale.size(); i++) { |
|
|
|
|
|
if (detektionssignale.get(i).getAnkunftsZeit().isBefore(erstesDetektionssignal.getAnkunftsZeit())) { |
|
|
|
|
|
erstesDetektionssignal = detektionssignale.get(i); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return erstesDetektionssignal; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
public ArrayList<Schnittpunkt> berechneKreisSchnittpunkte(Kreis kreis1, Kreis kreis2) { |
|
|
public ArrayList<Schnittpunkt> berechneKreisSchnittpunkte(Kreis kreis1, Kreis kreis2) { |
|
|
|
|
|
|
|
|
ArrayList<Schnittpunkt> schnittpunkte = new ArrayList<>(); |
|
|
ArrayList<Schnittpunkt> schnittpunkte = new ArrayList<>(); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public boolean genuegendSchnittpunktevorhanden(ArrayList<EndpunktVerbindung> endpunktVerbindungen) { |
|
|
public boolean genuegendSchnittpunktevorhanden(ArrayList<EndpunktVerbindung> endpunktVerbindungen) { |
|
|
System.out.println("<<<<<<<<<<<<<<<<<<<<<<genuegendSchnittpunktevorhanden"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Log.i(TAG,"Überprüfe ob genügend Schnittpunkte vorhanden sind"); |
|
|
|
|
|
//Log.i(TAG,"Radius: "+ Double.toString(endpunktVerbindungen.get(0).getEndpunkt1().getKreis().getRadius())); |
|
|
for (EndpunktVerbindung endpunktVerbindung : endpunktVerbindungen) { |
|
|
for (EndpunktVerbindung endpunktVerbindung : endpunktVerbindungen) { |
|
|
ArrayList<Schnittpunkt> templist; |
|
|
ArrayList<Schnittpunkt> templist; |
|
|
templist = berechneKreisSchnittpunkte(endpunktVerbindung.getEndpunkt1().getKreis(), endpunktVerbindung.getEndpunkt2().getKreis()); |
|
|
templist = berechneKreisSchnittpunkte(endpunktVerbindung.getEndpunkt1().getKreis(), endpunktVerbindung.getEndpunkt2().getKreis()); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public Epizentrum ueberpruefeObEpizentrum(ArrayList<EndpunktVerbindung> endpunktVerbindungen) { |
|
|
public Epizentrum ueberpruefeObEpizentrum(ArrayList<EndpunktVerbindung> endpunktVerbindungen) { |
|
|
|
|
|
|
|
|
int counter; |
|
|
int counter; |
|
|
ArrayList<Schnittpunkt> schnittpunkte = new ArrayList<>(); |
|
|
ArrayList<Schnittpunkt> schnittpunkte = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (counter == endpunktVerbindungen.size() - 1) { |
|
|
if (counter == endpunktVerbindungen.size() - 1) { |
|
|
schnittpunkte.add(s1); |
|
|
schnittpunkte.add(s1); |
|
|
Epizentrum tempEpizentrum = new Epizentrum(); |
|
|
Epizentrum tempEpizentrum = new Epizentrum(); |
|
|
tempEpizentrum.setKoordinaten(berechneEpizentrumKoordinaten(schnittpunkte)); |
|
|
|
|
|
|
|
|
Koordinaten koordinaten = (berechneEpizentrumKoordinaten(schnittpunkte)); |
|
|
|
|
|
tempEpizentrum.setKoordinaten(koordinaten); |
|
|
|
|
|
Log.i(TAG, "Epizentrumkoord: " + tempEpizentrum.getKoordinaten().getX() + " " + tempEpizentrum.getKoordinaten().getY()); |
|
|
return tempEpizentrum; |
|
|
return tempEpizentrum; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public Koordinaten berechneEpizentrumKoordinaten(ArrayList<Schnittpunkt> schnittpunkte) { |
|
|
public Koordinaten berechneEpizentrumKoordinaten(ArrayList<Schnittpunkt> schnittpunkte) { |
|
|
|
|
|
Log.i(TAG, "Berechne Epizentrum Koordinaten"); |
|
|
double x = 0; |
|
|
double x = 0; |
|
|
double y = 0; |
|
|
double y = 0; |
|
|
for (Schnittpunkt s : schnittpunkte) { |
|
|
for (Schnittpunkt s : schnittpunkte) { |
|
|
x+= s.getKoordinaten().getX(); |
|
|
x+= s.getKoordinaten().getX(); |
|
|
y+= s.getKoordinaten().getY(); |
|
|
y+= s.getKoordinaten().getY(); |
|
|
} |
|
|
} |
|
|
return new Koordinaten(new BigDecimal(x/schnittpunkte.size()).setScale(DOUBLESTELLEN, RoundingMode.HALF_UP).doubleValue(), |
|
|
|
|
|
new BigDecimal(y/schnittpunkte.size()).setScale(DOUBLESTELLEN, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
|
|
|
|
x = new BigDecimal(x/schnittpunkte.size()).setScale(DOUBLESTELLEN, RoundingMode.HALF_UP).doubleValue()*0.999308681; |
|
|
|
|
|
y = new BigDecimal(y/schnittpunkte.size()).setScale(DOUBLESTELLEN, RoundingMode.HALF_UP).doubleValue()*1.000831381; |
|
|
|
|
|
return new Koordinaten(x,y); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public ArrayList<EndpunktVerbindung> ermittleEndpunktKonbinationen(ArrayList<Endpunkt> tempBerechungsObjekte) { |
|
|
public ArrayList<EndpunktVerbindung> ermittleEndpunktKonbinationen(ArrayList<Endpunkt> tempBerechungsObjekte) { |
|
|
|
|
|
|
|
|
ArrayList<EndpunktVerbindung> verbindungen = new ArrayList<>(); |
|
|
ArrayList<EndpunktVerbindung> verbindungen = new ArrayList<>(); |
|
|
Set<Set<Endpunkt>> combinations = Sets.combinations(ImmutableSet.copyOf(tempBerechungsObjekte), 2); |
|
|
Set<Set<Endpunkt>> combinations = Sets.combinations(ImmutableSet.copyOf(tempBerechungsObjekte), 2); |
|
|
for (Set<Endpunkt> tempEndpunkt : combinations) { |
|
|
for (Set<Endpunkt> tempEndpunkt : combinations) { |
|
|
|
|
|
|
|
|
EndpunktVerbindung endpunktVerbindung = new EndpunktVerbindung(helpArrayToGetValues.get(0), helpArrayToGetValues.get(1)); |
|
|
EndpunktVerbindung endpunktVerbindung = new EndpunktVerbindung(helpArrayToGetValues.get(0), helpArrayToGetValues.get(1)); |
|
|
verbindungen.add(endpunktVerbindung); |
|
|
verbindungen.add(endpunktVerbindung); |
|
|
} |
|
|
} |
|
|
|
|
|
Log.i(TAG, "Endpunkteverbindungen Erfolgreich festgelegt, Anzahl: " + verbindungen.size()); |
|
|
return verbindungen; |
|
|
return verbindungen; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return detektionssignal.getAnkunftsZeit().minusSeconds(sec); |
|
|
return detektionssignal.getAnkunftsZeit().minusSeconds(sec); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public void erhoheRadius(ArrayList<Endpunkt> tempEndpunktListe) { |
|
|
public void erhoheRadius(ArrayList<Endpunkt> tempEndpunktListe) { |
|
|
|
|
|
|
|
|
for (Endpunkt b : tempEndpunktListe) { |
|
|
for (Endpunkt b : tempEndpunktListe) { |
|
|
b.erhoeheRadius(SCHRITTWEITE); |
|
|
b.erhoeheRadius(SCHRITTWEITE); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |