Schnittpunkte zweier Kreise

Neue Frage »

tubias Auf diesen Beitrag antworten »
Schnittpunkte zweier Kreise
Hallo
Ich möchte die Schnittpunkte zweier Kreise berechnen.
Folgenden Ansatz hab ich schon:

Kreis 1: (r=1; P=(2,3)), Kreis 2: (r=2, P=(4,2))
k1: (x – 2)² + (y – 3)² = 1²
k2: (x – 4)² + (y – 2)² = 2²
k2=k1 ==> (x – 2)² + (y – 3)² - 1² = (x – 4)² + (y – 2)² - 2²
x² - 4x + 4 + y² - 6y + 9 -1 = x² - 8x + 16 + y² - 4y + 4 – 4
-2y = -4x + 4
y = 2x – 2

2x - 2 in k1 einsetzen
pq Formel anwenden
Diese zwei Kreise schneiden sich also nicht.

Jetzt brauche ich das ganze aber mit Parameter:

Kreis 1: (r1= Radius; x1= x Koordinatenpunkt1; y1= y Koordinatenpunkt1)
Kreis 2: (r2= Radius; x2= x Koordinatenpunkt2; y2= y Koordinatenpunkt2)
k1: (x – x1)² + (y – y1)² = r1²
k2: (x – x2)² + (y – y2)² = r2²
k2=k1 ==> (x – x1)² + (y – y1)² - r1² = (x – x2)² + (y – y2)² - r2²
x² - 2x x1 + x1² + y² - 2y y1 + y1² - r1² = x² - 2x x2 + x2² + y² - 2y y2 + y2² – r2²

Hier weis ich nicht mehr richtig weiter

Kann mir jemand helfen?

Danke
Tubias
Fallen_Angel Auf diesen Beitrag antworten »

verwirrt Also ich weiß nicht, aber die Koordinaten der Mittelpunkte sollten schon gegeben sein, oder liege ich da jetzt falsch?

Dann kann man nämlich Radien ermitteln. verwirrt
Poff Auf diesen Beitrag antworten »

Falsch, diese zwei Kreise schneiden sich doch ...
..
Fallen_Angel Auf diesen Beitrag antworten »

Nun ja, aber wenn sowohl Mittelpunkte als auch Radien variabel sind, dann bringt die Aufgabe doch nichts, wenn man nicht eine Fallunterscheidung macht.
Aber ich setz mich einfach mal ran. smile
Poff Auf diesen Beitrag antworten »

...
Ich meinte die beiden gegebenen Ausgangskreise mit den
'realen' Daten, die schneiden sich ...
...
Fallen_Angel Auf diesen Beitrag antworten »

Stimmt. K1 umgestellt ergibt dann nämlich:



Und da kommen die Lösungen




heraus.

Übrigens: Die Gleichung bei dem Allgemeinen ist so kompliziert, dass es eigentlich blödsinn ist, sie aufzuschreiben Augenzwinkern
 
 
tubias Auf diesen Beitrag antworten »

Danke erstmal für die Antworten.

Ich möchte diese Formel als VBA Programm erstellen, deshalb brauche ich sie mit Parametern.

Gibt es vielleicht irgendwo ein Beispiel.
Kann ich dabei die pq Formel überhaupt noch einsetzen?

Bitte noch einen Tipp

Danke
Tubias
Robin1977 Auf diesen Beitrag antworten »
RE: Schnittpunkte zweier Kreise
Zitat:
Original von tubias

k1: (x – x1)² + (y – y1)² = r1²
k2: (x – x2)² + (y – y2)² = r2²
k2=k1 ==> (x – x1)² + (y – y1)² - r1² = (x – x2)² + (y – y2)² - r2²
x² - 2x x1 + x1² + y² - 2y y1 + y1² - r1² = x² - 2x x2 + x2² + y² - 2y y2 + y2² – r2²

Hier weis ich nicht mehr richtig weiter

Kann mir jemand helfen?

Danke
Tubias


