Python >> Tutoriel Python >  >> Python

Comment calculer l'angle dans le sens des aiguilles d'une montre entre deux points

Salut les Finxters ! Aujourd'hui, vous apprendrez une fonction importante que vous devrez peut-être écrire à l'avenir :comment écrire un programme Python pour calculer l'angle entre 2 points dans le sens des aiguilles d'une montre.

Nous utiliserons les principes du langage Python pour écrire un programme de travail pour écrire les angles et calculer l'angle ou les radians dans un plan donné ! Nous allons prendre notre temps et tout expliquer, alors ne vous inquiétez pas pendant que nous traversons cela ensemble !

Problème :Calcul de l'angle entre deux points

Dans ce problème particulier, nous voulons trouver l'angle dans le sens des aiguilles d'une montre entre le vecteur de l'origine au point A et le vecteur de l'origine au point B. Nous aurons trois points et deux vecteurs pour que notre angle soit bien défini. Cela peut être utilisé dans les définitions algébriques et géométriques. Pour notre exemple, nous utiliserons la définition géométrique.

Ce que nous voulons accomplir : Écrire un programme Python qui calculera l'angle dans le sens des aiguilles d'une montre.

Notre programme doit pouvoir calculer les angles entre deux points à partir d'une origine donnée de (0,0) , point A (0,1) , et point B (1, -1) . Ces 3 points donneront un angle de 45* sur un total de 360* à partir du centre d'un (x,y) graphique.

Je veux vous montrer 2 façons différentes de faire cela. Dans un sens, j'aurai un programme écrit vous montrant étape par étape. Dans le deuxième cas, je vais vous montrer une manière plus Pythonique d'écrire le même programme, vous donnant un avantage lors de l'écriture d'un programme pour une interview de code.

Méthode 1 :Écrire à la dure

Dans cet exemple, nous voulons commencer par importer le math module, puis créez une classe définissant le Vector instanciation x et y . Nous créons les variables suivantes, v1 et v2 avec les paramètres par défaut.

import math

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

v1 = Vector(0, 1)
v2 = Vector(0, -1)

ensuite à partir des maths on utilise la méthode atan2 , renvoie un tan(y / x) , en radians. Le résultat est compris entre -pi et pi . Le vecteur dans le plan de l'origine au point (x, y) fait cet angle avec le positif X axe. Le point de atan2() est que les signes des deux entrées lui sont connus, de sorte qu'il peut calculer le quadrant correct pour l'angle.

Par exemple, atan(1) et atan2(1, 1) sont tous les deux pi/4 , mais atan2(-1, -1) est -3*pi/4 . Nous sauvegardons ces nouveaux vecteurs dans de nouvelles variables :v1_theta et v2_theta .

v1_theta = math.atan2(v1.y, v1.x)
v2_theta = math.atan2(v2.y, v2.x)

r = (v2_theta - v1_theta) * (180.0 / math.pi)

if r < 0:
    r % 360

print r

En prenant ces deux points et en soustrayant le premier du second, en le multipliant par le produit de 180 divisé par pi et en l'enregistrant dans une variable ('r '). On module le -r par 360. r est plus petit que 0 car ce sera un nombre négatif. Ensuite, nous imprimons r dehors. Ce n'est qu'une façon d'écrire ce problème. C'est un peu brouillon et si nous ne faisons pas attention, nous pouvons facilement obtenir une sortie de réponse incorrecte.

Méthode 2 :Écrire – La méthode Python avec NumPy

Dans cet exemple suivant, j'utiliserai NumPy pour obtenir l'angle entre les deux points et me le renvoyer. Lorsque vous écrivez en Python, il est toujours préférable de suivre PEP8 et d'écrire votre programme le plus simplement possible pour occuper moins de mémoire dans votre code et donc moins de temps d'exécution lors du test de votre programme.

La première chose que nous allons faire est import numpy as np , puis définir l'angle avec le point 1 (p1 ) et point 2 (p2 ) comme arguments. Nous utiliserons à nouveau arctan2 multiplié par p1 pour trouver l'angle 1 et arctan2 multiplié par p2 pour trouver le deuxième angle. Nous retournerons les degrés en utilisant le np.red2deg fonction en soustrayant d'abord le premier angle du second, puis nous multiplions 2 et np.pi puis on module le produit des deux réponses. Lorsque nous saisissons notre vecteur, nous recevons correctement notre réponse lorsque nous imprimons.

import numpy as np

def angle_between(p1, p2):
    ang1 = np.arctan2(*p1[::-1])
    ang2 = np.arctan2(*p2[::-1])
    return np.rad2deg((ang1 - ang2) % (2 * np.pi))

A = (1, 0)
B = (1, -1)

print(angle_between(A, B))

# 45.

print(angle_between(B, A))

# 315.

Comme vous pouvez le voir en imprimant le angle_between(A,B) et angle_between(B,A) nous donne deux réponses totalement différentes ! La raison en est que le premier point se déplace dans le sens des aiguilles d'une montre vers le deuxième point, ce qui nous donne le plus petit nombre. En allant dans le sens inverse des aiguilles d'une montre, nous obtenons un nombre beaucoup plus grand que l'angle réel que nous recherchons !

Résumé

Comme vous le voyez, écrire ce programme en Python était facile car Python a intégré des modules mathématiques et NumPy pour rendre le code beau et propre. Cela peut sembler arbitraire mais ce programme peut être utilisé dans plusieurs applications allant de l'architecture à la réalisation de visites virtuelles dans des hôtels, des appartements ou même des restaurants.

Comme le montre cette photo, vous pouvez trouver un seul point dans un espace avec ces trois points. Il pourrait également être utilisé dans la création d'une salle virtuelle ou dans la lutte contre le crime en essayant d'utiliser la science médico-légale pour attraper un méchant ! Python est un langage de programmation incroyable qui ne cesse de m'étonner. J'espère qu'après avoir lu cet article, vous serez inspiré pour écrire vos propres programmes Python en utilisant ce que vous avez appris ici pour l'ajouter à vos portefeuilles.