Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03497.jsonl.gz/1613

Ich zeige, wie durch Definieren eines speziellen Koordinatensystems sich die Aufgabe wesentlich vereinfachen lässt. Ich leite die Gleichungen her und erstelle ein JavaScript, welches die Schnittpunkte zweier beliebiger Kreise berechnet. Eine interaktive Animation zeigt das JavaScript in Aktion.
Gegeben seien die zwei Kreise A und B. Von jedem Kreis kenne ich die Zentren
Wenn ich das Koordinatensystem ins Zentrum von Kreis A lege und die X-Achse durch das Zentrum von Kreis B lege, ergibt sich ein symmetrisches System bezüglich der X-Achse. Dadurch erhalte ich besonders einfache Formeln für Kreise. So lässt sich die Aufgabe leicht lösen. Danach kann ich die Lösung wieder in die Vektorform bringen.
In der Grafik bilden der Abschnitt x und y zusammen mit dem Radius a ein rechtwinkliges Dreieck. Für dieses gilt nach Pythagoras die Formel (1).
c sei die Strecke auf der X-Achse von A bis B. Dann bildet der Abschnitt c − x und y mit dem Radius b ebenfalls ein rechtwinkliges Dreieck, für welches die Formel (2) gilt:
|(1)||

|(2)||

|wobei'||

Der Abstand der beiden Kreise c berechnet sich wiefolgt aus den beiden Kreiszentren A und B:
|(3)||

Wir haben nun zwei Gleichungen (1) und (2) für die beiden Unbekannten x und y. Diese gilt es nun zu berechnen. Dazu löse ich (1) nach y2 auf:
|(4)|
und ersetze in (2) y2 durch den rechten Teil von (4):
|(5)|
Ausmultiplizieren ergibt:
|(6)|
Die x2 heben sich auf. Es kommt nur noch x ohne Potenz vor. Ich kann somit nach x auflösen:
|(7)||

Beachte, dass x nur definiert ist, wenn c ≠ 0 ist. Ist c = 0, dann sind die beiden Kreiszentren identisch. Wenn die beiden Radien ebenfalls identisch sind, ist der ganze Kreisumfang der beiden Kreise eine Lösung. Sind die Radien verschieden, gibt es keinen Schnittpunkt.
Wenn c ≠ 0 ist, kann ich y mit der Formel (4) berechnen und erhalte die zwei Lösungen:
|(8)||

Beachte, dass es nur eine Lösung gibt, wenn der Ausdruck unter der Wurzel positiv ist, also wenn a2 ≥ x2 ist. Ist dies nicht der Fall, sind die Kreise zu weit voneinander weg und schneiden sich deshalb nicht. Ist der Ausdruck unter der Wurzel gerade 0, dann berühren sich die beiden Kreise in einem Punkt.
Um die obigen Lösungen x und y1,2 wieder ins ursprüngliche Korrdinatensystem der Kreise zu transformieren, brauche ich die Einheitsvektoren
Der Einheitsvektor der X-Achse
|(9)|
|(10)|
Den Einheitsvektor in Y-Richtung
|(11)|
|(12)|
Die Schnittpunkte Q1 und Q2 erhalte ich, indem ich von
|(13)||

