Calcolo dei punti di intersezione dei due cerchi è un problema un po 'complicato in geometria , ma la soluzione è semplice e semplice da implementare in C + + . Avrete bisogno di un qualche tipo di classe point a disposizione in grado di gestire operazioni aritmetiche di base , come l'addizione e la sottrazione di punti 2 -dimensionali . Se non ne avete uno , potete usare un std :: vector
della Standard Template Library nello stesso modo . Cose che ti serviranno
classe Point che gestisce l'aritmetica di base
Mostra più istruzioni Appartamenti Controlla in casi particolari
1 Calcola la distanza tra i centri dei cerchi : < br
Point > delta = p2 - p1 ; float distanceSquared = delta.X * delta.X + delta.Y * delta.Y ; distanza float = sqrt ( distanceSquared ) ;
2
Arrivo se i cerchi sono completamente separati gli uni dagli altri . In questo caso , la distanza tra i centri dei cerchi sarà maggiore della somma dei loro raggi , quindi non c'è modo possono intersecarsi . Se questo è il caso , gestire l'errore nel modo che funziona meglio per il vostro programma
se ( distSquared > ( R1 + R2 ) * ( R1 + R2 ) ) noIntersections ritorno; .
3
Verificare se un cerchio è completamente dentro l'altro . In questo caso , ci saranno anche presenti soluzioni
se ( distSquared < ( r1 - r2 ) * ( r1 - r2 ) ) noInersections ritorno; .
4
Verifica se la cerchi sono identici . Questo significa che ci sono un numero infinito di soluzioni - uno per ogni punto del cerchio
se ( distSquared == 0 && r1 == r2 ) infiniteIntersections ritorno; .
< . br> Trova le intersezioni
5
Calcola la distanza dal centro del primo cerchio alla corda che collega i punti di intersezione
float chordDistanceSquared = ( r1 * r1 - r2 * r2 - distSquared ) * ( r1 * r1 - r2 * r2 - distSquared ) /( 4 * distSquared ) ; float chordDistance = sqrt ( chordDistanceSquared ) ;
6
Calcolare la metà della lunghezza della corda :
float halfChordLength = sqrt ( r1 * r1 - chordDistanceSquared ) ;
7
Trova il punto al centro della corda :
Point chordMidpoint = p1 + chordDistance * delta /sqrt ( distSquared ) ;
8
calcolare la posizione dei punti di intersezione con le informazioni che hai calcolato finora:
Intersection1.x = chordMidpoint.x + chordDistance * ( p2.y - p1.y ) /distanza ; Intersection1.y = chordMidpoint.y + chordDistance * ( p2.x - p1.x ) /distanza ; Intersection2.x = chordMidpoint.x - chordDistance * ( p2.y - p1 . y) /distanza ; Intersection2.y = chordMidpoint.y - chordDistance * ( p2.x - p1.x ) /distanza ;