Schnittpunkte zweier Kreise |
07.05.2004, 19:55 | tubias | Auf diesen Beitrag antworten » | ||
Schnittpunkte zweier Kreise 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 |
||||
07.05.2004, 20:33 | Fallen_Angel | Auf diesen Beitrag antworten » | ||
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. |
||||
07.05.2004, 21:22 | Poff | Auf diesen Beitrag antworten » | ||
Falsch, diese zwei Kreise schneiden sich doch ... .. |
||||
07.05.2004, 21:30 | 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. |
||||
07.05.2004, 21:39 | Poff | Auf diesen Beitrag antworten » | ||
... Ich meinte die beiden gegebenen Ausgangskreise mit den 'realen' Daten, die schneiden sich ... ... |
||||
07.05.2004, 22:07 | 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 |
||||
Anzeige | ||||
|
||||
08.05.2004, 18:56 | 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 |
||||
11.05.2005, 22:06 | Robin1977 | Auf diesen Beitrag antworten » | ||
RE: Schnittpunkte zweier Kreise
x² - 2x x1 + x1² + y² - 2y y1 + y1² - r1² = x² - 2x x2 + x2² + y² - 2y y2 + y2² – r2² und so gehts weiter: x² - 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... |
||||
23.07.2005, 09:21 | 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 |
||||
06.09.2005, 11:44 | 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 |
||||
06.09.2005, 11:49 | JochenX | Auf diesen Beitrag antworten » | ||
wohl kaum, schau mal aufs DATUM übrigens schneiden sich die kreise nicht, der eine sollte komplett in dem anderen drin liegen |
||||
06.09.2005, 22:31 | 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 |
||||
07.09.2005, 07:05 | Capico | Auf diesen Beitrag antworten » | ||
habe eben gesehen, dass wenn man auf Originalversion klickt man auch das Datum des Beitrags sieht! |
||||
07.09.2005, 08:21 | 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!!! |
||||
03.01.2006, 16:50 | 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 |
||||
22.05.2006, 17:16 | 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 |
||||
22.05.2006, 23:19 | 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. |
||||
01.12.2007, 19:00 | 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) |
||||
06.01.2008, 16:16 | 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 |
||||
31.08.2009, 10:50 | tg | Auf diesen Beitrag antworten » | ||
Viel einfacher: s = √ (xn-xm)²+(yn-ym)²) p = (s²+R1²-R2²) h = ±√ 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. |
||||
31.08.2009, 10:53 | tg | Auf diesen Beitrag antworten » | ||
s = SQRT((xn-xm)²+(yn-ym)²) h = ±SQRT(R1²-p²) |
||||
24.01.2011, 11:02 | 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 |
|
Verwandte Themen
Die Beliebtesten » |
Die Größten » |
Die Neuesten » |