Найти точку пересечения прямой и окружности - C#
Формулировка задачи:
Задана окружность с центром в точке O(0,0) и радиусом R0, и прямая y = ax+b. Определить, пересекаются ли прямая и окружность. Если пересекаются, найти точку пересечения.
Решение задачи: «Найти точку пересечения прямой и окружности»
textual
Листинг программы
class Programm
{
/*Circle properties*/
static double x0, y0, r;
/*Line properties*/
static double k, p;
public static void Main()
{
/*Init circle*/
init("x0 = ", out x0);
init("y0 = ", out y0);
init("r = ", out r);
/*Init line*/
init("k = ", out k);
init("p = ", out p);
double a = square(k) + 1;
double b = 2 * (k * (p - y0) - x0);
double c = square(b - y0) + square(x0) - square(r);
double x1, x2;
if (trySolutionSquareEquation(a, b, c, out x1, out x2))
{
Console.WriteLine("First point : [{0};{1}]", x1, y(x1));
Console.WriteLine("Second point : [{0};{1}]", x2, y(x2));
}
else
{
Console.WriteLine("Equation not have solution");
}
Console.ReadLine();
}
/*Function of line*/
private static double y(double x)
{
return k * x + p;
}
/*Get square of value*/
private static double square(double value)
{
return Math.Pow(value, 2.0);
}
/*Solving equation*/
private static bool trySolutionSquareEquation(double a, double b, double c, out double x1, out double x2)
{
x1 = double.NaN;
x2 = double.NaN;
double discriminant = b * b - 4 * a * c;
if (discriminant < 0)
{
return false;
}
double k = -b / 2 * a;
discriminant /= 2 * a;
x1 = k - Math.Sqrt(discriminant);
x2 = k + Math.Sqrt(discriminant);
return true;
}
private static void init(string message, out double value)
{
Console.Write(message);
value = readDoubleFromTerminale();
}
private static double readDoubleFromTerminale()
{
string doubleString;
double doubleValue;
do
{
doubleString = Console.ReadLine();
}
while (!Double.TryParse(doubleString, out doubleValue));
return doubleValue;
}
}