Advertisement
Guest User

Untitled

a guest
Nov 18th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5. #define MAXN 10
  6. #define EPS 0.0000001
  7.  
  8. typedef struct {
  9. double x;
  10. double y;
  11. } Point;
  12.  
  13. /*
  14. * Tipo "Rectangle" per rappresentare i rettangoli paralleli al sistema di
  15. * riferimento cartesiano. Il rettangolo e` rappresentato con i suoi due punti
  16. * estremi (alto-sinistra e basso-destra)
  17. */
  18. typedef struct {
  19. Point A; // alto-sinistra
  20. Point B; // basso-destra
  21. } Rectangle;
  22.  
  23. /*
  24. * Stampa a video un punto
  25. */
  26. void point_print(Point p) {
  27. printf("(%.3lf, %.3lf)\n", p.x, p.y);
  28. }
  29.  
  30. /*
  31. * Calcola la distanza euclidea tra due punti
  32. */
  33. double point_dist(Point p1, Point p2) {
  34. return sqrt(pow(p1.x-p2.x, 2) + pow(p1.y-p2.y, 2));
  35. }
  36.  
  37. /*
  38. * restituisce 1 se p e` interno (o sul bordo) a r
  39. * 0 altrimenti
  40. */
  41. int point_is_internal(Point p, Rectangle r) {
  42. if (p.x >= r.A.x && p.x <= r.B.x && p.y >= r.B.y && p.y <= r.A.y)
  43. return 1;
  44. else
  45. return 0;
  46. }
  47.  
  48. /*
  49. * Calcola l'area di un rettangolo
  50. */
  51. double rectangle_area(Rectangle r) {
  52. double b, h;
  53. b = r.B.x - r.A.x;
  54. h = r.A.y - r.B.y;
  55. return b*h;
  56. }
  57.  
  58. /*
  59. * Cerca quale punto di una lista e' piu' lontano da un punto dato
  60. */
  61. int check_couple(Point p, Point vect[], int len) {
  62. int i, maxInd;
  63. double max = -1;
  64. for (i = 0; i < len; i++) {
  65. double dist = point_dist(p, vect[i]);
  66. if (dist > max) {
  67. max = dist;
  68. maxInd = i;
  69. }
  70. }
  71. return maxInd;
  72. }
  73.  
  74. int main(int argc, const char *argv[]) {
  75. Point vect[MAXN];
  76. int i, maxIndI, maxIndJ;
  77. unsigned n;
  78. double max = -1;
  79. char linea[1024];
  80. /* input del numero di punti */
  81. printf("# Numero dei punti (max %d): ", MAXN);
  82. fgets(linea, sizeof(linea), stdin);
  83. sscanf(linea, "%u", &n);
  84. n = atoi(linea);
  85. /* se n e` maggiore di MAXN uso MAXN */
  86. if (n > MAXN)
  87. n = MAXN;
  88. for (i = 0; i < n; i++) {
  89. printf("# Inserire il %do punto: ", i + 1);
  90. fgets(linea, sizeof(linea), stdin);
  91. sscanf(linea, "%lf %lf", &vect[i].x, &vect[i].y);
  92. }
  93. /* stampo i punti */
  94. printf("\n[PUNTI]\n");
  95. for (i = 0; i < n; i++) {
  96. point_print(vect[i]);
  97. }
  98. /* stampa delle distanze dall'origine */
  99. Point origine = {0, 0};
  100. printf("\n[DISTANZE]\n");
  101. for (i = 0; i < n; i++) {
  102. printf("%.3lf\n", point_dist(vect[i], origine));
  103. }
  104. /* acquisizione del rettangolo */
  105. Rectangle rect;
  106. printf("# Inserire l'angolo in alto a destra del rettangolo: ");
  107. fgets(linea, sizeof(linea), stdin);
  108. sscanf(linea, "%lf %lf", &rect.A.x, &rect.A.y);
  109. printf("# Inserire l'angolo in basso a sinistra del rettangolo: ");
  110. fgets(linea, sizeof(linea), stdin);
  111. sscanf(linea, "%lf %lf", &rect.B.x, &rect.B.y);
  112. printf("\n[INTERNI]\n");
  113. for (i = 0; i < n; i++) {
  114. if (point_is_internal(vect[i], rect))
  115. point_print(vect[i]);
  116. }
  117. /* Area rettangolo */
  118. printf("\n[AREA]\n");
  119. printf("%.3lf\n", rectangle_area(rect));
  120.  
  121. /*
  122. * Coppia piu` distante
  123. * check_couple mi dice qual e` il punto piu` distante dal punto p dato.
  124. */
  125. for (i = 0; i < n; i++) {
  126. int ind = check_couple(vect[i], vect, n);
  127. /*
  128. * vect[ind] e` il punto piu` distante da vect[i]
  129. * dist e` la distanza tra loro
  130. */
  131. double dist = point_dist(vect[i], vect[ind]);
  132. /* devo trovare per quale punto vect[i], dist e` massimo */
  133. if (dist > max) {
  134. /*
  135. * in questa ricerca di max mi segno anche gli indici
  136. * dei 2 punti
  137. */
  138. max = dist;
  139. maxIndI = i;
  140. maxIndJ = ind;
  141. }
  142. }
  143. printf("\n[COPPIA]\n");
  144. point_print(vect[maxIndI]);
  145. point_print(vect[maxIndJ]);
  146. return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement