Mittelpunkt und Radius aus 2x Tangente und 1x Punkt

Aufrufe: 553     Aktiv: 15.01.2021 um 11:41

0

Hallo,

für ein Projekt an einer CNC Maschine benötige ich den Mittelpunkt eines Kreises und den Radius, welcher durch 2x Tangeten (P1-P2 und P3-P4) und 1x Punkt (P5) definiert ist. Die CAM Software bietet leider keine entsprechende Hilfsgeometrie an. Kann mir da jemand den Rechenweg aufzeigen? Da ich kein Mathematiker bin, genügen mir allerdings nicht einfach ein Lösungsansätze. Am vorteilhaftesten wäre eine Formel, die ich in meinem Programmcode übersetzen könnte. Da es wohl immer 2x Lösung gibt, wir benötigen immer den kleineren Kreis.

Viele Grüße

Dieter

Diese Frage melden
gefragt

Punkte: 14

 

Ich schau mir das später nochmal genauer an, könnte mir aber vorstellen, dass das Ganze auf die Lösung des Gleichungssystems \[\begin{gather} ||P5 - M|| = r \\ ||g(s)-M|| = r \\ ||h(t) - M|| = r \\ \langle M-g(s), v\rangle = 0 \\ \langle M-h(t)), w\rangle = 0 \end{gather}\]
hinausläuft, wobei \(M\) den Mittelpunkt darstellt und \(g\) und \(h\) die Tangentengleichungen mit jeweiligen Richtungsvektoren \(v\) und \(w\) darstellen.
  ─   posix 09.01.2021 um 12:44
Kommentar schreiben
1 Antwort
0

Eine Lösungsmöglichkeit stellt die Lösung des Gleichungssystems \[\begin{align} ||P5 - M|| - r = 0 \\ ||g(s)-M|| - r = 0 \\ ||h(t) - M|| - r = 0 \\ \langle M-g(s), v\rangle = 0 \\ \langle M-h(t)), w\rangle = 0 \end{align}\] dar, 5 unabhängige Gleichungen für 5 Variablen liefern eine eindeutige Lösung.
Die Bestimmung ist nur numerisch möglich, wie du das letztendlich implementierst hängt wohl stark von der verwendeten Programmiersprache ab.
Für mathematische Berechnungen ausgelegte Sprachen wie Matlab, R, Julia, usw. sollten aber einfach Funktionen zum Lösen solcher nichtlinearen Gleichungssysteme bieten.

Hier eine mögliche Implementierung in Julia (ist recht häßlich, da ich das ursprünglich bloß zur Überprüfung verwendet habe). Ich hab mal mit ein paar Werten rumgespielt, es scheint soweit sinnvolle Ergebnisse zu liefern.

Wenn du es Bare-Metal implementieren willst, könntest du das Newton-Verfahren verwenden: \[x_{k+1} = x_k - J_f^{-1}(x_k) f(x_k)\] wobei \(f\) hier die Funktionen auf der jeweils linken Seite des obigen Gleichungssystems sind, und \(J_f\) ihre Jakobimatrix ist, \(x_k\) kann man in beliebiger Reihenfolge definieren, z.B. mit \(x_1\) = x-Koord und \(x_2\) = y-Koordinate des Mittelpunkts, \(x_3\) = Radius des Kreises und \(x_{4,5}\) = s und t.

Mit etwas Umstellung muss man nun für jede Iteration \(x_k \rightsquigarrow x_{k+1}\) das lineare Gleichungssystem \(J_f(x_k) \Delta x_k = f(x_k)\) für\(\Delta x_k\) lösen (z.B. Gauß-Algorithmus - man kann natürlich auch einfach die Inverse berechnen), wobei dann \(x_{k+1} = x_k - \Delta x_k\).
Man benötigt noch einen Startwert \(x_0\), bei dessen Wahl man etwas aufpassen muss, normalerweise sollte es jedoch kein Problem darstellen. Üblicherweise beendet man das Verfahren nach Unterschreiten einer gewissen Toleranz (= Abbruchbedingung) wenn \(||x_{k+1} - x_k|| < TOL\)

Für die Jacobimatrix erhält man (Erste 3 Gleichungen quadriert) sowas wie  \[J_f(x) = \begin{pmatrix} -2(E-M)^T & -2r & 0&0 \\ -2(g(s)-M)^T & -2r & 2\langle g(s) - M, v\rangle & 0\\ -2(h(t) - M)^T & -2r & 0 & 2\langle h(t)-M,w\rangle\\ v^T & 0 & -||v||^2 & 0\\w^T & 0 & 0 & -||w||^2\end{pmatrix}\]

Diese Antwort melden
geantwortet

Student, Punkte: 1.05K

 

Kommentar schreiben