Connaissances minimales requises pour traiter les «angles» et les «coordonnées» dans Ruby + Dans quelle direction est M. B du point de vue de M. A? Algorithme

L'autre jour, j'ai eu l'occasion de gérer les coordonnées et les angles en Ruby, j'ai donc mis toutes les connaissances nécessaires pour les manipuler de manière compacte et les ai soigneusement résumées. Dans la seconde moitié, à titre d'exemple, il y a un code simple qui vous permet de vérifier dans 8 directions, comme "Dans quelle direction est M. B du point de vue de M. A?" Je suis heureux que vous puissiez l'utiliser comme référence. (Version: ruby 2.5.1)

su.png

Il existe deux unités couramment utilisées pour l'angle

Tout comme il existe différentes normes pour exprimer la longueur, telles que les «mètres» et les «pieds», il existe plusieurs façons d'exprimer les angles. Lorsque nous exprimons un angle, nous utilisons généralement quelque chose comme 90 ° (90 degrés). Cependant, sur le module fourni par __Ruby, une unité appelée radian (rad) est utilisée __.

Concept de diplôme (°)

Dans cette unité, __1 tour est à 360 ° __. Ainsi, par exemple, si vous "faites pivoter 360 ° vers la droite (ou vers la gauche)", vous pouvez revenir exactement dans la même direction que l'original.

Pensée radian (rad)

Dans cette unité, 1 tour est égal à 2 × π rad. Ainsi, par exemple, si vous "faites pivoter 2 x π rad vers la droite (ou vers la gauche)", vous pouvez revenir exactement dans la même direction que l'original. (Π = rapport de circonférence ≒ 3,14)

Pour ceux qui ont perdu la mémoire en tant qu'étudiant comme moi, quelle est la longueur de π par rapport au diamètre du cercle? C'est le rapport de, et le rapport est fixé à environ 3,14 fois. Si le diamètre du cercle est de 1 cm, la circonférence du cercle est de 1 x π cm, soit environ 3,14 cm. Cliquez ici pour plus de détails sur π (rapport circonférentiel)

Donc

Vous pouvez convertir des degrés (°) en radians (rad) comme suit.

= 0 × π = 0.00000… rad __45 ° __ = (2 × π) ÷ 8 = 0,78539… rad (45 ° est divisé en 8 parties égales de «2 × π») __90 ° __ = (2 × π) ÷ 4 = 1,57079… rad (90 ° est divisé en 4 parties égales de «2 × π») __180 ° __ = (2 × π) ÷ 2 = 3.14159… rad (180 ° est divisé en deux parties égales de «2 × π») __270 ° __ = (2 × π) ÷ 4 × 3 = __4.71238 __… rad (270 ° est 3/4 de «2 × π») __360 ° __ = (2 × π) = 6.28318… rad (360 ° est «2 × π»)

C'est un peu une explication détournée, mais c'est plus facile à retenir si vous gardez la norme __180 (°) = π (rad) __.

Dans le monde Ruby, π = "Math :: PI"

Supprimons ici une connaissance essentielle de Ruby. Pour exprimer π (≈3.14) dans le code, nous avons besoin de l'aide d'un module appelé "Math". Pour appeler le module, écrivez ʻinclude Mathen haut du code. Si vous appelez le module, vous pouvez exprimer π simplement en écrivantPI`.

include Math

puts PI
#Résultat de sortie :: 3.141592653589793

Si vous souhaitez appeler un module en un seul coup au lieu du fichier entier, utilisez la méthode suivante (incluez la version mathématique inutile).

puts Math::PI
#Résultat de sortie :: 3.141592653589793

Référence ... Le lien ci-dessous présente également la méthode de conversion mutuelle entre degré (°) et radian (rad). "Code Ruby pour la conversion entre Radian et degré" par @niwasawa

Comment utiliser "Math :: atan2" pour trouver l'angle à partir des coordonnées

location.png

Si les axes x et y sont préparés comme décrit ci-dessus et que les coordonnées (valeurs de x et y) sont données, utilisez une autre fonction ʻatan2` fournie par le module Math mentionné ci-dessus. Vous pouvez trouver l'angle (rad).

