limpieza 101

This commit is contained in:
Rodolfo Cuevas 2018-12-12 13:30:38 -03:00
parent b1c3c1aa31
commit e37384d18f
1 changed files with 21 additions and 19 deletions

View File

@ -35,35 +35,35 @@ int compareY(const void* a, const void* b){ //ordena el arreglo de puntos de
return (p1->y - p2->y); return (p1->y - p2->y);
} }
float min(float x, float y){ // Función para encontrar el mayor entre dos valores flotantes double min(double x, double y){ // Función para encontrar el mayor entre dos valores flotantes
return (x < y)? x : y; return (x < y)? x : y;
} }
float stripClosest(point_t strip[], int size, float d) // Función para encontrar la distancia entre los puntos más cerca del arreglo dado void stripClosest(point_t *strip, int n, double *minimum_dist, point_t *closest_pair) // Función para encontrar la distancia entre los puntos más cerca del arreglo dado
{ {
float min = d; // inicializa en la distancia minima d double dist;
qsort(strip, n, sizeof(point_t), compareY);
qsort(strip, size, sizeof(point_t), compareY); for (int i = 0; i < n; ++i)
for (int j = i+1; j < n && (strip[j].y - strip[i].y) < *minimum_dist; ++j)
for (int i = 0; i < size; ++i) if ((dist = distance(strip[i],strip[j])) < *minimum_dist){
for (int j = i+1; j < size && (strip[j].y - strip[i].y) < min; ++j) *minimum_dist = dist;
if (distance(strip[i],strip[j]) < min) closest_pair[0] = strip[i];
min = dist(strip[i], strip[j]); closest_pair[1] = strip[j];
}
return min;
} }
float closestUtil(point_t P[], int n){ // Función para encontrar la distancia más corta entre puntos double closestUtil(point_t *P, int n, double *minimum_dist, point_t *closest_pair){ // Función para encontrar la distancia más corta entre puntos
int mid = n/2; int mid = n/2;
point_t midpoint_t = P[mid]; point_t midpoint_t = P[mid];
// Consider the vertical line passing through the middle point_t // Consider the vertical line passing through the middle point_t
// calculate the smallest distance dl on left of middle point_t and // calculate the smallest distance dl on left of middle point_t and
// dr on right side // dr on right side
float dl = closestUtil(P, mid); double dl = closestUtil(P, mid, minimum_dist, closest_pair);
float dr = closestUtil(P + mid, n-mid); double dr = closestUtil(P + mid, n-mid, minimum_dist, closest_pair);
float d = min(dl, dr); // Encontrar la distancia minima de dos puntos double d = min(dl, dr); // Encontrar la distancia minima de dos puntos
/* Crea un arreglo que contiene los puntos cercanos, mas cerca que d*/ /* Crea un arreglo que contiene los puntos cercanos, mas cerca que d*/
point_t strip[n]; point_t strip[n];
@ -74,13 +74,15 @@ float closestUtil(point_t P[], int n){ // Función para encontrar la distancia m
/*Encontrar el punto más cercano en la cinta, retornando el minimo de d y el más cercano /*Encontrar el punto más cercano en la cinta, retornando el minimo de d y el más cercano
distance es strip[]*/ distance es strip[]*/
return min(d, stripClosest(strip, j, d) ); *minimum_dist = min(d, stripClosest(strip, j, minimum_dist, closest_pair) );
return *minimum_dist;
} }
point_t * divide_and_conquer(point_t *points, unsigned int n, double *minimum_dist) { point_t * divide_and_conquer(point_t *points, unsigned int n, double *minimum_dist) {
point_t *closest_pair = malloc(sizeof(point_t) * 2); point_t *closest_pair = malloc(sizeof(point_t) * 2);
qsort(P, n, sizeof(point_t), compareX); qsort(points, n, sizeof(point_t), compareX);
return closestUtil(P, n); //Usa la funcion recursiva closestUtil para encontrar la distancia minima closestUtil(points, n, minimum_dist, closest_pair); //Usa la funcion recursiva closestUtil para encontrar la distancia minima
return closest_pair;
} }