x² - 2x x1 + x1² + y² - 2y y1 + y1² - r1² = x² - 2x x2 + x2² + y² - 2y y2 + y2² – r2²
und so gehts weiter:
- 2x x1 + x1² + y² - 2y y1 + y1² - r1² - x² + 2x x2 - x2² - y² + 2y y2 - y2² + r2² = 0
2x x2 - 2x x1 - 2y y1 + 2y y2 + y1² + x1² - r1² - y2² - x2² + r2² = 0
2x ( x2 - x1 ) + 2y ( y2 - y1 ) + y1² + x1² - r1² - y2² - x2² + r2² = 0
2 [ x ( x2 - x1 ) + y ( y2 - y1 ) ] + y1² + x1² - r1² - y2² - x2² + r2² = 0

weiter weiß ich im Moment auch nicht. Hatte an die Binome gedacht, aber das geht hier nicht...
semmelb Auf diesen Beitrag antworten »

Hallo,

wenn du im Allgemeinen den Schnittpunkt 2er Kreise berechnen willst, kommst du um ein Fall Unterscheidung nicht herum.
Folgende Fälle müssen unterschieden werden:
1. xm1 = xm2, ym1 != ym2
2. ym1 = ym2, xm1 != xm2
3. ym1 = ym2, xm1 = xm2
4. Der allgemeine Fall

In C# sieht, es dann in etwa so aus:
Ich hab noch einige Konstanten eingeführt, damit die Berechnungsschritte einfacher und tranzparenter werden

// Ergebnisse:
double finalX1, finalX2, finalY1, finalY2;
// Zwischenergebnisse:
double p1, p2, q1, q2;
double c1, c2;
double k1, k2, k3;

if ( (y1==y2) && (x2!=x1) )
{
// x-Werte der Schnittpunkte ggleich
finalX1 = (r1*r2 - r2*r2)/(2*x2-2*x1);
finalX2 = finalX1;

p1 = y1*y1 - r1*r1 + finalX1*finalX1 - 2*x1*finalX1 + x1*x1;
finalY1 = y1 + Math.Sqrt( y1*y1 - pp1 );
finalY2 = y1 - Math.Sqrt( y1*y1 - pp1 );
}
else if ( (x2==x1) && (y2!=y1) )
{
// y-Werte identisch
finalY1 = (r1*r1 - r2*r2)/(2*y2-2*y1);
finalY2 = finalY1;
q1 = x1*x1 + finalY1*finalY1 - 2*y1*finalY1 + y1*y1 - r1*r1;
finalX1 = x1 + Math.Sqrt( x1*x1 - q1 );
finalX2 = x1 - Math.Sqrt( x1*x1 - q1 );
}
else if ( (x2==x1) && (y2==y1) )
{
MessageBox.Show("Fehler bei der Schnittpunkteberechnung: Die Koordinaten der Kreismittelpunkte sind identisch", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
finalX1 = 0; finalX2 = 0; finalY1 = 0; finalY2 = 0;
}
else
{
// Standardfall, weder x- noch y-Werte sind gleich
c1 = (r1*r1 - r2*r2)/(2*y2-2*y1);
c2 = (r1*r1 - r2*r2)/(2*x2-2*x1);
k1 = 1 + ((x1-x2)*(x1-x2))/( (y2-y1)*(y2-y1));
k2 = ( (x1-x2) * (2*c1-2*y1) )/(y2-y1) - 2*x1;
k3 = c1*c1 + 2*y1*c1 + y1*y1 - r1*r1;
finalX1 = ( (-1)*k2 + Math.Sqrt( k2*k2 - 4*k1*k3) )/(2*k1);
finalX2 = ( (-1)*k2 - Math.Sqrt( k2*k2 - 4*k1*k3) )/(2*k1);

finalY1 = ( finalX1*(x1-x2) )/(y2-y1) + c1;
finalY2 = ( finalX2*(x1-x2) )/(y2-y1) + c1;
}

Ich hoffe, das funktioniert so.
Gruß, semmelb
Capico Auf diesen Beitrag antworten »

hi semmelb!

Hab mal eben dein Programm in eine Java Klasse umgewandelt.
Beide Zahlen unter den Wurzeln des Standartfall werden negativ, wenn ich X1=5 Y1=4 R1=10 X2=-1 Y2=1 R2=20 setze.
Andere Beispiele habe ich nicht getestet, da ich weiß, dass die beiden Kreise sich schneiden. Hab heute auch keine Zeit um nach Fehlern zu suchen. Hoffe du hast morgen vielleicht ne Verbesserung.

PS: keine Gleichung ist zu kompliziert um sie zu nutzen
Vielleicht es per Hand aufzuschreiben, aber es ist alles eine Frage wie man sie erstellt.
Was macht ihr wenn ihr z.B. 30000 Kreise schneiden wollt?
Dann habt ihr wohl n Paar Monate wat zu tun.

Mein PC soll das in sekunden schaffen!

Besten Gruß
Capico
JochenX Auf diesen Beitrag antworten »

Zitat:
Hoffe du hast morgen vielleicht ne Verbesserung.

wohl kaum, schau mal aufs DATUM

übrigens schneiden sich die kreise nicht, der eine sollte komplett in dem anderen drin liegen
Capico Auf diesen Beitrag antworten »

hmm irgendwie funktioniert bei mir das Forum nicht richtig, ich kann nirgends n Datum erkennen, außerdem sieht es ganz anders aus wärend ich schreibe.

Naja wie dem auch sei: Du hast recht die beiden Kreise schneide sich nicht!
Dabei hatte ich sie mit n CAD Prog vorher gezeichnet. Hab mich wohl beim eingeben der Koordinaten vertippt und zufällig n schneidenes ergebnis bekommen.

Hab jetzt nochmal ausprobier:
(float x1,float y1, float r1,float x2,float y2, float r2)
(5,4,10,1,-1,8)

Das echte Ergenis sollte sein:
(7.483,-5.687) und (-4.996,4.296)

das Ergenis der Klasse:
(7.17,-9.33) und (-8.49,3.19)

stimmen leider nicht ganz überein Forum Kloppe
Capico Auf diesen Beitrag antworten »

habe eben gesehen, dass wenn man auf Originalversion klickt man auch das Datum des Beitrags sieht!
Capico Auf diesen Beitrag antworten »

So hab mir selbst geholfen und mittels Computeralgebrasystem die Gleichungen gelöst.
Musste dabei, wenn ich nichts falsch gemacht habe ne andere Fallunterscheidung machen als semmelb.

Auch meine berechnung ist etwas länger.

Für mein eines Beispiel hats schonmal funktioniert!

Und auch irgendwie komisch, dass hier keiner ne anständige Lösung hat,
soo schwer isses ja nicht!!! Hammer
dikl Auf diesen Beitrag antworten »
mit richtigem Ergebnis und in VBA ...
Hallo,

ich habe den Algo noch einmal selbst zu Ende gebracht und als VBA in Excel erstellt.
Fallunterscheidungen sind noch nicht enthalten- würden aber wie die Vorgenannten aussehen.

Wichtig ist aber, dass der Algo richtig rechnet ;-))

