Консультация № 178956
06.06.2010, 20:16
0.00 руб.
0 2 1
Здравствуйте! Пожалуйста помогите решить задачку. Условие задачи:
Найти координаты точек пересечения прямой у=kx+b и окружности радиуса R в центре в начале координат. В каких координатных четвертях находятся точки пересечения? Если точек пересечения нет или прямая касается окружности, выдать соответсвующее сообщение. {Задача на ветвление.}
Заранее благодарен!
[Borland C++ 5.02]

Обсуждение

Неизвестный
07.06.2010, 22:51
общий
это ответ
Здравствуйте, Dextrous.

Решение приведено в приложении. Если точка пересечения находится на одной из осей, то программа, для простоты, относит ее к какой-либо четверти.
За неимением Borland C++ 5 программа проверена в Code::Blocks 10.05 и MSVC++ 6.0.

Успехов!

Приложение:
/*
Найти координаты точек пересечения прямой у=kx+b и окружности радиуса
R с центром в начале координат. В каких координатных четвертях
находятся точки пересечения? Если точек пересечения нет или прямая
касается окружности, выдать соответсвующее сообщение.

решаем систему уравнений:
x^2 + y^2 = r^2
y = k*x + b

Получаем:
x(1,2) = (-k*b +- sqrt( r^2*( 1+k^2 ) - b^2 ))/( 1+k^2 )
*/

#include <math.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

const double eps = 1e-6; // вычисления с плавающей точкой - приближенные

int quarter( double x, double y )
{
if( x >= 0 && y >= 0 ) return 1;
if( x <= 0 && y >= 0 ) return 2;
if( x <= 0 && y <= 0 ) return 3;
return 4;
}

int main()
{
double r, k, b;
cout << "Введите радиус окружности: R = ";
cin >> r;
cout << "Уравнение прямой y = kx + b\nk = ";
cin >> k;
cout << "b = ";
cin >> b;

double t = 1 + k*k;
double d = r*r*t - b*b;

if( fabs(d) < eps ) { // приблизительно 0 - касание
double x = -k*b/t;
double y = k*x + b;
cout << "Прямая касается окружности в точке (x,y) = (" << x << ", " << y << ")\n";
cout << "Точка касания находится в " << quarter( x, y ) << "-й четверти\n";
}
else if( d < 0 )
cout << "Прямая и окружность не пересекаются\n";
else {
double kb = -k*b;
double d2 = sqrt( d );
double x1 = (kb - d2)/t;
double x2 = (kb + d2)/t;
double y1 = k*x1 + b;
double y2 = k*x2 + b;
cout << "Прямая пересекает окружность в точках\n"
"\t(x1,y1) = (" << x1 << ", " << y1 << ")\n"
"\t(x2,y2) = (" << x2 << ", " << y2 << ")\n";
cout << "Точки пересечения находятся в " << quarter( x1, y1 ) << "-й и "
<< quarter( x2, y2 ) << "-й четвертях\n";
}
system( "pause" );
return 0;
}
5
Неизвестный
09.06.2010, 12:54
общий
Благодарю!!
Форма ответа