Encuentra el algoritmo. Encuentra el punto tangente dado un punto fuera del círculo.
CPoint CalcQieDian(CPoint ptCenter, CPoint ptOutside, double dbRadious)
{
punto de estructura {double x, y;}
punto E, F, G, H;
double r=dbRadious;
//1. Traduce las coordenadas al centro del círculo ptCenter y encuentra la nueva coordenada E de el punto fuera del círculo
p>
E.x= ptOutside.x-ptCenter.x;
E.y= ptOutside.y-ptCenter.y //Transformación de traducción a E;
//2. Encontrar La coordenada de intersección F del círculo y OE es equivalente a la transformación de escala de E
doble t= r / sqrt (E.x * E.x E.y * E.y) ; //Obtener la relación de escala
F.x= E.x * t; F.y= E.y * t; //Escalar y transformar a F
//3. punto tangente G, donde cos(a)=r/OF=t, entonces a=arccos(t);
double a=acos(t); //Obtener el ángulo de rotación
G.x=F.x*cos(a) -F.y*sin(a) ;
G.y=F.x*sin(a) F.y*cos(a); //Rotar y transformar a G
//4. Traduce G a las coordenadas originales para obtener la nueva Coordenada H
H.x=G.x ptCenter.x;
H.y=G.y ptCenter.y; Transformación de traducción a H
//5. Regresar a H
return CPoint(int(H.x), int(H.y));
//6. En el proceso de solicitud real, solo se requiere una variable intermedia E y las otras F, G y H no.
}
wangtk1982 dijo que estaba equivocado porque hay dos puntos tangentes. Sí, si giras el ángulo a en el paso 3, obtendrás un punto tangente, y si giras. el ángulo -a, obtendrás un punto tangente. ¿Crees que estás equivocado?
En la resolución de problemas reales, lo que queremos no es la solución completa, sino una de ellas. Se recomienda que eche un vistazo exhaustivo
y ejecute el código, y descubrirá que no hay ningún problema con esto.