Даны два множества точек на плоскости. Найти центр и радиус окружности - C (СИ)
Формулировка задачи:
Даны два множества точек на плоскости. Найти центр и радиус окружности, проходящей через K (K >=3) точек первого множества и содержащий строго внутри себя М точек второго множества.
Кто может переделать программу? без typedef struct и inline
static, а на обычном, понятном СИ
#include <stdio.h>
#include <math.h>
// представление результата сруктурой
typedef struct CIRCLE
{
double x;
double y;
double r;
} circle;
// вспомогательная функция, определитель специального вида
inline
static double det(
double a1, double b1, double c1,
double a2, double b2, double c2 )
{
double d = (a1*a1+a2*a2)*b2 + (b1*b1+b2*b2)*c2 + (c1*c1+c2*c2)*a2;
d -= (a1*a1+a2*a2)*c2 + (b1*b1+b2*b2)*a2 + (c1*c1+c2*c2)*b2;
return d;
}
// длина отрезка
inline
static double norm(double x1, double y1, double x2, double y2)
{
double x = x1 - x2;
double y = y1 - y2;
return sqrt(x*x+y*y);
}
// вычисление описанной окружности
circle circumscribed(
double x1, double y1,
double x2, double y2,
double x3, double y3 )
{
circle crcl;
double a = norm(x1, y1, x2, y2);
double b = norm(x1, y1, x3, y3);
double c = norm(x3, y3, x2, y2);
double Dinv = 0.5/(x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2));
crcl.r = a*b*c*fabs(Dinv);
crcl.x = Dinv*det(x1, x2, x3, y1, y2, y3);
crcl.y = -Dinv*det(y1, y2, y3, x1, x2, x3);
return crcl;
}
int main()
{
double x1, y1;
double x2, y2;
double x3, y3;
circle c;
printf("Input x1 y1 x2 y2 x3 y3: ");
scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3);
c = circumscribed(x1, y1, x2, y2, x3, y3);
printf("Center: (%g, %g)\n", c.x, c.y);
printf("Radius: %g\n", c.r);
return 0;
}
программа работает.. кто поможет ее переделать,
готов оплатить работу
Решение задачи: «Даны два множества точек на плоскости. Найти центр и радиус окружности»
textual
Листинг программы
#include <stdio.h>
#include <math.h>
double gx;
double gy;
double gr;
// вспомогательная функция, определитель специального вида
double det( double a1, double b1, double c1, double a2, double b2, double c2 )
{
return (a1*a1+a2*a2)*b2 + (b1*b1+b2*b2)*c2 + (c1*c1+c2*c2)*a2 - (a1*a1+a2*a2)*c2 - (b1*b1+b2*b2)*a2 - (c1*c1+c2*c2)*b2;
}
// длина отрезка
double norm(double x1, double y1, double x2, double y2)
{
return sqrt((x1 - x2)*(x1 - x2)+(y1 - y2)*(y1 - y2));
}
// вычисление описанной окружности
void circumscribed( double x1, double y1, double x2, double y2, double x3, double y3 )
{
double Dinv = 0.5/(x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2));
gr = norm(x1, y1, x2, y2)*norm(x1, y1, x3, y3)*norm(x3, y3, x2, y2)*fabs(Dinv);
gx = Dinv*det(x1, x2, x3, y1, y2, y3);
gy = -Dinv*det(y1, y2, y3, x1, x2, x3);
}
int main()
{
double x1, y1;
double x2, y2;
double x3, y3;
printf("Input x1 y1 x2 y2 x3 y3: ");
scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3);
circumscribed(x1, y1, x2, y2, x3, y3);
printf("Center: (%g, %g)\n", gx, gy);
printf("Radius: %g\n", gr);
return 0;
}
Объяснение кода листинга программы
- В начале кода объявлены переменные gx, gy, gr.
- Далее идут две функции: det и norm.
- Функция det вычисляет определитель матрицы 6х6.
- Функция norm вычисляет длину отрезка между двумя точками на плоскости.
- Функция circumscribed вычисляет центр и радиус окружности, которая проходит через три точки на плоскости.
- В функции main() с помощью scanf() считываются координаты трёх точек.
- Затем вызывается функция circumscribed(x1, y1, x2, y2, x3, y3), передавая координаты трёх точек.
- Результат работы функции: координаты центра и радиус описанной окружности, выводятся на экран с помощью printf().
- Код завершается возвратом 0 из функции main(), что означает успешное выполнение программы.