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)
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 __.
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.
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)
Vous pouvez convertir des degrés (°) en radians (rad) comme suit.
0° = 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) __.
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 écrivant
PI`.
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
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é.
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)
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.
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). 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! __
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)
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
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!")
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