[JAVA] So finden Sie den durchschnittlichen Winkel

Annahme

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.

Hintergrund (Sie können es überspringen)

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

Berechnen Sie nicht einfach den durchschnittlichen Winkel

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.

Was sollen wir dann tun?

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

  1. Erzeugen Sie aus jedem Winkel θn einen Vektor ** Vn ** von (cos θn, sin θn)
  2. Finden Sie den durchschnittlichen Vektor ** V ** von ** Vn **
  3. Ermitteln Sie den Durchschnittswinkel θ aus ** V **

Code erstellt (Java)

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

So finden Sie den durchschnittlichen Winkel
So finden Sie die Gesamtpunktzahl und die Durchschnittspunktzahl
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Wie man die Zehner und Einsen findet
So finden Sie die Ursache des Ruby-Fehlers
So ermitteln Sie den Abstand und den Winkel zwischen zwei Punkten in einer Ebene
Verwendung der link_to-Methode
So finden Sie May'n in XPath
So ermitteln Sie den Gesamtwert, den Durchschnittswert usw. eines zweidimensionalen Arrays (mehrdimensionales Array) -java
Verwendung der include? -Methode
Verwendung der Methode form_with
Verwendung der Wrapper-Klasse
Finden Sie den Winkel zwischen zwei Vektoren
So fügen Sie die Löschfunktion hinzu
So finden Sie Java-Primzahlen
[Java] Verwendung der File-Klasse
So löschen Sie die Fehlerbündelung
[Schienen] Verwendung der Kartenmethode
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
[Verarbeitung × Java] Verwendung der Schleife
So bestimmen Sie die Anzahl der Parallelen
[Java] So stellen Sie die Datums- und Uhrzeit auf 00:00:00 ein
[Java] So erhalten Sie das aktuelle Verzeichnis
Finden Sie das Durchschnittsalter aus Liste <Person>.
[Verarbeitung × Java] Verwendung der Klasse
So sortieren Sie eine Liste von SelectItems
So übergeben Sie den Wert an einen anderen Bildschirm
So erhalten Sie das Datum mit Java
[Verarbeitung × Java] Verwendung der Funktion
[Java] Verwendung der Calendar-Klasse
Zusammengefasst, wie man die Programmiertreppe hinaufsteigt
So finden Sie heraus, welche Java-Version der Klassendatei kompiliert wurde
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
[Rails] So bestimmen Sie das Ziel anhand von "Rails-Routen"
Verwendung des Kameramoduls OV7725 (ESP32-WROVER-B)
Scraping Twitter, um den ältesten Pien Tweet zu finden
So überprüfen Sie das Protokoll im Docker-Container
Passen Sie an, wie der Inhalt von Recyclerview aufgeteilt wird
So implementieren Sie die Brotkrumenfunktion mit gretel
Wie komme ich zum heutigen Tag?
[Für Anfänger] So implementieren Sie die Löschfunktion
So löschen Sie die Datenbank beim Neuerstellen der App
Ausgabe der Verwendung der Slice-Methode
[Java] (für MacOS) Methode zur Einstellung des Klassenpfads
Verwendung der replace () -Methode (Java Silver)