Wie berechnen sich überschneidende Kreise in C++

January 29

Berechnung der Schnittpunkte zweier Kreise ist eine etwas heikle Problem in der Geometrie, aber die Lösung ist einfach und problemlos in C++ implementiert werden. Sie benötigen eine Art Point-Klasse zur Verfügung, die Grundrechenarten, wie Addition und Subtraktion von 2-dimensionalen Punkte behandeln können. Wenn Sie eine nicht verfügen, können Sie ein Std:: Vector < Schwimmer > aus der Standard Template Library auf die gleiche Weise.

Anweisungen

Check für Sonderfälle

1 Berechnen Sie den Abstand zwischen den Kreisen Zentren:

Punkt-Delta = p2 - p1;float DistanceSquared = Delta. X Delta. X + Delta. Y Delta. Y;Distanz zu schweben = sqrt(distanceSquared);

2 Prüfen Sie, ob die Kreise komplett von einander getrennt sind. In diesem Fall wird der Abstand zwischen den Mittelpunkten der Kreise größer als die Summe ihrer Radien, so gibt es keine Möglichkeit, die sie schneiden können. Wenn dies der Fall ist, behandeln Sie den Fehler in welcher Art und Weise am besten für Ihr Programm funktioniert.

Wenn (DistSquared > (r1 + r2) * (r1 + r2))Rückkehr NoIntersections;

3 Prüfen Sie, ob ein Kreis innerhalb der anderen vollständig ist. In diesem Fall werden auch keine Lösungen.

Wenn (DistSquared < (r1 - r2) * (r1 - r2))Rückkehr NoInersections;

4 Prüfen Sie, ob die Kreise identisch sind. Dies bedeutet, dass es unendlich viele Lösungen - eine für jeden Punkt auf dem Kreis.

Wenn (DistSquared == 0 & & r1 r2 ==)Rückkehr InfiniteIntersections;

Die Kreuzungen finden

5 Berechnen Sie den Abstand von der Mitte des ersten Kreises zu den Akkord verbinden die Schnittpunkte.

float ChordDistanceSquared = (r1 r1 - r2 r2 - DistSquared) (r1 r1 - r2 r2 - DistSquared) / (4 DistSquared);float ChordDistance = sqrt(chordDistanceSquared);

6 Berechnen Sie die Hälfte der Länge des Akkords:

float HalfChordLength = Sqrt (r1 * r1 - ChordDistanceSquared);

7 Finden Sie den Punkt in der Mitte des Akkords:

Punkt ChordMidpoint = p1 + ChordDistance * Delta / sqrt(distSquared);

8 Berechnen Sie die Positionen der Schnittpunkte mit den Informationen, dass Sie bisher berechnet habe:

Intersection1.x = chordMidpoint.x + ChordDistance (p2.y - p1.y) / Entfernung;Intersection1.y = chordMidpoint.y + ChordDistance (p2.x - p1.x) / Entfernung;Intersection2.x = chordMidpoint.x - ChordDistance (p2.y - p1.y) / Entfernung;Intersection2.y = chordMidpoint.y - ChordDistance (p2.x - p1.x) / Entfernung;