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