[JAVA] Comment trouver l'angle moyen

supposition

La cible est l'angle dans le système de coordonnées bidimensionnel J'écris un programme avec un angle de -180 ° à 180 °, mais je pense qu'il peut être de 0 à 360 ° avec un peu de réécriture.

Contexte (vous pouvez l'ignorer)

Dans mes recherches de maîtrise, je crée une application de positionnement en intérieur sous Android (Java) et j'utilise un filtre à particules. Parmi eux, il fallait prendre l'opération de moyennage des vecteurs d'état de chaque particule. Il existe trois vecteurs d'état (x, y, θ), dont (x, y) peut être simplement divisé par le nombre, mais l'angle ne fonctionne pas en raison du problème de périodicité (décrit plus loin). Alors je l'ai fait moi-même

Ne calculez pas simplement l'angle moyen

Il est expliqué en détail avec des chiffres sur le site suivant http://d.hatena.ne.jp/ootanAW/20111030/1319981509 En termes simples, la moyenne de 350 ° et 10 ° (à l'angle défini par [0 ° ~ 360 °]) est de 180 °, non? Mais vu la périodicité, je veux que la moyenne soit de 0 ° Cette fois, je pense à [-180 ° ~ 180 °], mais le même problème se produit.

Alors que devons-nous faire

Selon le site de ↓, il semble y avoir une méthode pour convertir une fois l'angle en vecteur sur le cercle unitaire, le synthétiser, faire la moyenne des vecteurs, puis le reconvertir. https://staff.aist.go.jp/toru-nakata/averageangle.html

La procédure est la suivante

  1. Générer un vecteur ** Vn ** de (cos θn, sin θn) à partir de chaque angle θn
  2. Trouvez le vecteur moyen ** V ** de ** Vn **
  3. Trouvez l'angle moyen θ à partir de ** V **

Code créé (Java)

C'est pourquoi je l'ai écrit Il est également téléchargé sur gist, alors n'hésitez pas à l'utiliser (je vous serais reconnaissant si vous pouviez signaler des lacunes).

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("Angle moyen");

        //Déclaration / initialisation de variable
        double ang_avg;

        // -----Entrez ici l'angle pour lequel vous souhaitez calculer la moyenne-----
        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]);
        }

        //Trouvez la moyenne
        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);

        //Correction d'erreur de calcul
        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

Comment trouver l'angle moyen
Comment trouver le score total et le score moyen
Différence entre Java et JavaScript (comment trouver la moyenne)
Comment trouver les dizaines et les unités
Comment trouver la cause de l'erreur Ruby
Comment trouver la distance et l'angle entre deux points sur un plan
Comment utiliser la méthode link_to
Comment trouver May'n dans XPath
Comment trouver la valeur totale, la valeur moyenne, etc. d'un tableau à deux dimensions (tableau multidimensionnel) -java
Comment utiliser la méthode include?
Comment utiliser la méthode form_with
Comment utiliser la classe wrapper
Trouvez l'angle entre deux vecteurs
Comment ajouter la fonction de suppression
Comment trouver les nombres premiers Java
[Java] Comment utiliser la classe File
Comment désactiver le regroupement d'erreurs
[Rails] Comment utiliser la méthode de la carte
[Java] Comment utiliser la méthode toString ()
Etudier comment utiliser le constructeur (java)
[Traitement × Java] Comment utiliser la boucle
Comment déterminer le nombre de parallèles
[Java] Comment régler la date sur 00:00:00
[Java] Comment obtenir le répertoire actuel
Trouvez l'âge moyen dans la liste <Personne>.
[Traitement × Java] Comment utiliser la classe
Comment trier une liste de SelectItems
Comment passer la valeur à un autre écran
Comment obtenir la date avec Java
[Traitement × Java] Comment utiliser la fonction
[Java] Comment utiliser la classe Calendar
Résumé de la façon de monter les escaliers de programmation
Comment savoir quelle version Java d'un fichier de classe a été compilée
Comment trouver le nombre total de pages lors de la pagination en Java
[Rails] Comment décider de la destination par "voies ferrées"
Comment utiliser le module caméra OV7725 (ESP32-WROVER-B)
Grattez Twitter pour trouver le plus ancien Tweet de Pien
Comment vérifier le journal dans le conteneur Docker
Personnalisez la répartition du contenu de Recyclerview
Comment mettre en œuvre la fonction de chapelure avec Gretel
Comment obtenir le jour d'aujourd'hui
[Pour les débutants] Comment implémenter la fonction de suppression
Comment effacer la base de données lors de la recréation de l'application
Sortie de la façon d'utiliser la méthode slice
[Java] (pour MacOS) Méthode de définition du chemin de classe
Comment utiliser la méthode replace () (Java Silver)