COMP1721 - Higher Computing 1B

Higher Computing 1B - Week 8 Laboratory Exercises


/*
 * Find the closest pair in set of points in 3-space
 *
 * written by Andrew Taylor andrewt@cse.unsw.edu.au
 * September 2001 as a COMP1721 lab exercise
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct point {
    double x,y,z;
};
typedef struct point point;

point *read_point(void);
void print_point(point *p);
double distance(point *a, point *b);
double square(double x);

int
main(int argc, char *argv[]) {
    point  **set;
    int    set_size, i, j, closest1, closest2;
    double min_distance;
    
    printf("How many points in your set? ");
    scanf("%d", &set_size);
    
    set = malloc(set_size * sizeof (point *));
    if (set == NULL) {
        fprintf(stderr, "polygon: out of memory\n");
        return 1;
    }
    
    for (i = 0; i < set_size; i++) {
        printf("Enter point %d: ", i);
        set[i] = read_point();
    }

    closest1 = 0;
    closest2 = 1;
    min_distance = distance(set[closest1], set[closest2]);
    for (i = 0; i < set_size; i++) {
        for (j = i + 1; j < set_size; j++) {
            double dist = distance(set[i], set[j]);
            if (dist < min_distance) {
                min_distance = dist;
                closest1 = i;
                closest2 = j;
            }
        }
    }
    printf("The closest two points are ");
    print_point(set[closest1]);
    printf(" and ");
    print_point(set[closest2]);
    printf(".\nThe distance between them is %g.\n", min_distance);
    
    return 0;
}

point *
read_point(void) {
    point *p;
    p = malloc(sizeof (point));
    if (p == NULL) {
        fprintf(stderr, "nearest: out of memory\n");
        exit(1);
    }
    
    scanf("%lf%lf%lf", &(p->x), &(p->y), &(p->z));
    return p;
}

void
print_point(point *p) {
    printf("(%g,%g,%g)", p->x, p->y, p->z);
}

double
distance(point *a, point *b) {
    return sqrt(
        square(a->x - b->x) +
        square(a->y - b->y) +
        square(a->z - b->z)
        );
}

double
square(double x) {
    return x*x;
}


Andrew Taylor (andrewt@cse.unsw.edu.au)
Higher Computing 1B, Computer Science & Engineering, UNSW