Beräkning skärningspunkterna mellan två cirklar är ett lite knepigt problem i geometri , men lösningen är enkel och lätt att genomföra i C + + . Du kommer att behöva någon form av punkt klassen tillgängliga som kan hantera grundläggande aritmetik , t.ex. addition och subtraktion av 2 - dimensionella punkter . Om du inte har en, kan du använda en std :: vector
från Standard Template Library på samma sätt . Saker du behöver
klassen Point som hanterar grundläggande aritmetiska
Visa fler instruktioner
Kontrollera för särskilda fall
1 Beräkna avståndet mellan cirklarna ' centra :
Point delta = p2 - p1 , float distanceSquared = delta.X * delta.X + delta.Y * delta.Y , float avstånd = sqrt ( distanceSquared ) ,
2
Check om cirklarna är helt skilda från varandra. I detta fall , kommer avståndet mellan centra hos de kretsar vara större än summan av deras radier , så det finns inget sätt att de kan korsas. Om detta är fallet , hantera felet på det sätt som fungerar bäst för ditt program
om ( distSquared > ( R1 + R2 ) * ( R1 + R2 ) ) avkastning noIntersections , .
Sida 3
Kontrollera om en cirkel är helt inom den andra . I det här fallet , kommer det också att finnas några lösningar
om ( distSquared < ( r1 - r2 ) * ( r1 - r2 ) ) tur noInersections , .
4
Kontrollera om cirklar är identiska. Detta innebär att det finns ett oändligt antal lösningar - en för varje punkt på cirkeln
om ( distSquared == 0 && r1 == r2 ) tur infiniteIntersections , .
< . br > Hitta skärningspunkterna
5
Beräkna avståndet från mitten av den första cirkeln till ackordet förbinder skärningspunkterna
float chordDistanceSquared = ( r1 * r1 - r2 * r2 - distSquared ) * ( r1 * r1 - r2 * r2 - distSquared ) /( 4 * distSquared ); float chordDistance = sqrt ( chordDistanceSquared ) ;
6
Beräkna hälften av längden på ackordet :
float halfChordLength = sqrt ( r1 * r1 - chordDistanceSquared ) ,
7
Hitta den punkt i mitten av ackord :
Point chordMidpoint = p1 + chordDistance * Delta /sqrt ( distSquared ) ,
8
Beräkna placeringen av skärningspunkter med den information som du har beräknat hittills :
Intersection1.x = chordMidpoint.x + chordDistance * ( p2.y - p1.y ) /distans , Intersection1.y = chordMidpoint.y + chordDistance * ( p2.x - p1.x ) /distans , Intersection2.x = chordMidpoint.x - chordDistance * ( p2.y - p1 . y ) /distans , Intersection2.y = chordMidpoint.y - chordDistance * ( p2.x - p1.x ) /distans , Addera