La Red de Conocimientos Pedagógicos - Currículum vitae - La tangente común de dos círculos en programación C++

La tangente común de dos círculos en programación C++

Se divide en cinco situaciones: inclusión, corte interno, intersección, corte externo y separación.

Para facilitar la descripción, c2 por defecto es un círculo grande (si los radios son iguales, tome un círculo), d21 significa que el centro del círculo grande apunta al centro del círculo pequeño y d12 significa que el centro del círculo pequeño apunta al centro del círculo grande.

Incluyendo: La distancia entre los puntos centrales es menor que la diferencia en radios. En este caso, no hay una línea tangente y, naturalmente, no hay un punto tangente, porque al menos un punto tangente está garantizado, no es necesario considerar esta situación;

Firma: La distancia entre los centros de los dos círculos es igual a la diferencia en los radios. En este momento, hay un punto tangente único. Simplemente elija un punto en cualquier círculo en la dirección d12.

Intersección: La distancia entre los centros de dos circunferencias es entre la diferencia de los radios y la suma de los radios. En este momento, sólo hay dos tangentes comunes. El dibujo muestra que sus tangentes se encuentran en los dos círculos girados d12. α? Dirección del ángulo, donde α se puede encontrar por el radio y la distancia al centro.

Circunferencia: La distancia entre los centros de los dos círculos es igual a la suma de los radios, y hay una tangente común más que el punto de intersección. Simplemente elige un punto en la dirección d12 en cualquier círculo. .

Separación: La distancia entre los dos centros es mayor que la suma de los radios, y hay dos tangentes más comunes que en el caso de intersección. El dibujo muestra que sus tangentes están ubicadas en la dirección del ángulo β de rotación d12 del círculo c1, y en la dirección del ángulo β de rotación d12 del círculo c2, donde β se puede encontrar a partir del radio y la distancia al centro.

Entrada: las coordenadas del centro y los radios de los dos círculos C1 y C2.

c1x c1y c1r

c2x c2y c2r

Salida: las coordenadas de todas las tangentes (dos tangentes seguidas representan una tangente, si es una tangente común , salida uno).

# include & ltiostream & gt

Usar espacio de nombres std

Usar PDD = par & ltdouble, double & gt;

# Primero definir x

#definir y segundos

# definir BTN(func)_ _ incorporado _ # # func

Operador PDD + (PDD a, PDD b) {

Devolver PDD(a.x + b.x, a. y+b. y

}

Operador PDD - (PDD b) {

Devolver PDD(-b.x,-b.y);

}

Operador PDD - (PDD a, PDD b) {

Devolver PDD( a.x - b.x, a . y-b . y);

}

Operador PDD * (doble d, PDD b) {

Devolver PDD (d * b PDD(a.x/d,a.y/d);

}

//Producto escalar

Doble operador & amp(PDD a, PDD b) {.

Devuelve a . x * b . x+a . y * b y .

}

Rotación PDD (PDD a, doble t) {

Costo doble = btn(cos)(t), Sint = BTN(sin)(t);

Devolver PDD(a.x * costo - a.y * sint, a.x * Sint+a . y * costo);

}

Plantilla & lttypename T & gtT cuadrado (T constante & amperio) { return e * e }

Oyster&; operador<<(ostream&os, const PDD&p) {

return os<<('<<p.x<<,'<<p.y & lt& lt')';

}

int main()

{

PDD c1, C2;

doble r1, R2;

CIN & gt & gtc 1 . & gtc2.x & gt& gtc2.y & gt& gtR2;

if(r 1 & gt;r2) intercambiar(c1, c2), intercambiar(r1, R2);

int sqdis =((c 1-C2)&(c 1-C2));

doble d = BTN(sqrt)(sqdis);

PDD e 12 = ( c 1-C2)/d;

PDD v 1 = r 1 * e 12;

PDD v2 = R2 * e 12;

if( sqdis & lt; square(r2 - r1)) {

cout & lt& lt"No hay un objetivo común.

"& lt& ltendl

Devuelve 0;

}

if (sqdis == cuadrado(r2 - r1))?{

cout & lt& ltC2+v2 & lt;& ltendl

return 0;

}

doble l = d * R2/(R2-r 1);

Doble alfa = BTN(acos)(R2/l);

cout & lt& ltc1 + rotar(v1, +alfa)& lt & lt' & lt& ltc2 + rotar; (v2, +alpha)<& ltendl

cout <& ltc1 + rotar(v1,-alpha)<& lt' & lt& ltc2 + rotar(v2,-alpha)< p>

if (sqdis == cuadrado(r1 + r2))? {

cout & lt& ltC2+C2 & lt;& ltendl

}

else if(sqdis & gt; cuadrado (r1 + r2)) {

v 1 =-v 1;

l = d * R2/(r 1+R2) ;

Doble β= BTN(acos)(R2/l);

cout & lt& ltc1 + rotar(v1, +beta)& lt;& lt' & lt& ltc2 + rotar(v2, +beta)& lt;& ltendl

cout & lt& ltc1 + rotar(v1,-beta)& lt;& lt' & lt& ltc2 + rotar(v2,- beta)< <endl

}

Devuelve 0;

}