Чисто математически задача решается так: (взято с http://dmtsoft.ru/bn/377/as/oneaticleshablon/ и подправлено, чтобы компилилось в студии)
| Код | #include<stdio.h> #include<iostream> #include<math.h> using namespace std;
void prover(float x,float y,float k,float b,float r) { //находим дискременант квадратного уравнения float d=(pow((2*k*b-2*x-2*y*k),2)-(4+4*k*k)*(b*b-r*r+x*x+y*y-2*y*b)); //если он равен 0, уравнение не имеет решения if(d<0) {cout<<"\n\nПрямая и окружность не пересекаются";return;} //иначе находим корни квадратного уравнения float x1=((-(2*k*b-2*x-2*y*k)-sqrt(d))/(2+2*k*k)); float x2=((-(2*k*b-2*x-2*y*k)+sqrt(d))/(2+2*k*k)); //если абсциссы точек совпадают, то пересечение только в одной точке if (x1==x2) {printf("\n\nПрямая и окружность имеют точку касания:(%.2f,%.2f)",x1,y1); return;} //иначе находим ординаты точек пересечения float y1=k*x1+b; float y2=k*x2+b; printf("\n\nПрямая и окружность пересекаются в точках: (%.2f,%.2f),(%.2f,%.2f)",x1,y1,x2,y2); return; } void main() { float x,y,x1,x2,y1,y2,k,b,r; cout<<"\nВведите координаты центра окружности:\n"<<"x="; cin>>x; cout<<"y="; cin>>y; cout<<"Введите радиус окружности:\n"<<"R="; cin>>r; cout<<"\nВведите координаты точек прямой:\n"<<"x1="; cin>>x1; cout<<"y1="; cin>>y1; cout<<"x2="; cin>>x2; cout<<"y2="; cin>>y2; k=(y1-y2)/(x1-x2); b=y1-k*x1; prover(x,y,k,b,r); }
|
Собственно можно выдернуть отсюда функцию prover. Вроде работает верно, хотя проверял не дотошно.
|