Sub kreis2()

'Kreisvariablen
Dim r1 As Double
Dim r2 As Double
Dim x1 As Double
Dim x2 As Double
Dim y1 As Double
Dim y2 As Double

'Endergebnisse
Dim finalX1 As Double
Dim finalX2 As Double
Dim finalY1 As Double
Dim finalY2 As Double

'Konstanten für die Zwischenrechnungen
Dim c1 As Double
Dim c2 As Double
Dim k1 As Double
Dim k2 As Double
Dim k3 As Double

'Holt die Werte aus der Tabelle
'x1 = Cells(8, 2)
'y1 = Cells(9, 2)
'r1 = Cells(10, 2)
'x2 = Cells(11, 2)
'y2 = Cells(12, 2)
'r2 = Cells(13, 2)

'oder manuell
x1 = 5
y1 = 4
r1 = 10
x2 = 1
y2 = -1
r2 = 8

'Konstanten berechnen
c1 = (r1 ^ 2 - r2 ^ 2 - x1 ^ 2 + x2 ^ 2 - y1 ^ 2 + y2 ^ 2) / (2 * x2 - 2 * x1)
c2 = (y1 - y2) / (x2 - x1)
k1 = 1 + (1 / (c2 ^ 2))
k2 = 2 * x1 + (2 * y1) / (c2) + (2 * c1) / (c2 ^ 2)
k3 = x1 ^ 2 + (c1 ^ 2) / (c2 ^ 2) + (2 * y1 * c1) / (c2) + (y1 ^ 2) - (r1 ^ 2)

'pq-Formel und dann die Lösungen
finalX1 = ((k2 / k1) / 2) + Sqr((((k2 / k1) ^ 2) / 4) - (k3 / k1))
finalX2 = (k2 / k1) / 2 - Sqr((((k2 / k1) ^ 2) / 4) - (k3) / (k1))


