0 Daumen
1,7k Aufrufe

Aufgabe:

Wie berechne ich im Kreis Winkel mit arctan2?


Problem/Ansatz:

gegeben sind Mittelpunkt un zwei Punkte, wie kann man mit arctan2 den Winkel punkt1MittelpunktPunkt2 berechnen?

Avatar von

3 Antworten

0 Daumen
 
Beste Antwort

Hallo,

Die Funktion (keine mathematische!) atan2(), die von vielen Programmiersprachen zur Verfügung gestellt wird, dient dazu, einen Winkel eindeutig in einem Intervall von \((-\pi;\pi]\) zu berechnen. Dies ist mit dem üblichen Verdächtigen mathematischen Funktionen \(\arccos\) bzw. \(\arctan\) nicht möglich.

Gegeben sei ein Vektorenpaar \(a\) (rot) und \(b\) (blau). Der Winkel (blau) von \(Q\) bzw. \(a\) nach \(P\) bzw. \(b\) sei \(\varphi\)

blob.png

wobei hier:

$$a = \begin{pmatrix} a_x\\a_y \end{pmatrix}= \vec{MQ} = Q-M = \begin{pmatrix} q_x-m_x\\ q_y-m_y \end{pmatrix} \\ b = \begin{pmatrix} b_x\\b_y \end{pmatrix}= \vec{MP} = P - M = \begin{pmatrix} p_x-m_x\\ p_y-m_y \end{pmatrix} $$Nun ist $$\begin{aligned}a \times b &= \left|\begin{array}{cc} a_x& b_x\\ a_y& b_y \end{array} \right| \\ &= a_x \cdot b_y - a_y \cdot b_x = |a|\cdot |b| \cdot \sin \varphi \\ a \cdot b &= a_x \cdot b_x + a_y \cdot b_y = |a| \cdot |b| \cdot \cos \varphi\end{aligned}$$

Daraus folgt dann auch$$\tan \varphi = \frac{\sin \varphi}{ \cos \varphi} = \frac{|a|\cdot |b| \cdot \sin \varphi}{ |a| \cdot |b| \cdot \cos \varphi}= \frac{a \times b }{a \cdot b}$$

Bei dieser Division geht eine Richtungsinformation verloren, da der Arcustangens nur im Bereich von \([-\pi/2;\, \pi/2]\) eindeutig ist. Deshalb wird in vielen Programmiersprachen die besagte Funktion atan2() zur Verfügung gestellt, der beide Werte übergeben werden:

$$\begin{aligned} y &= a_x \cdot b_y - a_y \cdot b_x \\ x &= a_x \cdot b_x + a_y \cdot b_y \\ \varphi &= \text{Math.atan2}(y,x)\end{aligned}$$

(z.B. für Javascript) \(\varphi\) wird im Bogenmass zurück gegeben. Die Umwandlung in Grad geschieht durch Multiplikation von:

$$\begin{aligned} \text{rad\_to\_degree} &= 180./\text{Math.PI} \\ \varphi_{\text{deg}} &= \varphi \cdot \text{rad\_to\_degree}\end{aligned}$$

So liegt \(\varphi_{\text{deg}}\) im Intervall von \((-180°; \, +180°]\) und ist eindeutig.

Avatar von 48 k

Korrektur: \(x\) und \(y\) waren vertauscht. Der 'x'-Wert ist immer das Skalarprodukt - siehe auch hier.

Danke für diese ausführliche und einleuchtende Antwort. Ich habe folgende Funktion aufgestellt:

function calculateAngleArc2(pX, pY, qX, qY) {
//
let y = (qX * pY) -(qY * pX);
let x = (qX * pX) + (qY * pY);
let alphaRadian = Math.atan2(y, x);
let alpha = radiansToDegrees(alphaRadian);
console.log(alpha);
return alpha;
}

pX,pY sind die Berührpunkte der Tangenten.

qX,qY ist der minimale Punkt , also der mittlere Kreis, Punkt oben.

Ich habe einen test gemacht, mit vier Kreisen.

blob.png


Tangente rosa Kreis, Winkel 0

schwarzer Kreis Winkel 90

gelber Kreis Winkel 180

roter Kreis Winkel 270


Ausgabe im Test:

0
10.388857815469612
9.593134262730338
0.7957235527392739


und das ergibt für mich keinen Sinn...

pX,pY sind die berührpunkte der Tangenten.
qX,qY ist der minimale Punkt , also der mittlere Kreis, Punkt oben.

wenn \(p_{x,y}\) und \(q_{x,y}\) die Koordinaten von Punkten in einem Koordinatensystem sind, liefert Dir die Funktion den Winkel unter dem die beiden Punkte aus Sicht des Ursprungs des gewählten Koordinatensystems erscheinen.

Das ist sicher nicht das, was Du erreichen willst!

Beim Aufruf der Funktion, muss Du den Scheitelpunkt (z.B.: \(m_{x,y}\)) von beiden Punkten abziehen - etwa in der Form:

calculateAngleArc2(pX-mX, pY-mY, qX-mX, qY-mY);

dann liefert Dir die Funktion den Winkel zwischen \(\vec{MQ}\) und \(\vec{MP}\)

Danke Werner, das ist mir grad selbst aufgefallen. ich kann nur so abgehackt arbeiten, deshalb schreibe ich zwischendurch. ich habe den Bezug zum Mittelpunkt nicht. das ist mir unterwegs aufgefallen, habe Deine Erklärung nochmals durchgelesen und dachte direkt Aja.

Die Funktion habe ich angepasst

function calculateAngleArc2(qX, qY,pX, pY,mx,my) {
//q ist der Bezugspunkt, p ist der Tangentenpunkt, m der Mittelpunkt
let ax = qX-mx;
let ay = qY-my;
let bx = pX-mx;
let by = pY -my;
let y = (ax * by) -(ay * bx);
let x = (ax * bx) + (ay * by);
let alphaRadian = Math.atan2(y, x);
let alpha = radiansToDegrees(alphaRadian);
console.log(alpha);
return alpha;
}

für die gleichen Kreise wie oben mit den Winkeln 0,90,180,270

Bekomme ich nun:

0
 -9.462322208025617
 -28.072486935852957
-14.036243467926479

Irgendetwas stimmt nicht.

Hab’s gefunden. Jetzt stimmt alles . DANKE!

0 Daumen

Warum mit arctan?

Für Winkelberechnung zwischen zwei Vektoren ist das Skalarprodukt der gängige Weg.

Avatar von 55 k 🚀

So mache ich das bis jetzt, ich wollte die Anpassung an 360 Grad vereinfachen.

0 Daumen

Hallo

wenn der arctan des Winkels gegeben ist tippt man 2 und dann tan-1 oder arctan in einen TR oder online TR ein und findet 63,435°

oder war das ne andere Frage? zeichnerisch. an dem einen Punkt des Kreises eine Tangente legen, vom Punkt aus 2*r antragen,. Mittelpunkt mit dem Ende verbinden.sollte durch den 2 ten Punkt gehen. Aber warum, wenn du 2 Punkte hast warum zeichnest du den Winkel nicht einfach?

Avatar von 108 k 🚀

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community