Исходник программы - определение точек пересечения прямой с коружностью на Си(C++)


Добавил:DMT
Дата создания:29 апреля 2008, 18:17
Дата обновления:29 апреля 2008, 18:17
Просмотров:19138 последний позавчера, 0:42
Комментариев: 2
Исходник программы - определение точек пересечения прямой с коружностью на Си(C++)
Задаются прямая и окружность. Окружность задается координатами центра (x,y) и радиусом r; прямая - координатами двух принадлежащих ей точек (x1,y1) и (x2,y2). Требуется узнать координаты точек пересечения прямой и окружности или вывести сообщение о том, что они не пересекаются.
Код на C++
  1. #include<conio.h>
  2. #include<stdio.h>
  3. #include<iostream.h>
  4. #include<math.h>
  5.  
  6. void prover(float x,float y,float k,float b,float r)
  7. { //находим дискременант квадратного уравнения
  8. 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));
  9.  
  10. //если он равен 0, уравнение не имеет решения
  11. if(d<0) {cout<<"\n\nПрямая и окружность не пересекаются";return;}
  12. //иначе находим корни квадратного уравнения
  13. float x1=((-(2*k*b-2*x-2*y*k)-sqrt(d))/(2+2*k*k));
  14. float x2=((-(2*k*b-2*x-2*y*k)+sqrt(d))/(2+2*k*k));
  15. //если абсциссы точек совпадают, то пересечение только в одной точке
  16. if (x1==x2) {printf("\n\nПрямая и окружность имеют точку касания:(%.2f,%.2f)",x1,y1);
  17. return;}
  18. //иначе находим ординаты точек пересечения
  19. float y1=k*x1+b;
  20. float y2=k*x2+b;
  21. printf("\n\nПрямая и окружность пересекаются в точках: (%.2f,%.2f),
  22. (%.2f,%.2f)",x1,y1,x2,y2);
  23. return;
  24. }
  25.  
  26. void main()
  27. { float x,y,x1,x2,y1,y2,k,b,r;
  28. clrscr();
  29. cout<<"\nВведите координаты центра окружности:\n"<<"x=";
  30. cin>>x;
  31. cout<<"y=";
  32. cin>>y;
  33. cout<<"Введите радиус окружности:\n"<<"R=";
  34. cin>>r;
  35.  
  36. cout<<"\nВведите координаты точек прямой:\n"<<"x1=";
  37. cin>>x1;
  38. cout<<"y1=";
  39. cin>>y1;
  40. cout<<"x2=";
  41. cin>>x2;
  42. cout<<"y2=";
  43. cin>>y2;
  44. k=(y1-y2)/(x1-x2);
  45. b=y1-k*x1;
  46. prover(x,y,k,b,r);
  47. getch();
  48. }
При использовании обязательна ссылка на http://DMTSoft.ru
Пример обработки данных:
Пусть (2,2) - координаты центра окружности, радиус=2. (0,-2) и (2,0) - координаты точек, принадлежащих прямой. Т.е. x=2, y=2, r=2, x1=0, y1=-2, x2=2, y2=0. Тогда:
k=(-2-0)/(0-2)=1,
b=-2-1*0=-2,
d= (2*1*(-2)-2*2-2*2*1)^2-(4+4*1)*( (-2)^2-2^2+2^2+2^2-2*2*(-2))=16.
d>0, значит, прямая и окружность имеют точки (точку) пересечения. Вычисляем:
x1=(-(2*1*(-2)-2*2-2*2*1)-(v64))/(2+2*1)=2;
x2=(-(2*1*(-2)-2*2-2*2*1)+(v64))/(2+2*1)=4;
x1?x2, тогда вычисляем:
y1=1*2-2=0;
y2=1*4-2=2.
Значит, прямая и окружность пересекаются в двух точках с координатами (2,0) и (4,2).
up

Комментарии для "Исходник программы - определение точек пересечения прямой с коружностью на Си(C++)"


Пользователь: eugene_sm
Сообщений: 1
Статус: Незримый
Зарегистрирован:
20 августа 2008, 2:41
Был:20 августа 2008, 3:14
eugene_sm
smsup
Дата: 20 августа 2008, 3:14 Сообщение № 1
баговый алгоритм
Пользователь: night_stalker
Сообщений: 1
Статус: Незримый
Зарегистрирован:
25 сентября 2011, 10:42
Был:25 сентября 2011, 10:47
night_stalker
smsup
Дата: 25 сентября 2011, 10:47 Сообщение № 2
x1=(-(2*1*(-2)-2*2-2*2*1)-(v64))/(2+2*1)=8;
x2=(-(2*1*(-2)-2*2-2*2*1)+(v64))/(2+2*1)=18;
y1=1*8-2=6;
y2=1*16-2=14.

Там должно стоять корень из 16, а не из 64. sm
Тогда и результаты получаются другие.