oder in Komponenten ausgeschrieben:
|(14)|
|und|
Der Schnittpunkt Q1 liegt damit immer links von der Achse AB.
Hier nochmals alle benötigten Formeln in der Reihenfolge der Berechnung, zusammengefasst an einer Stelle:
|(15)|
Wenn c = 0 ist, sind die Kreiszentren identisch, d.h. es gibt keine Lösung, wenn a ≠ b ist. Wenn a = b ist sind die Kreise identisch, d.h. der Kreis selbst ist die Lösungsmenge. Wenn c > 0 ist, können wir weiterrechnen:
|(16)|
Wenn x2 > a2 ist, wird der Ausdruck unter der Wurzel in der nächsten Formel negativ. Das Bedeutet dann, dass die beiden Kreise keinen Schnittpunkt haben. Es gibt dann keine Lösung. Wenn x2 = a2 ist, wird y = 0. In diesem Fall gibt es nur einen Schnittpunkt, an dem sich die beiden Kreise berühren. Es reicht in dem Fall, Q1 zu berechnen, denn wenn wir y = 0 in die nachfolgenden Formeln einsetzen erhalten wir für beide Punkte die selben Formeln:
|(17)|
Nun können wir die beiden Schnittpunte nach folgenden Formeln berechnen:
|(18)|
|und|
Vektoren sind 2-dimensionale Arrays mit den X- und Y-Koordinaten der Punkte. Das JavaScript gibt als Lösung einen Array mit den zwei Vektoren
function Intersect2Circles( A, a, B, b ) { // A, B = [ x, y ] // return = [ Q1, Q2 ] or [ Q ] or [] where Q = [ x, y ] var AB0 = B[0] - A[0]; var AB1 = B[1] - A[1]; var c = Math.sqrt( AB0 * AB0 + AB1 * AB1 ); if (c == 0) { // no distance between centers return []; } var x = (a*a + c*c - b*b) / (2*c); var y = a*a - x*x; if (y < 0) { // no intersection return []; } if (y > 0) y = Math.sqrt( y ); // compute unit vectors ex and ey var ex0 = AB0 / c; var ex1 = AB1 / c; var ey0 = -ex1; var ey1 = ex0; var Q1x = A[0] + x * ex0; var Q1y = A[1] + x * ex1; if (y == 0) { // one touch point return [ [ Q1x, Q1y ] ]; } // two intersections var Q2x = Q1x - y * ey0; var Q2y = Q1y - y * ey1; Q1x += y * ey0; Q1y += y * ey1; return [ [ Q1x, Q1y ], [ Q2x, Q2y ] ]; }
Mit Hilfe des Formulars kannst du die Schnittpunkte Q1 und Q2 zweier Kreise A und B berechnen. Zusätzlich werden die Zwischenresultate c, x und y der obigen Formeln angezeigt.
Kann mir hier mal jemand helfen, ich Blick gar nicht durch. Hab zwei Kreise, Kreis 1: R=20,205 mm und Kreis 2: R=14,4 mm. Kreis 1: R 20,205 hat die Mittelpunkte x=0 und y=0 ; Kreis 2: R 14,4 x=13,35 y=0
Wollt die genauen Formeln die ich in den Taschenrechner tippen muss :(
@Steffen
Im allgemeinen Fall kann man keine einfache Formel für die Schnittpunkte zweier Kreise angeben. Die Berechnung muss in mehrere Schritte aufgeteilt werden. Je nach Zwischenresultat eines dieser Schritte kann man nicht weiter rechnen, weil in diesen Fällen gar keine Schnittpunkte existieren (Kreise sind zu weit voneinander entfernt, oder ein Kreis liegt vollständig innerhalb des anderen, oder beide Kreise haben das gleiche Zentrum).
In deinem Fall, wo der erste Kreis Ax = Ay = 0 und der Zweite Kreis By = 0 hat, können die allgemeinen Formeln stark vereinfacht werden, eben weil viele Werte Null sind und man daher nicht mit Vektoren weiterrechnen muss. In diesem Fall sehen die Formeln wiefolgt aus, wobei c durch Bx ersetzt werden kann:
Wenn x2 nun grösser als Radius a2 des Kreises A ist, gibt es keine Schnittpunkte (der Wert unter der Wurzel unten wäre dann negativ). Ansonsten können wir weiterrechnen:
Und damit wären dann die Schnittpunkte:
Für alle weiteren Fälle kannst du neu das obige Rechenformular verwenden.
Hallo,
ich komme bei einer Aufgabenstellung nicht weiter. Zu bestimmen sind die Schnittpunkte zweier Kreise, dabei bewegt sich der kleinere Kreis auf der Tangente des anderen. Es muss also eine Funktion aufgestellt werden, die die Schnittpunkte in Abhängigkeit zur Position des Zentrums des kleinen Kreises auf der Tangente beschreibt.
Vielleicht kann mir jemand helfen.
Danke
@Joahnnes
Ich bin mir nicht sicher, ob ich die Aufgabe richtig verstanden habe. Wenn das Zentrum des einen Kreises, sagen wir Kreis A, auf der Tangente des anderen Kreises B liegen soll und das Ganze ohne konkrete Zahlenwerte, also als Formeln ausgedrückt werden soll, muss zuerst eine Gleichung für die Tangente aufgestellt werden.
Eine Tangente ist eine Gerade, die in folgender Form als Vektor-Gleichung geschrieben werden kann:
|(19)|
|wobei'||

In Komponenten ausgeschrieben:
|(20)|
|und|
Der Berührungspunkt T liegt auf dem Kreis B. Ein solcher Punkt kann in Abhängigkeit eines Winkels
|(21)|
|und|
|wobei'||

Der Tangentenvektor
|(22)|
|und|
Damit wird die allgemeine Tangentengleichung für eine beliebige Tangente an den Kreis B:
|(23)|
|und|
Der Punkt P liegt immer auf der Tangente an den Kreis B. Der Punkt P soll laut Aufgabe das Zentrum des Kreises A sein. Wir müssen daher in allen Kreisgleichungen unter Zusammenfassung Ax = Px und Ay = Py setzen. Dann erhalten wir allgemeine Formeln für die Schnittpunkte der Kreise in Abhängikeit des Paramters
Beachte: das Ganze in eine einzige Formel zu packen ist viel zu unübersichtlich!
Hey wabis,
danke für die schöne Aufbereitung und gute Erklärung!
Eine sehr transparente und präzise Darstellung - vielen Dank für Arbeit!
Gibt es auch eine Möglichkeit die Schnittfläche zu bestimmen?
Ich stehe vor dem Problem, dass ich zwei Mengen sowie die gemeinsame Schnittmenge grafisch darstellen möchte. Jetzt weiß ich aber leider nicht wie weit die Kreise auseinander sein müssen damit die korrekte Schnittfläche grafisch dargestellt wird.
LG, Andi
Hallo Andi
Ich habe eine Seite erstellt, wo Du das alles nachlesen kannst. Es gibt auch ein Rechenformular dazu.
Schnittfläche zweier Kreise (JavaScript)
Sehr anschaulich und leicht nachvollziehbar dargestellt.
Hallo Herr Bislin,
da ich selber blogge und ebenfalls kostenfrei Lösungen für die Öffentlichkeit bereitstelle, vermute ich, daß auch Sie sich über positives feedback freuen. 8-)
Deshalb möchte ich Ihnen meine konkrete Anwendung vorstellen, die ich mit Ihrer Hilfe implementieren konnte: eine voll-parametrierte Kinematik-Simulation der Federbeinanlenkung bei Ducati V4 Motorrädern:
https://vielzutun.ch/
Schwinge: grün
Umlenkhebel: blau
Zugstrebe: rot
Federbein: gelb
Mittels Ihrer Anleitung konnte ich konkret das Problem lösen, die Position des gemeinsamen Gelenks von Zugstrebe (rot) und Umlenkhebel (blau) zu finden.
In der o.a. Simulation den untersten Slider verschieben, dann bewegt sich die gesamte kinematische Kette. (Tut sie auch, wenn sie einzelne Parameter verändern ...)
Daher an dieser Stelle von mir ein ganz dickes Kompliment!! Im noch zu erstellenden Blog-Artikel zum Thema werde ich Ihnen den gebührenden Platz und öffentlichen Dank zukommen lassen.
Besten Dank für Ihren wertvollen Beitrag!
Chris
Hallo, vielen Dank für die tolle Erklärung und Formelsammlung!
In der Schule habe ich das zwar auch mal alles gelernt, aber über ein Jahrzehnt später, hat man die Formeln dann doch nicht griffbereit, wenn man sie braucht ;-)
Ein Feedback noch zur Darstellung, wenn man das Fenster sehr schmal zieht (in der Horizontalen) werden die Formeln rechts abgeschnitten - ich hab ganz schön lange nach meinem Fehler gesucht, weil die Punkte nicht passten und irgendwie fehlte mir auch die Symmetrie der + und - Zeichen. Vielleicht kann man das so umbauen, dass die Formeln entweder nicht abgeschnitten werden und herausragen oder aber einen Scrollbalken bekommen.
schöne Grüße!