finalY1 = 1 / (c2) * finalX1 - (c1 / c2)
finalY2 = 1 / (c2) * finalX2 - (c1 / c2)

bla$ = "bla" 'nur für den Haltepunkt zum überprüfen der Werte

End Sub


Viel Spaß damit.

Ciao dikl
qdx Auf diesen Beitrag antworten »
schnittpunkte zweier kreise
Vielen Dank für die ganze Info an Euch... Habe Alles mal in 'ner Java Klasse zusammen getragen...
(Mit den Ausnahmefällen)


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
import java.lang.Math.*;
import java.io.*;

public class circleCut2{//calculates the cutting points of two circles...
public static void main (String [] args){
//variables
double x1=0,y1=0,r1=0,x2=0,y2=0,r2=0; //circles
double resultX1=0,resultX2=0,resultY1=0,resultY2=0; //results
double p1,p2,q1,c1,c2,k1,k2,k3; //temps
if (args.length > 6 || args.length < 6)
System.out.println("usage: circleCut x1 y1 r1 x2 y2 r1");
else {
try{
x1 = Double.parseDouble(args [0]);
y1 = Double.parseDouble(args [1]);
r1 = Double.parseDouble(args [2]);
x2 = Double.parseDouble(args [3]);
y2 = Double.parseDouble(args [4]);
r2 = Double.parseDouble(args [5]);
}catch (NumberFormatException e) {System.out.println("Error while parsing the circle data.");}
//check for special cases:
if ((y1 == y2) && (x2 != x1)){ //x values identical
resultX1 = (r1*r2 - r2*r2)/(2*x2-2*x1);
resultX2 = resultX1;
p1 = y1*y1 - r1*r1 + resultX1*resultX1 - 2*x1*resultX1 + x1*x1;
resultY1 = y1 + Math.sqrt( y1*y1 - p1 );
resultY2 = y1 - Math.sqrt( y1*y1 - p1 );
} else if ((x2==x1) && (y2!=y1)){// y values identical
resultY1 = (r1*r1 - r2*r2)/(2*y2-2*y1);
resultY2 = resultY1;
q1 = x1*x1 + resultY1*resultY1 - 2*y1*resultY1 + y1*y1 - r1*r1;
resultX1 = x1 + Math.sqrt( x1*x1 - q1 );
resultX2 = x1 - Math.sqrt( x1*x1 - q1 );
} else if ((x2==x1) && (y2==y1)){//centers identical
System.out.println("Centers identical... ");
} else { //default case
// ok let's calculate the constants
c1 = (Math.pow (r1, 2.0) - Math.pow (r2, 2.0) - Math.pow (x1, 2.0) + Math.pow (x2, 2.0) - Math.pow (y1, 2.0) + Math.pow (y2, 2.0)) / (2.0 * x2 - 2.0 * x1);
c2 = (y1 - y2) / (x2 - x1);
k1 = 1.0 + (1.0 / Math.pow (c2, 2.0));
k2 = 2.0 * x1 + (2.0 * y1) / (c2) + (2.0 * c1) / Math.pow (c2, 2.0);
k3 = Math.pow (x1, 2.0) + Math.pow (c1, 2.0) / Math.pow (c2, 2.0) + (2.0 * y1 * c1) / (c2) +Math.pow (y1, 2.0) - Math.pow (r1, 2.0);
//looks weired? Oh lord have mercy on me! it's just the beginning!
//here the finish by using the pq formula:
resultX1 = ((k2 / k1) / 2.0) + Math.sqrt((Math.pow ((k2 / k1), 2.0) / 4.0) - (k3 / k1));
resultX2 = (k2 / k1) / 2.0 - Math.sqrt((Math.pow ((k2 / k1), 2.0) / 4.0) - (k3) / (k1));
resultY1 = 1.0 / (c2) * resultX1 - (c1 / c2); resultY2 = 1.0 / (c2) * resultX2 - (c1 / c2);
}
// Output:
System.out.println("The circle's cutting points:");
System.out.println("x1: "+resultX1+",x2: "+resultX2);
System.out.println("y1: "+resultY1+",y2: "+resultY2);
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
So läuft bei mir...
Viel Spass, qdx
qdx Auf diesen Beitrag antworten »

Tjjaaaa... bei weiterem Testen habe sich noch ein paar Bugs in den 'Sonderfällen' gezeigt.
Alles also noch mit Vorsicht zu geniessen.
Obelix125 Auf diesen Beitrag antworten »

Hallo alle zusammen,

ich möchte mich an dieser Stelle bei "dikl" für den VBA Code bedanken, den er/sie hier reingestellt hat. Habe ich lange nach gesucht und funzt einwandfrei. Ich schreibe ein Programm mit dem man Zeichnungen für CNC-Maschinen erstellen kann und diese Funktion hat mir schon längere Zeit Kopfzerbrechen gemacht.

Hat vielleicht noch jemand eine Funktion um den Schnittpunkt von Kreisen zu Geraden zu ermitteln ?

Noch mal vielen vielen Dank für deine Lösung !!!

Ralf (Gast)
edi-siem Auf diesen Beitrag antworten »

Hallo zusammen.
Ich bin über Google auf die Seite gestoßen. Leider sind die Daten der Beiträge nicht zu finden.
Mein kommentar dazu:
Man kann im Allg. eine Abhängigkeit zwischen y und x herstellen!. Damit hat man eine lineare Abhängigkeit, da wie gezeigt, die Quadratterme sich rauskürzen.
Anschließend eingesetzt in eine der Gleichungen enthält man eine einfache quadratische Gleichung. Es sind ein bisschen fiele Terme, das macht aber nicht, da es ja im Wesentlichen Konstanten sind. Somit bekommt man exakt die form y = ax^2 + bx + c
Die Gleichung hat *immer* keine, eine oder zwei Lösungen. Was nichts anderes bedeutet als: a) die Kreise schneiden sich nicht b) die Krieise berühren sich, c) die Kreise schneiden sich.
Übrigens, die berechnung kann man etwas vereinfachen, indem man den Koordinatenpunkt in den Mittelpunkt des einen Kreises legt. Man spart damit etwa 1/3 der Terme.

