From b1c3c1aa3139eb062669356fa2e4e31c20b0a365 Mon Sep 17 00:00:00 2001 From: Rodolfo Cuevas Date: Wed, 12 Dec 2018 12:33:06 -0300 Subject: [PATCH] xd --- src/divide_and_conquer.c | 75 +++++++++------------------------------- 1 file changed, 17 insertions(+), 58 deletions(-) diff --git a/src/divide_and_conquer.c b/src/divide_and_conquer.c index a22f1f8..190ccb8 100644 --- a/src/divide_and_conquer.c +++ b/src/divide_and_conquer.c @@ -39,6 +39,20 @@ float min(float x, float y){ // Función para encontrar el mayor entre dos valo 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 +{ + float min = d; // inicializa en la distancia minima d + + 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; +} + float closestUtil(point_t P[], int n){ // Función para encontrar la distancia más corta entre puntos int mid = n/2; point_t midpoint_t = P[mid]; @@ -62,66 +76,11 @@ float closestUtil(point_t P[], int n){ // Función para encontrar la distancia m distance es strip[]*/ return min(d, stripClosest(strip, j, d) ); } - -float stripClosest(point_t strip[], int size, float d) // Función para encontrar la distancia entre los puntos más cerca del arreglo dado -{ - float min = d; // inicializa en la distancia minima d - - 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; -} 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 +} - - float closest(point_t P[], int n) - { - qsort(P, n, sizeof(point_t), compareX); - return closestUtil(P, n); /*Uso recursivo de la funcion closestUtil() para encontrar la distancia más pequeña*/ - } - return closest_pair; - } - - float closestUtil(point_t P[], int n) /*Función recursiva para encontrar la distancia más pequeña. El arreglo - P contiene todos los puntos ordenados respecto a la cordenada X */ - { - int mid = n/2; - point_t midpoint_t = P[mid]; - /*Considerando la linea vertical que pasa a travez del punto medio, calcula el distanca mas corta en dl - de la izquierda de la mitad y dr en el lado derecho*/ - float dl = closestUtil(P, mid); - float dr = closestUtil(P + mid, n-mid); - - // Find the smaller of two distances - float d = min(dl, dr); - - // Build an array strip[] that contains point_ts close (closer than d) - // to the line passing through the middle point_t - point_t strip[n]; - int j = 0; - for (int i = 0; i < n; i++) - if (abs(P[i].x - midpoint_t.x) < d) - strip[j] = P[i], j++; - - // Find the closest point_ts in strip. Return the minimum of d and closest - // distance is strip[] - return min(d, stripClosest(strip, j, d) ); - } - - // The main functin that finds the smallest distance - // This method mainly uses closestUtil() - float closest(point_t P[], int n) - { - qsort(P, n, sizeof(point_t), compareX); - - // Use recursive function closestUtil() to find the smallest distance - return closestUtil(P, n); - }