Red de conocimiento informático - Computadora portátil - ¿Cómo obtener las coordenadas de n puntos dados en el plano en c para obtener el radio mínimo del círculo?

¿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;stdio.hgt;

#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) ||

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);

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]);

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

*/