Hvordan beregne Kryssende Circles i C ++

Beregning av skjæringspunktene mellom to sirkler er en litt kinkig problem i geometri, men løsningen er grei og enkel å implementere i C ++. Du trenger noen form for punkt klasse tilgjengelig som kan håndtere grunnleggende aritmetikk, som addisjon og subtraksjon av to-dimensjonale poeng. Hvis du ikke har en, kan du bruke en std :: vector <float> fra Standard Template Library på samme måte.

Bruksanvisning

Sjekk for Spesielle tilfeller

1 Beregn avstanden mellom sirklene sentre:

Point delta = p2 - p1;
flyte distanceSquared = delta.X

delta.X + delta.Y delta.Y;
float avstand = sqrt (distanceSquared);

2 Sjekk om sirklene er helt atskilt fra hverandre. I dette tilfellet vil avstanden mellom sentrene til sirklene være større enn summen av deres radier, slik at det ikke er noen måte kan de krysser hverandre. Hvis dette er tilfelle, må du håndtere feil på den måten som fungerer best for programmet.

if (distSquared> (R1 + R 2) * (R1 + R2))
tilbake noIntersections;

3 Sjekk om en sirkel er helt innenfor den andre. I dette tilfellet vil det også være ingen løsninger.

if (distSquared <(r1 - r2) (r1 - r2))
tilbake noInersections;

4 Sjekk om sirklene er identiske. Dette betyr at det finnes et uendelig antall løsninger - en for hvert punkt på sirkelen.

if (distSquared == 0 && r1 == r2)
tilbake infiniteIntersections;

Finn Veikryss

5 Beregne avstanden fra midten av den første sirkelen til korden som forbinder skjæringspunkter.

flyte chordDistanceSquared = (r1

r1 - r2 r2 - distSquared) (r1 r1 - r2 r2 - distSquared) / (4 distSquared);
flyte chordDistance = sqrt (chordDistanceSquared);

6 Beregn halvparten av lengden av korden:

flyte halfChordLength = sqrt (r1 * r1 - chordDistanceSquared);

7 Finne det punkt ved midten av korden:

Point chordMidpoint = p1 + chordDistance * delta / sqrt (distSquared);

8 Beregn hvor du finner skjæringspunkter ved hjelp av informasjonen du har beregnet så langt:

Intersection1.x = chordMidpoint.x + chordDistance (p2.y - p1.y) / distanse;
Intersection1.y = chordMidpoint.y + chordDistance (p2.x - p1.x) / distanse;
Intersection2.x = chordMidpoint.x - chordDistance (p2.y - p1.y) / distanse;
Intersection2.y = chordMidpoint.y - chordDistance (p2.x - p1.x) / distanse;