Cálculo dos pontos de intersecção de dois círculos é um problema um pouco complicado na geometria , mas a solução é fácil e simples de implementar em C + +. Você vai precisar de algum tipo de classe de ponto disponível que pode lidar com a aritmética básica, como adição e subtração de pontos 2- dimensionais. Se você não tiver um, você pode usar um
std :: vector da Standard Template Library , da mesma forma . Coisas que você precisa
classe Point que lida com aritmética básica
Show Mais instruções
Verificar Casos Especiais
1 Calcule a distância entre os centros dos círculos :
Ponto delta = p2 - p1 ; flutuar distanceSquared = delta.X * delta.X + delta.Y * delta.Y ; flutuador distância = sqrt ( distanceSquared );
2
Verificação se os círculos são completamente separadas umas das outras . Neste caso , a distância entre os centros dos círculos irá ser maior do que a soma dos seus raios , de modo que não há nenhuma maneira que se pode cortar . Se este for o caso, tratar o erro de qualquer maneira que funciona melhor para o seu programa
if ( distSquared > ( R1 + R2 ) * ( R1 + R2 )) noIntersections retorno ; .
3
Verifique se um círculo é completamente dentro do outro. Neste caso, haverá também há soluções
if ( distSquared <( r1 - r2) * ( r1 - r2) ) retornar noInersections ; .
4
Verifique se o círculos são idênticos . Isto significa que há um número infinito de soluções - um para cada ponto no círculo
if ( distSquared == 0 && r1 == r2) infiniteIntersections retorno ; .
Encontre o Interseções
5
Calcule a distância do centro do primeiro círculo para o acorde que liga os pontos de intersecção
flutuar chordDistanceSquared = (R1 * r1 - . r2 r2 * - distSquared ) * ( * r1 r1 - r2 * r2 - distSquared ) /( 4 * distSquared ) ; flutuar chordDistance = sqrt ( chordDistanceSquared ) ;
6
Calcular a metade do comprimento da corda :
flutuar halfChordLength = sqrt ( r1 * r1 - chordDistanceSquared );
7
Encontre o ponto no centro da corda :
ponto chordMidpoint = p1 + chordDistance * delta /sqrt ( distSquared );
8
Calcule as localizações dos pontos de intersecção , utilizando as informações que você já calculou até agora:
Intersection1.x = chordMidpoint.x + chordDistance * ( p2.y - p1.y ) /distância ; Intersection1.y = chordMidpoint.y + chordDistance * ( p2.x - p1.x ) /distância ; Intersection2.x = chordMidpoint.x - chordDistance * ( p2.y - p1 . y) /distância ; Intersection2.y = chordMidpoint.y - chordDistance * ( p2.x - p1.x ) /distância ;