Beregning av skjæringspunkter av to sirkler er et litt kinkig problem i geometri , men løsningen er grei og enkel å implementere i C + + . Du vil trenge noen form for punkt klassen tilgjengelig som kan håndtere grunnleggende aritmetikk, som addisjon og subtraksjon av to - dimensjonale punkter . Hvis du ikke har en, kan du bruke en std :: vector
fra Standard Template Library på samme måte . Du trenger:
Point klasse som håndterer grunnleggende aritmetikk
Vis flere instruksjoner
Sjekk for spesielle tilfeller
en Beregn avstanden mellom sirklene ' sentrene :
Point delta = p2 - p1 ; float distanceSquared = delta.X * delta.X + delta.Y * delta.Y ; float avstand = sqrt ( distanceSquared ) ;
2
Sjekk hvis kretsene er fullstendig atskilt fra hverandre . I dette tilfelle vil avstanden mellom sentrene til sirklene være større enn summen av radiene deres , så er det ingen måte kan de krysser hverandre. Hvis dette er tilfelle , håndterer feilen på den måten som fungerer best for programmet
if ( distSquared > ( R1 + R2 ) * ( R1 + R2 )) return noIntersections ; .
3
Sjekk om en sirkel er helt innenfor den andre. I dette tilfellet vil det også være noen løsninger
if ( distSquared < ( r1 - r2) * ( r1 - r2) ) return noInersections ; .
4
Sjekk om kretsene er identiske. Dette betyr at det finnes et uendelig antall løsninger - ett for hvert punkt på sirkelen
hvis ( distSquared == 0 && r1 == r2 ) retur infiniteIntersections ; .
< . br > Finn Intersections
5
Beregn avstanden fra sentrum av den første sirkelen til akkord koble skjæringspunkter
float chordDistanceSquared = ( r1 * r1 - r2 * r2 - distSquared ) * ( r1 * r1 - r2 * r2 - distSquared ) /( 4 * distSquared ) ; float chordDistance = sqrt ( chordDistanceSquared ) ;
6
Beregn halvparten av lengden på akkord :
float halfChordLength = sqrt ( r1 * r1 - chordDistanceSquared ) ;
7
Finn det punktet midt på akkord : en
Point chordMidpoint = p1 + chordDistance * deltaet /sqrt ( distSquared ) ;
8
Beregn plasseringen av de skjæringspunkter ved hjelp av informasjonen du har beregnet så langt : en
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 ;