¿Cómo obtener las coordenadas de n puntos dados en el plano en c para obtener el radio mínimo del círculo?
#include lt;math.hgt;
//Ingrese el número máximo de puntos
#define MAX_POINTS_AMOUNT 100
estructura Punto
{
double x, y
}
// Encuentra entre puntos p1 y distancia p2
doble distancia(struct Point p1, struct Point p2)
{
return sqrt((p1.x - p2.x)*( p1 .x - p2.x) (p1.y - p2.y)*(p1.y - p2.y));
}
// Encuentra a, b , El valor máximo de c
double max(double a, double b, double c)
{
return agt;=b amp;amp; ;= c
? a
: bgt;=a amp; bgt;=c
b
:c
}
// Determinar si tres segmentos de línea con longitudes a, byc pueden formar un triángulo
// La base del juicio es: en longitud de al menos un lado Mayor que la diferencia (valor absoluto) entre las longitudes de los otros dos lados y menor que la suma de las longitudes de los otros dos lados
int canMakeTriangle(double a, double b, double c)
{
return agt; fabs(b-c) amp; alt; (b c) ||
bgt; amp; blt; (a c) || p>
cgt; fabs(a-b) amp; (a b); según el teorema del coseno, determina las longitudes como a, byc. Si los tres segmentos de línea pueden formar un triángulo agudo
//Juzga según el coseno del ángulo
int canMakeAcuteTriangle (doble a, doble b, doble c)
{
unsigned int i
doble cos_a, cos_b,
if(canMakeTriangle( a, b, c))
{
cos_a = (b*b c*c - a*a)/(2*b*c); p>
cos_b = (a*a c*c - b*b) /(2*a*c
cos_c = (a*a b*b - c*c)/(2); *a*b);
devolver cos_agt; 0 amp;amp; cos_bgt; 0 amp;cos_cgt;
}
/* Pregunte al radio del círculo más pequeño que cubra n puntos
Algoritmo:
Simplemente encuentre el círculo más pequeño que cubra los 3 puntos y tomar el radio máximo, que es
Poder.
Los pasos para determinar el círculo más pequeño que cubre 3 puntos son los siguientes:
(1) Si los 3 puntos forman un triángulo rectángulo o un triángulo obtuso, o forman un triángulo de tres puntos *** línea, en En este caso, el radio del círculo más pequeño es la mitad del más largo de los tres lados.
(2) En caso contrario, los tres puntos forman un triángulo agudo, y la circunferencia mínima es la circunferencia circunscrita de los tres puntos.
(3) Cálculo del radio del círculo circunscrito:
(a) Si 3 puntos forman un triángulo (es decir, (a) Si 3 puntos forman un triángulo (es decir, 3 puntos no son *** *),
Y suponiendo que las coordenadas de los tres puntos son (x1, y1), (x2, y2) y (x3, y3), encuentra los dos puntos ( x1, y1) y (x2, y2)
L1=sqrt(((x1-x2)^2 (y1-y2)^2), también encuentre la distancia L2 entre (x1, y1) y (x3, y3),
Y la distancia L3 entre (x2, y2) y (x3, y3)
(b) Encuentra el semiperímetro L= (L1 L2 L3 )/2 del triángulo, y el área S. =sqrt(L*(L-L1))*(L-L2)*(L-L3)
(c) Según el fórmula 4SR=L1*L2*L3/(4*S) Encuentra el radio del círculo exterior R=L1*L2*L3
Parámetros:
n: número de puntos
puntos: coordenadas de n puntos
inicio: parámetro recursivo Indica que la selección actual comienza desde el punto inicial de n puntos
SelectPointsAmount: el valor inicial. del parámetro recursivo es 0. /p>
selectPoints: parámetro recursivo la matriz de coordenadas del punto seleccionado actualmente. El valor inicial es NULL. El radio del círculo más pequeño que cubre n puntos.
*/
doble minCircleRadius(unsigned int n, struct Point points[],
unsigned int start, unsigned int selectPointsAmount. struct Point selectPoints[])
{
si(n lt; = 1)
devuelve 0.0;
si(n == 2)
distancia de retorno(puntos[0], puntos[1])/2.0 )
else
{
if(selectPointsAmount == 3)
{// Se han seleccionado tres puntos, encuentra el radio del círculo más pequeño que los cubre
double L1 = distancia(selectPoints[0], selectPoints[1]) /2.0;
Devuelve 0;
if(n == 2)
Devuelve distancia(puntos[0], puntos[1])/2.0 selectPoints[1] ) ;
doble L2 = distancia(selectPoints[0], selectPoints[2]);
doble L3 = distancia(selectPoints[1], selectPoints[2]); p >
doble L = (L1 L2 L3)/2.0;
doble S = sqrt(L*(L-L1)*(L-L2)*(L-L3)); /p> p>
if(canMakeAcuteTriangle(L1, L2, L3))
{// puede hacer un triángulo agudo
return L1*L2*L3/(4.0 *S) ;
}
else
{//Otras situaciones: línea *** de tres puntos, formando un triángulo rectángulo o agudo- triángulo en ángulo
return max(L1, L2, L3)/2.0;
}
}
else
{//Seleccione 3 puntos
double r, minR = 0.0;
unsigned int i
struct Point temp[3]; p>
if(selectPoints = = NULL)
selectPoints = temp;
for(i=start;(n-i)gt;=(3-selectPointsAmount);i)
{
seleccionarPuntos[ selectPointsAmount] = puntos[i];
r = minCircleRadius(n, puntos, i 1, selectPointsAmount 1, selectPoints); /p>
if (minR lt; r)
minR = r
}
Devuelve minR;
}
}
}
int main(int argc, char *argv[])
{
estructura Puntos[MAX_ POINTS_AMOUNT];
unsigned int i, n
while(scanf("d", amp; n)! =EOF)
{
for(i=0; ilt; n; i)
scanf("lf, lf", amp; puntos[i].x, amp; puntos[i].y);
printf(".4lf\n", amp; puntos[i].minCircleRadius(n, puntos, 0, 0, NULL));
}
devuelve 0
}
/*
4
4,2, 5,6
78,3, 3,8
35,4, 15,9
29,88, 42,56
*/