Viele Grüße,
Ed
tg Auf diesen Beitrag antworten »

Viel einfacher:

s = &#8730traurig (xn-xm)²+(yn-ym)²)
p = (s²+R1²-R2²)
h = ±&#8730traurig R1²-p²)
Wenn (R1²-p²) < 0 dann kein Schnittpunkt.
Wenn (R1²-p²) = 0 dann berühren sich die kreise nur.
Wenn (R1²-p²) > 0 dann gibt es zwei Schnittpunkte

o = (xn-xm)/s a = (yn-ym)/s

x1 = xm + o*p + a*h
y1 = ym + a*p - o*h

Für x2,y3 h = -h benutzen.
tg Auf diesen Beitrag antworten »

s = SQRT((xn-xm)²+(yn-ym)²)
h = ±SQRT(R1²-p²)
HanK85 Auf diesen Beitrag antworten »
Korrektur Sonderfälle
Hallöchen,

hab mir das programm von semmelb oder von qdx auch programmiert, und da ist mir aufgefallen, dass die Sonderfälle, also x1==x2, oder y1==y2, falsch berechnet sind !!

hier nochmal die Korrektur der Sonderfälle, der rest ist wunderbar:

//check for special cases:
if ((y1 == y2) && (x2 != x1)){ //x values identical
resultX1 = x1 +(r1*r1 -r2*r2 + x2*x2 + x1*x1 - 2*x1*x2)/(2*x2-2*x1);
resultX2 = resultX1;
p1 = y1*y1 - r1*r1 + resultX1*resultX1 - 2*x1*resultX1 + x1*x1;
resultY1 = y1 + Math.sqrt( y1*y1 - p1 );
resultY2 = y1 - Math.sqrt( y1*y1 - p1 );
} else if ((x2==x1) && (y2!=y1)){// y values identical
resultY1 = y2 +(r1*r1 -r2*r2 + y2*y2 + y2*y2 - 2*y2*y2)/(2*y2-2*y2);
resultY2 = resultY1;q1 = x1*x1 + resultY1*resultY1 - 2*y1*resultY1 + y1*y1 - r1*r1;
resultX1 = x1 + Math.sqrt( x1*x1 - q1 );
resultX2 = x1 - Math.sqrt( x1*x1 - q1 );
}

Vielleicht kanns ja noch der eine oder andere gebrauchen Augenzwinkern
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »