Erforderliche Mindestkenntnisse beim Umgang mit "Winkeln" und "Koordinaten" in Ruby + In welche Richtung ist Herr B aus der Sicht von Herrn A? Algorithmus

Neulich hatte ich die Möglichkeit, mit Koordinaten und Winkeln in Ruby umzugehen, und machte alle erforderlichen Kenntnisse, um sie kompakt zu handhaben, und fasste sie sorgfältig zusammen. In der zweiten Hälfte gibt es beispielsweise einen einfachen Code, mit dem Sie Einheiten in 8 Richtungen einchecken können, z. B. "Welche Richtung ist Herr B aus der Sicht von Herrn A?". Ich bin froh, wenn Sie es als Referenz verwenden können. (Version: Ruby 2.5.1)

su.png

Es gibt zwei häufig verwendete Einheiten für den Winkel

Ebenso wie es unterschiedliche Standards zum Ausdrücken von Längen gibt, wie z. B. "Meter" und "Fuß", gibt es mehrere Möglichkeiten, Winkel auszudrücken. Wenn wir einen Winkel ausdrücken, verwenden wir im Allgemeinen etwa 90 ° (90 Grad). Auf dem von __Ruby bereitgestellten Modul wird jedoch eine Einheit namens radian (rad) __ verwendet.

Gradbegriff (°)

In dieser Einheit beträgt __1 Runde 360 ° __. Wenn Sie beispielsweise "um 360 ° nach rechts (oder links) drehen", können Sie in genau dieselbe Richtung wie das Original zurückkehren.

Radian (rad) Denkweise

In dieser Einheit beträgt 1 Runde 2 × π rad. Wenn Sie beispielsweise "2 x π rad nach rechts (oder links) drehen", können Sie in genau dieselbe Richtung wie das Original zurückkehren. (Π = Umfangsverhältnis ≒ 3,14)

Wie lang ist π für diejenigen, die als Student wie ich ihr Gedächtnis verloren haben, relativ zum Durchmesser des Kreises? Es ist das Verhältnis von und das Verhältnis ist auf das 3,14-fache festgelegt. Wenn der Durchmesser des Kreises 1 cm beträgt, beträgt der Umfang des Kreises 1 x π cm oder etwa 3,14 cm. Klicken Sie hier für Details zu π (Umfangsverhältnis)

Deshalb

Sie können Grad (°) wie folgt in Bogenmaß (rad) umrechnen.

= 0 × π = 0.00000… rad __45 ° __ = (2 × π) ÷ 8 = 0.78539… rad (45 ° ist in 8 gleiche Teile von „2 × π“ unterteilt) __90 ° __ = (2 × π) ÷ 4 = 1.57079… rad (90 ° ist in 4 gleiche Teile von „2 × π“ unterteilt) __180 ° __ = (2 × π) ÷ 2 = 3.14159… rad (180 ° ist in zwei gleiche Teile von „2 × π“ unterteilt) __270 ° __ = (2 × π) ÷ 4 × 3 = __4.71238 __… rad (270 ° ist 3/4 von „2 × π“) __360 ° __ = (2 × π) = 6.28318… rad (360 ° ist „2 × π“)

Es ist eine kleine Erklärung für den Kreisverkehr, aber es ist einfacher, sich daran zu erinnern, wenn Sie den Standard __180 (°) = π (rad) __ beibehalten.

In der Ruby-Welt ist π = "Math :: PI"

Lassen Sie uns hier ein wesentliches Wissen über Ruby unterdrücken. Um π (≈3.14) im Code auszudrücken, benötigen wir die Hilfe eines Moduls namens "Math". Um das Modul aufzurufen, schreiben Sie "include Math" oben in den Code. Wenn Sie das Modul aufrufen, können Sie π einfach durch Schreiben von PI ausdrücken.

include Math

puts PI
#Ausgabeergebnis :: 3.141592653589793

Wenn Sie ein Modul in einer einzigen Aufnahme anstelle der gesamten Datei aufrufen möchten, verwenden Sie die folgende Methode (einschließlich der nicht benötigten mathematischen Version).

puts Math::PI
#Ausgabeergebnis :: 3.141592653589793

Referenz ... Der folgende Link führt auch die Methode der gegenseitigen Umrechnung zwischen Grad (°) und Bogenmaß (rad) ein. "Ruby-Code zum Konvertieren zwischen Radian und Grad" von @niwasawa

So verwenden Sie "Math :: atan2", um den Winkel aus den Koordinaten zu ermitteln

location.png

Wenn die x-Achse und die y-Achse wie oben beschrieben vorbereitet sind und die Koordinaten (Werte von x und y) angegeben sind, verwenden Sie eine andere Funktion "atan2", die vom oben genannten Mathematikmodul bereitgestellt wird. Sie können den Winkel (rad) finden.

include Math

def radian(x, y)
  return atan2(y, x)
  #Beachten Sie, dass die Reihenfolge der Argumente x und y umgekehrt ist
end

puts radian(5, 3)
#Ausgabeergebnis::   0.5404195002705842

Dies ist ein Ausgabeergebnis eines Bogenmaßes (rad), das nicht sehr bekannt ist. Fügen Sie daher im Folgenden "÷ π × 180" in die Methode ein, um es in Grad (°) umzuwandeln, und runden Sie es schließlich ab.

include Math

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

puts degree(5, 3).round
#Ausgabeergebnis::   31

Ich konnte den Winkel von 31 Grad sicher finden.

In welche Richtung geht Herr B aus der Sicht von Herrn A?

a_b.png

Wenn Sie die Koordinaten von Herrn A und die Koordinaten von Herrn B wie in der obigen Abbildung gezeigt erhalten, erstellen wir einen Code, damit Sie in 8 Richtungen antworten können, in welche Richtung Sie sich befinden. Übrigens möchte ich den Abstand zwischen den beiden messen. (Entfernungseinheit: m)

Spezifikation

Geben Sie die Koordinaten von Herrn A (x, y) und die Koordinaten von Herrn B (x, y) ein. ↓ Gibt die Richtung und Entfernung von Herrn A zu Herrn B aus

Eingang


A's Koordinaten(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein.
Die Koordinaten von Herrn A sind?◯ ◯ ← Hier eingeben
B's Koordinaten(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein.
Die Koordinaten von B sind?◯ ◯ ← Hier eingeben

Ausgabe


Herr B ist von Herr A aus in Richtung ◆◆ und ▲▲ m entfernt.

Ausnahmebehandlung


Die beiden sind am selben Ort.

Punkt 1 Denken Sie mit Herrn A als Ausgangspunkt (Mitte)

Wie in der Abbildung unten gezeigt, betrachten Sie Herrn A als Ausgangspunkt (Mitte), um herauszufinden, in welche Richtung Sie sich "von Herrn A aus gesehen" befinden. slide.mov.gif In diesem Fall ist es in Ordnung, Herrn A um -3 m in x-Richtung und + 2 m in y-Richtung zu bewegen, um Herrn A in die Mitte zu bringen. Bitten Sie daher Herrn B, sich ebenfalls um dieselbe Strecke zu bewegen.

A (3, -2) x ist -3, y ist +2 → A (0, 0) = Dies ist das Zentrum! Ebenso ... B (-2, -4) x ist -3, y ist +2 → __B (-5, -2) Es ist in Ordnung, wenn Sie die Richtung dieser Koordinate mit Math :: atan2 überprüfen! __ __

Punkt 2 Bereich des Rückgabewerts von Math :: atan2

Dieses Mal werden wir alle Richtungen untersuchen. Ich habe erwartet, dass der Wert zwischen 0 ° und 360 ° unter Verwendung von "atan2" erhalten werden kann, aber tatsächlich ist der von __ "atan2" zurückgegebene Wertebereich -π bis π (in Bezug auf die Frequenz) 180 ° ~ 180 °) wird entschieden __. Bei "zwischen 3:00 und 9:00" in den Zeigern der Uhr kommt ein negativer Wert zurück ...

Es gibt kein Problem, selbst wenn der Algorithmus gemäß dieser Spezifikation erstellt wurde, aber zum Studieren möchte ich eine Methode verwenden, um den erhaltenen Winkelwert hier in einen geeigneten Wert umzuwandeln __. Referenz: "Konvertieren eines Winkels in einen positiven Winkel (0 bis 359 Grad) mit Ruby" von @ massassiez

# -So konvertieren Sie einen Wert zwischen 180 und 180 in einen Wert zwischen 0 und 360(-Am Beispiel 120)

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

#Dadurch wird es in 240 konvertiert

Sowohl "%" als auch "Modulo" oben machen genau das Gleiche. Wenn der Rest (zu viel) durch 360 geteilt wird, wird er automatisch in den Bereich von 0 bis 360 konvertiert. (Modulo kann übrigens ohne Include Math verwendet werden)

Punkt 3 Verwenden Sie den Drei-Quadrat-Satz für die Entfernung

