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!

Alien G
quelle
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
isaacg
quelle
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.

Lirtosiast
quelle
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.
Dennis
quelle
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.
El'endia Starman
quelle
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.
Alephalpha
quelle
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

lecoco
quelle
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.

ojdo
quelle
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
Aetienne Sardon
quelle
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
dcsohl
quelle
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.

GamrCorps
quelle
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
Downgoat
quelle
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
Harte Gupta
quelle
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)

Mwr247
quelle
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
Conor O'Brien
quelle
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.

Mego
quelle
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