Browse Source

Abänderung für Dreiecks Berechnung

master
Jan Gabriel Kunze 3 years ago
parent
commit
906df05c6c

+ 1
- 0
app/build.gradle View File

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')


} }

+ 2
- 2
app/src/main/java/de/edotzlaff/detection/detektion/Detektionssignal.java View File

this.koordinaten = koordinaten; this.koordinaten = koordinaten;
} }


public int getGeschwErdbeben() {
public double getGeschwErdbeben() {
return geschwErdbeben; return geschwErdbeben;
} }


} }


public Koordinaten koordinaten; public Koordinaten koordinaten;
public int geschwErdbeben;
public double geschwErdbeben;
public LocalDateTime ankunftsZeit; public LocalDateTime ankunftsZeit;
} }

+ 15
- 6
app/src/main/java/de/edotzlaff/detection/detektion/Erdbeben.java View File

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;
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;
return nutzerDaten.size(); return nutzerDaten.size();
} }


public void addDetektionssignalList(ArrayList<Detektionssignal> detektionssignale)
{
for (int i = 0; i< detektionssignale.size(); i++)
{
nutzerDaten.put(detektionssignale.get(i).getDeviceId()+"i",detektionssignale.get(i));
public void addDetektionssignalList(ArrayList<Detektionssignal> detektionssignale) {
for (int i = 0; i < detektionssignale.size(); i++) {
nutzerDaten.put(detektionssignale.get(i).getDeviceId() + "i", detektionssignale.get(i));
} }
Log.i(TAG, "addDetektionssignalList: " + nutzerDaten.size()); Log.i(TAG, "addDetektionssignalList: " + nutzerDaten.size());
} }
} }
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;
} }



+ 38
- 5
app/src/main/java/de/edotzlaff/detection/detektion/berechnung/EpizentrumRechnung.java View File

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;
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;
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) {
} }
} }


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…
Cancel
Save