Beregning skæringspunkterne af to cirkler er et lidt tricky problem i geometri , men løsningen er ligetil og enkel at gennemføre i C + + . Du får brug for en slags point klasse til rådighed, der kan håndtere grundlæggende aritmetik , såsom addition og subtraktion af 2 -dimensionelle punkter. Hvis du ikke har en, kan du bruge en std :: vector
fra Standard Template Library på samme måde . Ting du har brug
punkt klasse, der håndterer grundlæggende aritmetik
Vis Flere Instruktioner
Check for Særlige tilfælde
1 Beregn afstanden mellem de cirkler ' centre : < br >
Punkt delta = p2 - p1 , float distanceSquared = delta.X * delta.X + delta.Y * delta.Y , float distance = sqrt ( distanceSquared )
2
Check hvis cirklerne er helt adskilt fra hinanden . I dette tilfælde vil afstanden mellem centrene af cirklerne være større end summen af deres radier , så der er ingen måde, de kan skærer hinanden . Hvis dette er tilfældet, håndtere fejlen på den måde fungerer bedst for dit program
if ( distSquared > ( r1 + r2) * ( r1 + r2) ) sendes noIntersections ; .
3
Tjek om en cirkel er helt inden den anden. I dette tilfælde vil der også være nogen løsninger
if ( distSquared < ( r1 - r2) * ( r1 - r2) ) return noInersections ; .
4
Kontroller, om cirkler er identiske . Det betyder, at der er et uendeligt antal løsninger - en for hvert punkt på cirklen
hvis ( distSquared == 0 && r1 == r2) tilbagevenden infiniteIntersections ; .
< . br > Find Intersections
5
Beregn afstanden fra midten af den første cirkel til akkord forbinder skæringspunkter
float chordDistanceSquared = ( r1 * r1 - r2 * r2 - distSquared ) * ( r1 * r1 - r2 * r2 - distSquared ) /( 4 * distSquared ) float chordDistance = sqrt ( chordDistanceSquared )
6
Beregn halvdelen af længden af den akkord : < br >
float halfChordLength = sqrt ( r1 * r1 - chordDistanceSquared )
7
Find det punkt i centrum af akkord : Hej
punkt chordMidpoint = p1 + chordDistance * delta /sqrt ( distSquared )
8
Compute placeringen af de skæringspunkter ved hjælp af oplysninger, du har beregnet hidtil : Hej
Intersection1.x = chordMidpoint.x + chordDistance * ( p2.y - p1.y ) /distance , Intersection1.y = chordMidpoint.y + chordDistance * ( p2.x - p1.x ) /distance , Intersection2.x = chordMidpoint.x - chordDistance * ( p2.y - p1 . y) /distance , Intersection2.y = chordMidpoint.y - chordDistance * ( p2.x - p1.x ) /distance ,