From e37384d18f5c5608f524c39268240f41dca0ab68 Mon Sep 17 00:00:00 2001 From: Rodolfo Cuevas Date: Wed, 12 Dec 2018 13:30:38 -0300 Subject: [PATCH] limpieza 101 --- src/divide_and_conquer.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/divide_and_conquer.c b/src/divide_and_conquer.c index 190ccb8..1f29a97 100644 --- a/src/divide_and_conquer.c +++ b/src/divide_and_conquer.c @@ -35,35 +35,35 @@ int compareY(const void* a, const void* b){ //ordena el arreglo de puntos de 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; } -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 < size; ++i) - for (int j = i+1; j < size && (strip[j].y - strip[i].y) < min; ++j) - if (distance(strip[i],strip[j]) < min) - min = dist(strip[i], strip[j]); - - return min; + for (int i = 0; i < n; ++i) + for (int j = i+1; j < n && (strip[j].y - strip[i].y) < *minimum_dist; ++j) + if ((dist = distance(strip[i],strip[j])) < *minimum_dist){ + *minimum_dist = dist; + closest_pair[0] = strip[i]; + closest_pair[1] = strip[j]; + } } -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; point_t midpoint_t = P[mid]; - + // Consider the vertical line passing through the middle point_t // calculate the smallest distance dl on left of middle point_t and // dr on right side - float dl = closestUtil(P, mid); - float dr = closestUtil(P + mid, n-mid); + double dl = closestUtil(P, mid, minimum_dist, closest_pair); + 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*/ 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 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 *closest_pair = malloc(sizeof(point_t) * 2); - qsort(P, n, sizeof(point_t), compareX); - return closestUtil(P, n); //Usa la funcion recursiva closestUtil para encontrar la distancia minima + qsort(points, n, sizeof(point_t), compareX); + closestUtil(points, n, minimum_dist, closest_pair); //Usa la funcion recursiva closestUtil para encontrar la distancia minima + return closest_pair; }