Berechnung der Schnittpunkte der beiden Kreise ist ein etwas kniffliges Problem in der Geometrie , aber die Lösung ist einfach und unkompliziert in C + + implementieren . Sie müssen irgendeine Art von Punkt -Klasse zur Verfügung, die Grundrechenarten wie Addition und Subtraktion von 2-dimensionalen Punkte verarbeiten kann . Wenn Sie noch kein Konto haben , können Sie einen std :: vector
aus der Standard Template Library verwenden in der gleichen Weise. Was Sie brauchen
Point-Klasse , die Grundrechenarten
anzeigen Weitere Anweisungen Katalog Überprüfen Sie für Sonderfälle
1 den Abstand berechnen zwischen den Kreisen ' Zentren behandelt :
Punkt delta = p2 - p1 ; float distanceSquared = Ax * Ax + Ay Ay * ; float distance = sqrt ( distanceSquared );
2
prüfen wenn die Kreise vollständig voneinander getrennt . In diesem Fall wird der Abstand zwischen den Mitten der Kreise größer sein als die Summe ihrer Radien , so gibt es keine Möglichkeit, sie schneiden können . Wenn dies der Fall ist , den Fehler behandeln in welcher Weise auch immer funktioniert am besten für Ihr Programm
if ( distSquared > (R1 + R2 ) * ( R1 + R2) ) return noIntersections ; .
Seite 3
Überprüfen Sie, ob ein Kreis ist vollständig innerhalb des anderen . In diesem Fall wird es auch keine Lösungen sein
if ( distSquared < ( r1 - r2 ) * ( r1 - r2) ) return noInersections ; .
4
Prüfen Sie, ob die Kreise sind identisch. Dies bedeutet, dass es eine unendliche Anzahl von Lösungen - für jeden Punkt auf dem Kreis
if ( distSquared == 0 && r1 == r2 ) return infiniteIntersections ; .
< . br> finden Sie die Schnittpunkte
5
berechnen Sie den Abstand von der Mitte des ersten Kreises zu der Sehne verbindet die Schnittpunkte
float chordDistanceSquared = ( r1 * r1 - r2 * r2 - distSquared ) * ( r1 * r1 - r2 * r2 - distSquared ) /( 4 * distSquared ); float chordDistance = sqrt ( chordDistanceSquared );
6
berechnen die Hälfte der Länge der Sehne :
float halfChordLength = sqrt ( r1 * r1 - chordDistanceSquared );
7
Sie die Stelle in der Mitte des Akkords :
Punkt chordMidpoint = p1 + chordDistance * delta /sqrt ( distSquared );
8
berechnen Sie die Standorte der Schnittpunkte mit den Informationen, die Sie bisher berechneten habe:
Intersection1.x = chordMidpoint.x + chordDistance * ( p2.y - p1.y ) /Abstand ; Intersection1.y = chordMidpoint.y + chordDistance * ( P2.x - P1.x ) /Abstand ; Intersection2.x = chordMidpoint.x - chordDistance * ( p2.y - p1 . y) /Abstand ; Intersection2.y = chordMidpoint.y - chordDistance * ( P2.x - P1.x ) /Abstand ;