Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <math.h>
- #define MAXN 10
- #define EPS 0.0000001
- typedef struct {
- double x;
- double y;
- } Point;
- /*
- * Tipo "Rectangle" per rappresentare i rettangoli paralleli al sistema di
- * riferimento cartesiano. Il rettangolo e` rappresentato con i suoi due punti
- * estremi (alto-sinistra e basso-destra)
- */
- typedef struct {
- Point A; // alto-sinistra
- Point B; // basso-destra
- } Rectangle;
- /*
- * Stampa a video un punto
- */
- void point_print(Point p) {
- printf("(%.3lf, %.3lf)\n", p.x, p.y);
- }
- /*
- * Calcola la distanza euclidea tra due punti
- */
- double point_dist(Point p1, Point p2) {
- return sqrt(pow(p1.x-p2.x, 2) + pow(p1.y-p2.y, 2));
- }
- /*
- * restituisce 1 se p e` interno (o sul bordo) a r
- * 0 altrimenti
- */
- int point_is_internal(Point p, Rectangle r) {
- if (p.x >= r.A.x && p.x <= r.B.x && p.y >= r.B.y && p.y <= r.A.y)
- return 1;
- else
- return 0;
- }
- /*
- * Calcola l'area di un rettangolo
- */
- double rectangle_area(Rectangle r) {
- double b, h;
- b = r.B.x - r.A.x;
- h = r.A.y - r.B.y;
- return b*h;
- }
- /*
- * Cerca quale punto di una lista e' piu' lontano da un punto dato
- */
- int check_couple(Point p, Point vect[], int len) {
- int i, maxInd;
- double max = -1;
- for (i = 0; i < len; i++) {
- double dist = point_dist(p, vect[i]);
- if (dist > max) {
- max = dist;
- maxInd = i;
- }
- }
- return maxInd;
- }
- int main(int argc, const char *argv[]) {
- Point vect[MAXN];
- int i, maxIndI, maxIndJ;
- unsigned n;
- double max = -1;
- char linea[1024];
- /* input del numero di punti */
- printf("# Numero dei punti (max %d): ", MAXN);
- fgets(linea, sizeof(linea), stdin);
- sscanf(linea, "%u", &n);
- n = atoi(linea);
- /* se n e` maggiore di MAXN uso MAXN */
- if (n > MAXN)
- n = MAXN;
- for (i = 0; i < n; i++) {
- printf("# Inserire il %do punto: ", i + 1);
- fgets(linea, sizeof(linea), stdin);
- sscanf(linea, "%lf %lf", &vect[i].x, &vect[i].y);
- }
- /* stampo i punti */
- printf("\n[PUNTI]\n");
- for (i = 0; i < n; i++) {
- point_print(vect[i]);
- }
- /* stampa delle distanze dall'origine */
- Point origine = {0, 0};
- printf("\n[DISTANZE]\n");
- for (i = 0; i < n; i++) {
- printf("%.3lf\n", point_dist(vect[i], origine));
- }
- /* acquisizione del rettangolo */
- Rectangle rect;
- printf("# Inserire l'angolo in alto a destra del rettangolo: ");
- fgets(linea, sizeof(linea), stdin);
- sscanf(linea, "%lf %lf", &rect.A.x, &rect.A.y);
- printf("# Inserire l'angolo in basso a sinistra del rettangolo: ");
- fgets(linea, sizeof(linea), stdin);
- sscanf(linea, "%lf %lf", &rect.B.x, &rect.B.y);
- printf("\n[INTERNI]\n");
- for (i = 0; i < n; i++) {
- if (point_is_internal(vect[i], rect))
- point_print(vect[i]);
- }
- /* Area rettangolo */
- printf("\n[AREA]\n");
- printf("%.3lf\n", rectangle_area(rect));
- /*
- * Coppia piu` distante
- * check_couple mi dice qual e` il punto piu` distante dal punto p dato.
- */
- for (i = 0; i < n; i++) {
- int ind = check_couple(vect[i], vect, n);
- /*
- * vect[ind] e` il punto piu` distante da vect[i]
- * dist e` la distanza tra loro
- */
- double dist = point_dist(vect[i], vect[ind]);
- /* devo trovare per quale punto vect[i], dist e` massimo */
- if (dist > max) {
- /*
- * in questa ricerca di max mi segno anche gli indici
- * dei 2 punti
- */
- max = dist;
- maxIndI = i;
- maxIndJ = ind;
- }
- }
- printf("\n[COPPIA]\n");
- point_print(vect[maxIndI]);
- point_print(vect[maxIndJ]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement