Finden Sie den Winkel zwischen zwei Punkten


13

Bestimmen Sie bei zwei Punkten Aund Bden Winkel von Linie AOzu Linie BOum den Punkt, an Odem Osich der Ursprung befindet ( (0,0)). Zusätzlich kann der Winkel abhängig von der Position der Punkte positiv oder negativ sein (siehe Beispiele). Die Eingabe erfolgt in Punkten Aund Bund kann in beliebiger Form erfolgen. Die Ausgabe ist der Winkel in Grad (aber positiv, wenn AOgegen den Uhrzeigersinn gedreht, um den Ursprung zu erhalten, BOund negativ, wenn im Uhrzeigersinn gedreht). Wenn der Winkel 180 Grad beträgt, können Sie eine negative oder positive Ausgabe zurückgeben. Ebenso kann der Winkel die positive oder negative Version desselben Winkels sein ( 90 degist gleich -270 deg). Beispiele:

  • Eingabe: A(5,5) B(5,-5)Ausgabe: -90( AOwird um -90Grad gedreht BO).

  • Eingabe: A(5,-5) B(5,5)Ausgabe: 90( AOwird um 90Grad gedreht BO).

Das ist , also gewinnt der kürzeste Code in Bytes!


11
Wie viel Präzision ist erforderlich?
Reto Koradi

2
Können wir Eingaben als zwei komplexe Zahlen annehmen?
Lirtosiast

5
Was soll die Ausgabe sein, wenn ein Punkt ist (0,0)?
Lirtosiast

1
@ThomasKwa Ich kenne das OP nicht, aber ich habe es als Eingabe von Ganzzahlen / Dezimalzahlen behandelt, und die Eingabe hätte niemals einen (0,0) -Punkt.
GamrCorps

2
Hinweis: Der Winkel zwischen AOund wird BOnormalerweise Winkel genannt AOB.
ETHproductions

Antworten:


12

Pyth, 11 Bytes

.t-FPM.jMQ6

Demonstration

Die Eingabe erfolgt im Format:

[[Bx, By], [Ax, Ay]]

Wenn gewünscht wird, dass A zuerst kommt, kann dies für 1 Byte geändert werden.

Erläuterung:

.t-FPM.jMQ6
               Implicit: Q = eval(input())
      .jMQ     Convert input pairs to complex numbers.
    PM         Take their phases (angles in the complex plane).
  -F           Take the difference.
.t        6    Convert to degrees

22

TI-BASIC, 13 Bytes

Für Taschenrechner der Serie TI-83 + / 84 +.

Degree
Input Y
min(ΔList(R►Pθ(Ans,∟Y

Um dieses Programm zu verwenden, geben Sie die Liste {x1,x2}über die Ans-Variable und {y1,y2}an der Eingabeaufforderung ein.


Ist ein TI-BASIC-Befehl ein einzelnes Byte?
Corsika

Alle Befehle hier, mit der Ausnahme ΔList(, sind ein Byte jeder. Dies beinhaltet R►Pθ(.
Lirtosiast

+1 nur für die Taschenrechnerprogrammierung. Bringt mich zurück zu Trig and Calculus in meinen Highschool-Tagen.
? A? Вᴎєƞнє

Nizza Hinweis! Super cool.
Corsika

10

CJam, 14 Bytes

q~::ma:-P/180*

Dies ist ein vollständiges Programm, das die Eingabe [[Ax Ay] [Bx By]]ab STDIN liest .

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

q~             e# Read and evaluate all input.
  ::ma         e# Replace each point (x, y) with atan2(x, y).
               e# This returns its angle with the positive y axis, measured clockwise.
      :-       e# Compute the difference of the two resulting angles.
               e# This returns the angle between the points, measured counter-clockwise.
        P/180* e# Divide by Pi and multiply by 180 to convert to degrees.

5
Amüsant, dass fast die Hälfte dieses Programms nur Bogenmaß in Grad
umrechnet

@DarrelHoffman finde ich es noch amüsant , dass in Pyth die Umwandlung 3 Bytes statt 6, so dass , wenn die die Sprachen erlaubt Herausforderung gebunden würden in Radian für die Berichterstattung
FryAmTheEggman

5

Minkolang 0,9 , 112 Bytes

Ich möchte Trigger-Funktionen jetzt wirklich als integrierte Funktionen implementieren ... aber das hat Spaß gemacht! (Vorsichtsmaßnahme: Dies gibt die positive Winkeldifferenz aus, nicht die vorzeichenbehaftete Winkeldifferenz. Angesichts meiner Einschränkungen denke ich, dass dies gerechtfertigt ist.)

4[n]0c2c*1c3c*+r4[2;1R]r+1R+0g*12$:;$:8[0ci2*3+d1R;0g$:1i1+[i2*1+d1+$:*]*]$+'3.141592654'25*9;$:$:12$:r-66*5**N.

Probieren Sie es hier aus.

Erläuterung

Ich werde eine ausführlichere Erklärung veröffentlichen, wenn es jemand möchte, aber das Wesentliche ist:

4[n]                                    Take in 4 integers from input
0c2c*1c3c*+                             dot product
r4[2;1R]r+1R+0g*12$:;                   magnitudes of vectors
$:                                      dot product divided by magnitudes (z)
8[0ci2*3+d1R;0g$:1i1+             *]    Taylor series for arccos
                     [i2*1+d1+$:*]      In particular, the coefficient (1/2 * 3/4 * ...)
$+                                      Add them all up!
'3.141592654'25*9;$:$:                  Divide by pi for converting to degrees
12$:r-                                  Subtract from 1/2 - I now have arccos(z)
66*5**                                  Convert to degrees
N.                                      Output as number and stop.

Unterstützt Minkolang Kommentare? Ich konnte es in der Readme nicht finden.
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Es ist genau wie in anderen 2D-Sprachen - Kommentare sind alles, was der Programmzähler nicht erreicht.
El'endia Starman

Na gut, dann. Das macht Sinn, weiß nicht, was ich gedacht habe.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ: Ihre explizite Verwendung von Kommentaren in einer Ihrer Antworten veranlasst mich jedoch, ähnliche Funktionen zu implementieren. Es ist eine nette Idee und es wäre nicht sehr schwer für mich, sie umzusetzen.
El'endia Starman

Vielen Dank! :DWar es die Hello World-Herausforderung, die Sie bemerkten, dass die Kommentare in (FYI, dem Interpreter, den ich für Simplex erstellt habe, in verschiedenen "Modi" ablaufen: String-Modus und Kommentar-Modus. Es macht das Parsen wirklich einfach und ermöglicht Ihnen, Signalzeichen eines zu ignorieren Modus während in der anderen.)
Conor O'Brien

4

Mathematica, 22 Bytes

{-1,1.}.ArcTan@@@#/°&

Beispiel:

In[1]:= {-1,1.}.ArcTan@@@#/°&[{{5,5},{5,-5}}]

Out[1]= -90.

In[2]:= {-1,1.}.ArcTan@@@#/°&[{{5,-5},{5,5}}]

Out[2]= 90.

Funktioniert dies für Eingaben wie{{0,1},{1,0}}
Lirtosiast

@ ThomasKwa Natürlich wird es.
alephalpha

4

Javascript, 66 Bytes

let f=(a,b)=>(Math.atan2(b.y,b.x)-Math.atan2(a.y,a.x))*180/Math.PI;

Demo


23 Sekunden vor mir = P Nettes Golfen! Übrigens können Sie das weglassen let f=, und es gilt immer noch als anonyme Funktion.
Mwr247,

3

Julia, 18 25 Bytes

f(A,B)=angle(B/A)/pi*180

Dies setzt voraus, dass "jede bequeme Form" bereits erlaubt Aund Bals komplexe Zahlen angegeben werden kann. Dann macht die komplexe Zahlenarithmetik das ganze schwere Heben.

Bearbeiten: Snippet in Funktion konvertiert. Die 18-Byte-Version funktioniert nur in der Julia REPL.


3

Python 2.7, 73 Bytes

from math import*
f=lambda A,B:degrees(atan2(B[1],B[0])-atan2(A[1],A[0]))

Prüfung:

f((5,5),(5,-5)) #-90.0
f((5,-5),(5,5)) #90.0

Willkommen bei PPCG! Dies ist Codegolf, deshalb sollten Sie versuchen, so viele Leerzeichen wie möglich zu entfernen und Ihren Code zu verkürzen.
mbomb007

1
Sie können Ihren Code *
verkürzen,

3

Oktave, 43 Bytes

f=@(a,b)(cart2pol(b)-cart2pol(a))(1)*180/pi

Input-Output:

octave:40> f([5,5],[5,-5])
ans = -90

octave:41> f([1,0],[0,1])
ans = 90

3

CJam, 15 Bytes

l~ma@@ma-P/180*

Dachte, ich komme auch ins CJam-Spiel. Probieren Sie es online aus . Die Eingabe erfolgt in Form von bx by ax ay. Leider ist dies die kürzeste Methode, um diese Herausforderung zu bewältigen, ohne Dennis 'Antwort zu kopieren.


3

TeaScript, 28 Bytes

Ich sollte wirklich Triggerfunktionen implementieren ...

$.atan2(_[3]-y,z-x)*180/$.PI

Probieren Sie es aus Online- Eingabe ista.x a.y b.x b.y

Erläuterung

$.atan2(       // Arc Tangent of...
    _[3] - y,  // 4th input - 2nd input
       z - x,  // 3rd input - 1st input
) * 180 / $.PI // Converts rad -> deg

2

Ruby, 64 , 58 Bytes

a=->(b){b.map{|c|Math.atan2(*c)}.reduce(:-)*180/Math::PI}

Verwendung

a.call [[5, 5], [5, -5]] # => -90.0
a.call [[5, -5], [5, 5]] # => 90.0

2

JavaScript, 49 Bytes

(a,b)=>((c=Math.atan2)(...b)-c(...a))/Math.PI*180

Die Eingabe erfolgt in Form von: [aY, aX], [bY, bX](Beachten Sie das umgekehrte x / y)


1

Simplex v.0.7 , 13 Bytes

Ich bin froh, dass ich hinzugefügt habe mathrelations: D Leider kann ich keine punktweisen Eingaben machen. Also gebe ich jeden Punkt als separate Zahl ein (Axe, Ay, Bx, By). (Ich habe dies als Ressource verwendet.)

(iRi~^fR)2LSo
(       )2    ~~ repeat inner twice
 iRi          ~~ take two chars of input (x,y)
    ~         ~~ switch top 2 on stack
     ^f       ~~ apply atan2 on (y,x)
       R      ~~ go right
          L   ~~ go left
           S  ~~ subtract result
            o ~~ output as number

Ich kann ein Zeichen speichern, wenn ich Eingaben als (Ay, Axe, By, Bx) annehmen kann:

(iRi^fR)2LSo

1

C 88 Bytes

#include<math.h>
typedef double d;d g(d x,d y,d a,d b){return atan2(b-y,a-x)*180/M_PI;}

Erfordert das Kompilieren mit GCC, um den Vorteil zu nutzen M_PI, math.hals Teil der integrierten mathematischen Konstanten von GCC definiert zu werden . Probieren Sie es online aus - da ideone (anscheinend) kein GCC verwendet, sind einige zusätzliche Bytes erforderlich, damit genügend Stellen von π genau sind.


Oder 45/atan(1)statt 180/3.14159....(in der Online-Demo).
CompuChip

@CompuChip Ich habe nicht versucht, die Online-Demo maximal zu golfen
Mego

Sie können die Klammern um atan2 (by, ax) entfernen, obwohl Sie dann nach der Rückkehr ein Leerzeichen benötigen, um nur 1 Byte zu sparen. Wenn Sie K & R-Stilfunktionen verwenden können, verdoppeln Sie g (x, y, a, b) mit x, y, a, b; spart auch sechs Bytes.
Alchymist
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.