Abänderung für Dreiecks Berechnung
This commit is contained in:
parent
a685f972bf
commit
906df05c6c
@ -43,5 +43,6 @@ dependencies {
|
|||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||||
|
|
||||||
implementation("com.google.guava:guava:30.1.1-jre")
|
implementation("com.google.guava:guava:30.1.1-jre")
|
||||||
|
implementation ('com.lemmingapex.trilateration:trilateration:1.0.2')
|
||||||
|
|
||||||
}
|
}
|
@ -27,7 +27,7 @@ public class Detektionssignal {
|
|||||||
this.koordinaten = koordinaten;
|
this.koordinaten = koordinaten;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getGeschwErdbeben() {
|
public double getGeschwErdbeben() {
|
||||||
return geschwErdbeben;
|
return geschwErdbeben;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,6 +44,6 @@ public class Detektionssignal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Koordinaten koordinaten;
|
public Koordinaten koordinaten;
|
||||||
public int geschwErdbeben;
|
public double geschwErdbeben;
|
||||||
public LocalDateTime ankunftsZeit;
|
public LocalDateTime ankunftsZeit;
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import android.os.Build;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import de.edotzlaff.detection.detektion.berechnung.Endpunkt;
|
import de.edotzlaff.detection.detektion.berechnung.Endpunkt;
|
||||||
import de.edotzlaff.detection.detektion.berechnung.EndpunktVerbindung;
|
import de.edotzlaff.detection.detektion.berechnung.EndpunktVerbindung;
|
||||||
import de.edotzlaff.detection.detektion.berechnung.EpizentrumRechnung;
|
import de.edotzlaff.detection.detektion.berechnung.EpizentrumRechnung;
|
||||||
@ -17,7 +18,7 @@ import java.util.Objects;
|
|||||||
public class Erdbeben {
|
public class Erdbeben {
|
||||||
|
|
||||||
//ToDO anpassen an Szenario umso mehr umso wahrscheinlich ein Ergebnis, oder Abbruchbedingung mit do while
|
//ToDO anpassen an Szenario umso mehr umso wahrscheinlich ein Ergebnis, oder Abbruchbedingung mit do while
|
||||||
public static final Integer SCHLEIFENDURCHLAUFTE = 2000;
|
public static final Integer SCHLEIFENDURCHLAUFTE = 200;
|
||||||
private static final String TAG = "ERDBEBEN";
|
private static final String TAG = "ERDBEBEN";
|
||||||
|
|
||||||
private Epizentrum epizentrum;
|
private Epizentrum epizentrum;
|
||||||
@ -37,11 +38,9 @@ public class Erdbeben {
|
|||||||
return nutzerDaten.size();
|
return nutzerDaten.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addDetektionssignalList(ArrayList<Detektionssignal> detektionssignale)
|
public void addDetektionssignalList(ArrayList<Detektionssignal> detektionssignale) {
|
||||||
{
|
for (int i = 0; i < detektionssignale.size(); i++) {
|
||||||
for (int i = 0; i< detektionssignale.size(); i++)
|
nutzerDaten.put(detektionssignale.get(i).getDeviceId() + "i", detektionssignale.get(i));
|
||||||
{
|
|
||||||
nutzerDaten.put(detektionssignale.get(i).getDeviceId()+"i",detektionssignale.get(i));
|
|
||||||
}
|
}
|
||||||
Log.i(TAG, "addDetektionssignalList: " + nutzerDaten.size());
|
Log.i(TAG, "addDetektionssignalList: " + nutzerDaten.size());
|
||||||
}
|
}
|
||||||
@ -69,6 +68,16 @@ public class Erdbeben {
|
|||||||
}
|
}
|
||||||
epizentrumRechnung.erhoheRadius(berechnungsEndpunkte);
|
epizentrumRechnung.erhoheRadius(berechnungsEndpunkte);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!Objects.isNull(epizentrumRechnung.trilateration(berechnungsEndpunkte)))
|
||||||
|
{
|
||||||
|
epizentrum = epizentrumRechnung.trilateration(berechnungsEndpunkte);
|
||||||
|
Log.i(TAG, "Koordinaten: " +epizentrum.getKoordinaten().getX() + " " + epizentrum.getKoordinaten().getY());
|
||||||
|
epizentrum.setEntstehungsZeitpunkt(epizentrumRechnung.berechneEntstehungsZeitpunktLongLatt(erstesDetektionssignal, epizentrum.getKoordinaten()));
|
||||||
|
return epizentrum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,12 +9,18 @@ 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 com.lemmingapex.trilateration.NonLinearLeastSquaresSolver;
|
||||||
|
import com.lemmingapex.trilateration.TrilaterationFunction;
|
||||||
|
|
||||||
|
import org.apache.commons.math3.fitting.leastsquares.LeastSquaresOptimizer;
|
||||||
|
import org.apache.commons.math3.fitting.leastsquares.LevenbergMarquardtOptimizer;
|
||||||
|
|
||||||
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;
|
||||||
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Kreis;
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Kreis;
|
||||||
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Schnittpunkt;
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.Schnittpunkt;
|
||||||
|
import de.edotzlaff.detection.detektion.berechnung.mathObjekte.UTM2Deg;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
@ -26,7 +32,7 @@ import java.util.Set;
|
|||||||
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 = 20;
|
private static final double SCHRITTWEITE = 5;
|
||||||
private static final double MAX_ABSTAND = 5;
|
private static final double MAX_ABSTAND = 5;
|
||||||
private static final int DOUBLESTELLEN = 15;
|
private static final int DOUBLESTELLEN = 15;
|
||||||
private static final int SCHLEIFENDURCHLAUFTE = 5000;
|
private static final int SCHLEIFENDURCHLAUFTE = 5000;
|
||||||
@ -181,21 +187,21 @@ public class EpizentrumRechnung {
|
|||||||
double abstand = Math.sqrt(
|
double abstand = Math.sqrt(
|
||||||
Math.pow(detektionssignal.getKoordinaten().getX() - koordEpi.getX(), 2) +
|
Math.pow(detektionssignal.getKoordinaten().getX() - koordEpi.getX(), 2) +
|
||||||
Math.pow(detektionssignal.getKoordinaten().getY() - koordEpi.getY(), 2));
|
Math.pow(detektionssignal.getKoordinaten().getY() - koordEpi.getY(), 2));
|
||||||
int sec = (int) abstand/ detektionssignal.geschwErdbeben;
|
int sec = (int) (abstand / detektionssignal.geschwErdbeben);
|
||||||
|
|
||||||
return detektionssignal.getAnkunftsZeit().minusSeconds(sec);
|
return detektionssignal.getAnkunftsZeit().minusSeconds(sec);
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||||
public LocalDateTime berechneEntstehungsZeitpunktLongLatt(Detektionssignal detektionssignal, Koordinaten koordEpi)
|
public LocalDateTime berechneEntstehungsZeitpunktLongLatt(Detektionssignal detektionssignal, Koordinaten koordEpi) {
|
||||||
{
|
|
||||||
float[] results = new float[1];
|
float[] results = new float[1];
|
||||||
Location.distanceBetween(detektionssignal.getKoordinaten().getX(), detektionssignal.getKoordinaten().getY(), koordEpi.getX(), koordEpi.getY(), results);
|
Location.distanceBetween(detektionssignal.getKoordinaten().getX(), detektionssignal.getKoordinaten().getY(), koordEpi.getX(), koordEpi.getY(), results);
|
||||||
float distanceInMeters = results[0];
|
float distanceInMeters = results[0];
|
||||||
int sec = (int) distanceInMeters/ detektionssignal.geschwErdbeben;
|
int sec = (int) (distanceInMeters / detektionssignal.geschwErdbeben);
|
||||||
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) {
|
||||||
@ -203,5 +209,32 @@ public class EpizentrumRechnung {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Epizentrum trilateration(ArrayList<Endpunkt> tempEndpunktListe) {
|
||||||
|
double[][] positions = new double[tempEndpunktListe.size()][2];
|
||||||
|
double[] distances = new double[tempEndpunktListe.size()];
|
||||||
|
|
||||||
|
for (int i = 0; i < tempEndpunktListe.size(); i++) {
|
||||||
|
positions[i][0] = tempEndpunktListe.get(i).getKreis().getMittelPunkt().getX();
|
||||||
|
positions[i][1] = tempEndpunktListe.get(i).getKreis().getMittelPunkt().getY();
|
||||||
|
distances[i] = tempEndpunktListe.get(i).getKreis().getRadius();
|
||||||
|
}
|
||||||
|
NonLinearLeastSquaresSolver solver = new NonLinearLeastSquaresSolver(new TrilaterationFunction(positions, distances), new LevenbergMarquardtOptimizer());
|
||||||
|
LeastSquaresOptimizer.Optimum optimum = solver.solve();
|
||||||
|
|
||||||
|
double[] centroid = optimum.getPoint().toArray();
|
||||||
|
if (centroid.length == 2) {
|
||||||
|
UTM2Deg utm2Deg = new UTM2Deg();
|
||||||
|
utm2Deg.convertToDeg(32, 'U', centroid[0], centroid[1]);
|
||||||
|
|
||||||
|
Log.i(TAG, "Center: " + utm2Deg.getLatitude() + " " + utm2Deg.getLongitude());
|
||||||
|
Epizentrum epizentrum = new Epizentrum();
|
||||||
|
Koordinaten koordinaten = new Koordinaten(centroid[0], centroid[1]);
|
||||||
|
epizentrum.setKoordinaten(koordinaten);
|
||||||
|
return epizentrum;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user