include Math

def radian(x, y)
  return atan2(y, x)
  #Notez que l'ordre des arguments x et y est inversé
end

puts radian(5, 3)
#Résultat de sortie::   0.5404195002705842

Ceci est un résultat de sortie par un radian (rad) qui n'est pas très familier, donc dans ce qui suit, j'ajouterai "÷ π × 180" dans la méthode pour le convertir en degré (°), et enfin l'arrondir.

include Math

def degree(x, y)
  return atan2(y, x)/PI*180
end

puts degree(5, 3).round
#Résultat de sortie::   31

J'ai pu trouver l'angle de 31 degrés en toute sécurité.

Dans quelle direction est M. B du point de vue de M. A?

a_b.png

Si on vous donne les coordonnées de M. A et les coordonnées de M. B comme indiqué dans la figure ci-dessus, faisons un code pour que vous puissiez répondre dans quelle direction vous êtes dans 8 directions. Au fait, j'aimerais mesurer la distance entre les deux. (Unité de distance: m)

spécification

Entrez les coordonnées de M. A (x, y) et les coordonnées de M. B (x, y) ↓ Affiche la direction et la distance de M. A à M. B

contribution


Coordonnées de A(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux.
Les coordonnées de M. A sont?◯ ◯ ← Entrez ici
Coordonnées de B(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux.
Les coordonnées de B sont?◯ ◯ ← Entrez ici

production


M. B est dans la direction de ◆◆ vu de M. A, et se trouve à ▲▲ m.

Gestion des exceptions


Les deux sont au même endroit.

Point 1 Pensez avec M. A comme point de départ (centre)

Comme le montre l'image ci-dessous, afin de savoir dans quelle direction vous vous trouvez "vu de M. A", considérez M. A comme le point de départ (centre). slide.mov.gif Dans ce cas, pour amener M. A au centre, il est possible de déplacer M. A de -3m dans la direction x et de + 2m dans la direction y, alors demandez à M. B de se déplacer également de la même distance.

A (3, -2) x est -3, y est +2 → A (0, 0) = C'est le centre! De même ... B (-2, -4) x à -3, y à +2 → __B (-5, -2) Si vous vérifiez la direction de cette coordonnée avec Math :: atan2, c'est OK! __

Point 2 Plage de valeur de retour de Math :: atan2

Cette fois, nous examinerons toutes les directions. Je m'attendais à ce que la valeur entre 0 ° et 360 ° puisse être obtenue en utilisant ʻatan2, mais en fait, la plage de valeurs renvoyée par __ʻatan2 est de -π à π (en termes de fréquence- 180 ° ~ 180 °) est décidé __. Dans le cas de "entre 3h00 et 9h00" dans les aiguilles de l'horloge, une valeur négative reviendra ...

Il n'y a pas de problème même si l'algorithme est configuré selon cette spécification, mais pour étudier, j'aimerais prendre une méthode pour convertir la valeur d'angle obtenue en __ cette valeur pratique __. Référence: "Conversion d'un angle en angle positif (0 à 359 degrés) avec Ruby" par @ massassiez

# -Comment convertir une valeur entre 180 et 180 en une valeur entre 0 et 360(-Prenant 120 comme exemple)

(-120).modulo(360)
#Ou
-120 % 360

#Cela le convertira en 240

«%» Et «modulo» ci-dessus font exactement la même chose. En trouvant le reste (trop) divisé par 360, il sera automatiquement converti dans la plage de 0 à 360. (À propos, modulo peut être utilisé sans inclure Math)

Point 3 Utiliser le théorème des trois carrés pour la distance

Utilisez le Théorème des trois carrés pour trouver la distance entre deux points A (x, y) et B (x, y). Faisons le.

AB= \sqrt{(x_b−x_a)^2+(y_b−y_a)^2}

Si vous faites cela dans Ruby, cela ressemblera à ce qui suit.

def distance(a_x, a_y, b_x, b_y)
  return ((b_x - a_x)**2 + (b_y - a_y)**2)**(1/2.0)
end

#  **2 ← au carré
#  **(1/2.0)← Itinéraire(racine carrée)Faire

Code d'achèvement

sampl.rb(Achevée)



#Cette fois, je veux utiliser atan2 et PI, alors déclarez d'abord inclure Math
include Math

#Méthode pour trouver l'angle
def degree(x, y)
  (atan2(y, x)/PI*180)%360
end

#Méthode pour trouver la direction
def compass(degree)
  if degree > 15 && degree < 75
     "Nord-est"
  elsif degree >= 75 && degree <= 105
     "Nord"
  elsif degree > 105 && degree < 165
     "Nord Ouest"
  elsif degree >= 165 && degree <= 195
     "Ouest"
  elsif degree > 195 && degree < 255
     "Sud-ouest"
  elsif degree >= 255 && degree <= 285
     "Sud"
  elsif degree > 285 && degree < 345
     "Sud-est"
  else
     "est"
  end
end

#Méthode pour trouver la distance entre deux points
def distance(a_x, a_y, b_x, b_y)
   ((b_x - a_x)**2 + (b_y - a_y)**2)**(1/2.0)
end


puts "Coordonnées de A(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux."
print "Les coordonnées de M. A sont? "
a_x, a_y = gets.split.map(&:to_i)

puts "Coordonnées de M. B(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux."
print "Les coordonnées de M. B sont? "
b_x, b_y = gets.split.map(&:to_i)

if a_x == b_x && a_y == b_y
  puts "Les deux sont au même endroit."
  exit
end

direction = compass(degree(b_x - a_x, b_y - a_y))
distance = distance(a_x, a_y, b_x, b_y).round(1)

puts "M. B voit de M. A#{direction}En direction de#{distance}m plus loin."
#À moins de 2 mètres est dense
distance > 2 ? (puts "La distance sociale est maintenue.") : (puts "C'est dense!")

Résultat de sortie

Monsieur A(3,-2), B(-2,-4)dans le cas de


Coordonnées de A(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux.
Les coordonnées de M. A sont? 3 -2
Coordonnées de M. B(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux.
Les coordonnées de M. B sont? -2 -4

↓ Résultat ↓

M. B est dans la direction sud-ouest de M. A, 5.4m plus loin.
La distance sociale est maintenue.

Monsieur A(-1,-7), B(1,-7)dans le cas de


Coordonnées de A(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux.
Les coordonnées de M. A sont? -1 -7
Coordonnées de M. B(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux.
Les coordonnées de M. B sont? 1 -7

↓ Résultat ↓

M. B est dans la direction est de M. A, 2.Il est à 0m.
C'est dense!

Monsieur A(4,3), B(4,3)dans le cas de


Coordonnées de A(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux.
Les coordonnées de M. A sont? 4 3
Coordonnées de M. B(x, y)Veuillez saisir deux nombres demi-largeur avec un espace demi-largeur entre eux.
Les coordonnées de M. B sont? 4 3

↓ Résultat ↓

Les deux sont au même endroit.

Comme mentionné ci-dessus, «Connaissances minimales requises pour traiter les« angles »et les« coordonnées »dans Ruby + Dans quelle direction est M. B du point de vue de M. A? C'était "Algorithm". Merci pour votre visite!

Recommended Posts

Connaissances minimales requises pour traiter les «angles» et les «coordonnées» dans Ruby + Dans quelle direction est M. B du point de vue de M. A? Algorithme
[Python] Précautions lors de la recherche des valeurs maximum et minimum avec un tableau numpy avec un petit nombre d'éléments
Que faire lorsqu'une partie de l'image d'arrière-plan devient transparente lorsque l'image transparente est combinée avec Oreiller
[Python] Que faire en cas de violation de PEP8 lors du processus d'importation à partir du répertoire ajouté à sys.path
[CleanArchitecture avec Python] Appliquez CleanArchitecture à une API simple étape par étape, et essayez de comprendre "quel type de changement est fort" dans la base de code.
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Représenter des conteneurs dans un cadre imbriqué (schéma) dans Jupyter, et ce que j'ai étudié en cours de création