Verwenden Sie Drei-Quadrate-Theorem, um den Abstand zwischen zwei Punkten A (x, y) und B (x, y) zu ermitteln. Machen wir das.

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

Wenn Sie dies in Ruby tun, sieht es folgendermaßen aus.

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 ← im Quadrat
#  **(1/2.0)← Route(Quadratwurzel)tun

Abschlusscode

sampl.rb(Komplett)



#Dieses Mal möchte ich atan2 und PI verwenden, also deklarieren Sie zuerst Math einschließen
include Math

#Methode, um den Winkel zu finden
def degree(x, y)
  (atan2(y, x)/PI*180)%360
end

#Methode, um die Richtung zu finden
def compass(degree)
  if degree > 15 && degree < 75
     "Nordost"
  elsif degree >= 75 && degree <= 105
     "Norden"
  elsif degree > 105 && degree < 165
     "Nordwest"
  elsif degree >= 165 && degree <= 195
     "Westen"
  elsif degree > 195 && degree < 255
     "Südwesten"
  elsif degree >= 255 && degree <= 285
     "Süden"
  elsif degree > 285 && degree < 345
     "Süd-Ost"
  else
     "Osten"
  end
end

#Methode zum Ermitteln des Abstands zwischen zwei Punkten
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 "A's Koordinaten(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein."
print "Die Koordinaten von Herrn A sind? "
a_x, a_y = gets.split.map(&:to_i)

puts "Die Koordinaten von Herrn B.(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein."
print "Die Koordinaten von Herrn B. sind? "
b_x, b_y = gets.split.map(&:to_i)

if a_x == b_x && a_y == b_y
  puts "Die beiden sind am selben Ort."
  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 "Herr B sieht von Herrn A.#{direction}In der Richtung von#{distance}Ich bin weg."
#Innerhalb von 2 Metern ist dicht
distance > 2 ? (puts "Die soziale Distanz bleibt erhalten.") : (puts "Es ist dicht!")

Ausgabeergebnis

Herr A.(3,-2)B.(-2,-4)Im Falle von


A's Koordinaten(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein.
Die Koordinaten von Herrn A sind? 3 -2
Die Koordinaten von Herrn B.(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein.
Die Koordinaten von Herrn B. sind? -2 -4

↓ Ergebnis ↓

Herr B ist in südwestlicher Richtung von Herrn A, 5.4m entfernt.
Die soziale Distanz bleibt erhalten.

Herr A.(-1,-7)B.(1,-7)Im Falle von


A's Koordinaten(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein.
Die Koordinaten von Herrn A sind? -1 -7
Die Koordinaten von Herrn B.(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein.
Die Koordinaten von Herrn B. sind? 1 -7

↓ Ergebnis ↓

Herr B ist in östlicher Richtung von Herrn A, 2.Es ist 0m entfernt.
Es ist dicht!

Herr A.(4,3)B.(4,3)Im Falle von


A's Koordinaten(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein.
Die Koordinaten von Herrn A sind? 4 3
Die Koordinaten von Herrn B.(x, y)Bitte geben Sie zwei Zahlen mit halber Breite und einem Abstand von halber Breite ein.
Die Koordinaten von Herrn B. sind? 4 3

↓ Ergebnis ↓

Die beiden sind am selben Ort.

Wie oben erwähnt, "Erforderliche Mindestkenntnisse beim Umgang mit" Winkeln "und" Koordinaten "in Ruby + In welche Richtung ist Herr B aus der Sicht von Herrn A? Es war "Algorithmus". Danke für Ihren Besuch!

Recommended Posts

Erforderliche Mindestkenntnisse beim Umgang mit "Winkeln" und "Koordinaten" in Ruby + In welche Richtung ist Herr B aus der Sicht von Herrn A? Algorithmus
[Python] Vorsichtsmaßnahmen beim Ermitteln der Maximal- und Minimalwerte mit einem Numpy-Array mit einer kleinen Anzahl von Elementen
Was tun, wenn ein Teil des Hintergrundbilds transparent wird, wenn Sie transparente Bilder mit Pillow kombinieren?
[Python] Was tun, wenn beim Importieren aus dem zu sys.path hinzugefügten Verzeichnis gegen PEP8 verstoßen wird?
[CleanArchitecture mit Python] Wenden Sie CleanArchitecture Schritt für Schritt auf eine einfache API an und versuchen Sie zu verstehen, welche Art von Änderung in der Codebasis stark ist.
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Darstellung von Containern in einem verschachtelten Rahmen (schematisch) in Jupyter und was ich bei der Erstellung untersucht habe