Shadowman Geschrieben 19. Mai 2009 Geschrieben 19. Mai 2009 (bearbeitet) Hallo, ich habe das Problem, dass ich Schnittpunkte von 2 Kreisen berechnen möchte. Kreisformel für beide Kreise (nur unterschiedliche Mittelpunktswerte): (x-xm)²+(y-ym)²=15² Somit ergibt sich ja eigentlich, dass die Formel so aussieht, wenn ich beide gleichsetze: (x-xm1)²+(y-ym1)²=(x-xm2)²+(y-ym2)² Wenn ich das ganze jetzt umstelle und nach x auflöse erhalte ich diese Gleichung: x = ((-xm1² -ym1² +xm2² +ym2²)/2 +(ym1-ym2)*y)/(-xm1+xm2) Solange die Y-Koordinaten der Mittelpunkte übereinstimmen habe ich hier kein Problem. Wenn ich allerdings diese Werte verwende: xm1 = 10 ym1 = 10 xm2 = 20 ym2 = 15 komme ich zu der aufgelösten Gleichung: x = 21,25 -0,5y Das verwirrt mich. So bekomme ich ja keine von Y unabhängigen X-Koordinaten. Habe ich irgendwo einen Denk- oder sonstigen Fehler, oder bin ich an einem Punkt, an dem ich nur nicht mehr weiter weiß? Die Y-Koordinate müsste ich ja eigentlich so ermitteln, wenn ich mich nicht komplett verrechnet habe: y=sqrt(15²-(x-xm)²)-ym Ich wäre um Hilfe dankbar. Falls Fehler auffallen, bitte bescheid sagen. Vielleicht klärt das auch schon einiges. Und ja, mit sowas beschäftige ich mich mitternachts Mfg Shadowman Bearbeitet 19. Mai 2009 von Shadowman Zitieren
flashpixx Geschrieben 19. Mai 2009 Geschrieben 19. Mai 2009 (bearbeitet) Also wenn ich die Kreisgleichung so formuliere: (x-x0)^2 + (y-y0)^2 = r^2 und diese nach x frei stelle, ergibt sich: (x-x0)^2 = r^2 - (y-y0)^2 (x-x0) = +-sqrt(r^2 - (y-y0)^2) x = x0 +-sqrt(r^2 - (y-y0)^2) Bei zwei Kreisen musst Du immer folgende Fälle beachten, es können immer <= 2 Schnittpunkte existieren. Für den Schnittpunkt ergibt sich dann bei 2 Kreisen Kreis 1: (x - x0k1)^2 + (y - y0k1)^2 = rk1^2 Kreis 2: (x - x0k2)^2 + (y - y0k2)^2 = rk2^2 Schnittpunkt(e): (x - x0k2)^2 - (x - x0k1)^2 = rk2^2 - rk1^2 Phil Bearbeitet 19. Mai 2009 von flashpixx Zitieren
Shadowman Geschrieben 19. Mai 2009 Autor Geschrieben 19. Mai 2009 Formel1: (x-mx1)² + (y-my1)² = 15² Formel2: (x-mx2)² + (y-my2)² = 15² Da die beiden Radien gleich sind, lassen sich ja die Formeln so gleichsetzen: (x-mx1)² + (y-my1)² = (x-mx2)² + (y-my2)² Ich habe jetzt einfach die binomischen Formeln ausformuliert: x²-2x*mx1+mx1² + y²-2y*my1+my1² = x²-2x*mx2+mx2² + y²-2y*my2+my2² jetzt kürzen sich die quadrate von x und y weg und es bleibt: -2x*mx1+mx1² -2y*my1+my1² = -2x*mx2+mx2² -2y*my2+my2² jetzt alles was mit x zu tun hat nach links und alles was nicht damit zu tun hat nach rechts: -2x*mx1 + 2x*mx2 = mx2² -2y*my2 + my2² - mx1² + 2y*my1 - my1² dann noch ein bisschen ausklammern: 2x(mx2-mx1) = 2y(my1-my2) + mx2² + my2² - mx1² - my1² und hier sieht man ja direkt, dass ich eine Abhängigkeit von y habe, wenn my1 und my2 nicht gleich sind. Ich komme da irgendwie nicht auf eine Wurzelopperation. *verzweiflung* Ich gehe schlafen. Vielleicht finde ich morgen meinen Denkfehler, den ich zu haben scheine Zitieren
Der Kleine Geschrieben 20. Mai 2009 Geschrieben 20. Mai 2009 Da die beiden Radien gleich sind, lassen sich ja die Formeln so gleichsetzen: Wenn du beide Gleichungen gleichsetzt, verlierst du somit eine Information. Du machst aus 2 Gleichungen mit 2 Unbekannten (was im positiven Fall 2, 1, oder 0 Lösungen hat) dann nur noch eine Gleichung mit 2 Unbekannten und bekommst somit immer die Abhängigkeit (die ja auch richtig ist) hinein. Folglich vernichtest du eine Information. Also bitte eine Gleichung nach einer Variablen freistellen und in die andere Gleichung einsetzen (oder ein ähnliches Lösungsverfahren - Additionsverfahren etc.) anwenden. Dann bekommst du nur noch die Abhängigkeit vom Radius (wenn du willst, auch von beiden bekannten Radien) und von den (bekannten) Mittelpunktskoordinaten. Zitieren
Shadowman Geschrieben 20. Mai 2009 Autor Geschrieben 20. Mai 2009 ARG!!! Vielen Dank! Ich habe Gleichung1 nach y aufgelöst: x²-2x*xm1+xm1² + y²-2y*ym+ym1² = 15² (y-ym1)² = 15²-(x-xm1)² y = +-sqrt(15²-(x-xm1)²)+ym1 und in die 2. Gleichung eingesetzt. (x-xm2)² = 15² - ((+-sqrt(15²-(x-xm1)²)+ym1)-ym2)² (x-xm2)² = 15² - (+-sqrt(225-x²-2x*xm1+xm1²) + xm1 - ym2)² x = +-sqrt(15² - (+-sqrt(225-(x-xm1)²) + xm1 - ym2)²)-xm2 Zitieren
Shadowman Geschrieben 20. Mai 2009 Autor Geschrieben 20. Mai 2009 Was ich noch anmerken wollte: Der fall, dass es keinen Schnittpunkt gibt kann nicht eintreten, da beide Mittelpunkte einen maximalen Abstand von 30 pixeln haben. Somit sind es 1-2 Schnittpunkte. Ich möchte immer den unteren Schnittpunkt haben. Somit ergibt sich für die Berechnung der Y-Koordinate des unteren Schnittpunkts: y = ym1-sqrt(15²-(x-xm1)²) Mit dem Stand der Formel für das X komme ich allerdings nicht weiter. Wurzelrechnung ist leider etwas länger her bei mir, sodass ich es gerade nicht schaffe, x auf eine Seite zu bringen und es somit rein abhängig von xm1, ym1, xm2 und ym2 zu machen. Falls da noch jemand einen Tipp hat wäre ich schon zufrieden. Um mal den Hintergrund etwas zu klären: Es geht darum, die Stellung eines Arms im 2-Dimensionalen Raum darzustellen, wobei sich die Schulter an xm1/ym1 befindet und die Hand an xm2/ym2. Daraus ergibt sich ja, dass der Ellbogen am unteren Schnittpunkt der Kreise mit dem Radius r=15px mit den Mittelpunkten xm1/ym1 und xm2/ym2 befindet. Ich hoffe, dass mit einer deutlich vereinfachten Formel eine sehr schnelle berechnung dieser Koordinate möglich ist, da sie für schnelle darstellung benötigt wird. Zitieren
flashpixx Geschrieben 20. Mai 2009 Geschrieben 20. Mai 2009 Was ich noch anmerken wollte: Der fall, dass es keinen Schnittpunkt gibt kann nicht eintreten, da beide Mittelpunkte einen maximalen Abstand von 30 pixeln haben. Somit sind es 1-2 Schnittpunkte. Das ist kein Argument, wenn der Abstand gleich 30 Pixel ist, der Radius jedes Kreises 1 Pixel, dann hast Du keine(n) Schnittpunkt(e). Ich möchte immer den unteren Schnittpunkt haben. Somit ergibt sich für die Berechnung der Y-Koordinate des unteren Schnittpunkts: y = ym1-sqrt(15²-(x-xm1)²) Das kann man auch generell nicht so sagen, wo ist "oben" und wo ist "unten". Wenn beide Mittelpunkte auf einer Geraden, die parallel zur Y-Achse verläuft, dann, die Radien größer dem halben Abstand sind, dann liegen die Schnittpunkte auf einer Geraden, die parallel zur X-Achse verläuft. Mit dem Stand der Formel für das X komme ich allerdings nicht weiter. Wurzelrechnung ist leider etwas länger her bei mir, sodass ich es gerade nicht schaffe, x auf eine Seite zu bringen und es somit rein abhängig von xm1, ym1, xm2 und ym2 zu machen. [...] Es geht darum, die Stellung eines Arms im 2-Dimensionalen Raum darzustellen, wobei sich die Schulter an xm1/ym1 befindet und die Hand an xm2/ym2. Du möchtest ein Gelenk im 2D modellieren, so wie ich das verstehe, dann würde ich Dir eher zu Darstellung als Vektoren raten, denn es vereinfacht viele Dinge. Betrachte einen "Knochen" als Strahl, der Strahl besteht aus 2 Vektoren (Ort- und Richtungsvektor). Die Länge des Richtungsvektors ist gleichzeitig die Länge Deines "Knochen". Ein Gelenk kann sich meist nicht um 360 Grad bewegen, sondern nur um einen bestimmten Kreisbogen, somit hast Du schon eine Einschränkung in der Bewegung. Die Bewegung des Gelenkes bzw des Richtungsvektors kann über eine Drehmatrix beschreiben. Somit lassen sich dann auch Strukturen beschreiben, die eben aus mehren Knochen / Gelenken bestehen Phil Zitieren
Shadowman Geschrieben 20. Mai 2009 Autor Geschrieben 20. Mai 2009 (bearbeitet) Das ist kein Argument, wenn der Abstand gleich 30 Pixel ist, der Radius jedes Kreises 1 Pixel, dann hast Du keine(n) Schnittpunkt(e). Der Radius beider Kreise beträgt immer genau 15px. Da der Abstand <= 2r ist gibt es immer 0 < ergebnisse < 3 Das kann man auch generell nicht so sagen, wo ist "oben" und wo ist "unten". Wenn beide Mittelpunkte auf einer Geraden, die parallel zur Y-Achse verläuft, dann, die Radien größer dem halben Abstand sind, dann liegen die Schnittpunkte auf einer Geraden, die parallel zur X-Achse verläuft. Ist zu vernachlässigen, da der Radius auf 15px festgelegt ist und der maximale Abstand 30px beträgt. Somit gibt es keine Ausnahmen Du möchtest ein Gelenk im 2D modellieren, so wie ich das verstehe, dann würde ich Dir eher zu Darstellung als Vektoren raten, denn es vereinfacht viele Dinge. Betrachte einen "Knochen" als Strahl, der Strahl besteht aus 2 Vektoren (Ort- und Richtungsvektor). Die Länge des Richtungsvektors ist gleichzeitig die Länge Deines "Knochen". Ein Gelenk kann sich meist nicht um 360 Grad bewegen, sondern nur um einen bestimmten Kreisbogen, somit hast Du schon eine Einschränkung in der Bewegung. Die Bewegung des Gelenkes bzw des Richtungsvektors kann über eine Drehmatrix beschreiben. Nicht ganz reelle gelenke. Es soll so gerechnet werden, dass zum Beispiel der Unterarm vom Ellbogen an um 360° gedreht werden kann. Es geht hier um Strichmännchen. Hier ein Video, was vielleicht beim Verständnis hilft Ausserdem stellt sich noch die Frage, mit welcher Sprache man sowas umsetzen kann. Ich habe in erwägung gezogen: C++.Net, C#.Net, XNA Bearbeitet 20. Mai 2009 von Shadowman Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.