Das Ziel ist der Winkel im zweidimensionalen Koordinatensystem Ich schreibe ein Programm mit einem Winkel von -180 ° bis 180 °, aber ich denke, es kann mit ein wenig Umschreiben 0 bis 360 ° sein.
In meiner Master-Forschung mache ich eine Indoor-Positionierungsanwendung mit Android (Java) und verwende einen Partikelfilter darin. Unter diesen war es notwendig, die Zustandsvektoren jedes Teilchens zu mitteln. Es gibt drei Zustandsvektoren (x, y, θ), von denen (x, y) einfach durch die Zahl geteilt werden kann, aber der Winkel funktioniert aufgrund des Problems der Periodizität (später beschrieben) nicht. Also habe ich es selbst gemacht
Es wird ausführlich mit Abbildungen auf der folgenden Seite erklärt http://d.hatena.ne.jp/ootanAW/20111030/1319981509 Einfach ausgedrückt beträgt der Durchschnitt von 350 ° und 10 ° (bei dem durch [0 ° ~ 360 °] definierten Winkel) 180 °, oder? In Anbetracht der Periodizität möchte ich, dass der Durchschnitt 0 ° beträgt Dieses Mal denke ich über [-180 ° ~ 180 °] nach, aber das gleiche Problem tritt auf.
Entsprechend der Stelle von ↓ scheint es eine Methode zu geben, den Winkel einmal in einen Vektor auf dem Einheitskreis umzuwandeln, ihn zu synthetisieren, die Vektoren zu mitteln und ihn dann zurück umzuwandeln. https://staff.aist.go.jp/toru-nakata/averageangle.html
Das Verfahren ist wie folgt
Deshalb habe ich es geschrieben Es wird auch auf [gist] hochgeladen (https://gist.github.com/koyo-miyamura/08e14f58aa1f9e69c82fe51102835f39). Sie können es also gerne verwenden (ich würde es begrüßen, wenn Sie auf Mängel hinweisen könnten).
Angle_average.java
import java.lang.Math;
public class Angle_average{
public static void main(String[] args){
final class vector{
double x;
double y;
}
System.out.println("Durchschnittlicher Winkel");
//Variablendeklaration / -initialisierung
double ang_avg;
// -----Geben Sie hier den Winkel ein, für den Sie den Durchschnitt berechnen möchten-----
double[] angles = {10.0, 30.0, -10.0, -30.0};
int len = angles.length;
double[] angles_rad = new double[len];
vector[] vectors = new vector[len];
vector vector_avg = new vector();
for (int i = 0; i < vectors.length; i++) {
vectors[i] = new vector();
}
for (int i = 0; i < angles.length; i++) {
angles_rad[i] = angles[i] * (Math.PI / 180.0);
vectors[i].x = Math.cos(angles_rad[i]);
vectors[i].y = Math.sin(angles_rad[i]);
}
//Finden Sie den Durchschnitt
vector_avg.x = 0.0;
vector_avg.y = 0.0;
for (int i = 0; i < vectors.length; i++) {
vector_avg.x += vectors[i].x;
vector_avg.y += vectors[i].y;
}
vector_avg.x = vector_avg.x / (double)vectors.length;
vector_avg.y = vector_avg.y / (double)vectors.length;
ang_avg = Math.atan2(vector_avg.y, vector_avg.x);
//Korrektur des Berechnungsfehlers
if(Math.abs(ang_avg) < Math.pow(10, -8)){
ang_avg = 0.0;
}
System.out.println(Double.toString(Math.toDegrees(ang_avg)) + "\n");
}
}
Recommended Posts