2 * Taller de Programación (75.42).
4 * Ejercicio Número 1 - Graficador de torta en modo texto.
6 * Copyleft (2003) Leandro Lucarella <llucare@fi.uba.ar>
7 * Puede copiar, modificar y distribuir este programa bajo los términos de
8 * la licencia GPL (http://www.gnu.org/).
10 * Creado: lun mar 24 02:21:42 ART 2003
15 /* bibliotecas usadas */
20 /* Constante con PI */
22 # define M_PI 3.14159265358979323846
25 /* Constantes que indican el ancho y alto de la pantalla */
28 /* Constante con la máxima cantidad de elementos aceptables */
31 #define SCANF_STRING "%i,%i,%i,%i,%i,%i,%i,%i,%i,%i\n"
33 #define max(x, y) ((x > y) ? x : y)
35 int esta_en(double, double, double, double, int);
38 /* Declaración de variables */
53 /* Inicializa variables */
54 i = total = radio = impreso = x = y = 0;
55 fi_cero = ratio_x = ratio_y = 0.0;
56 for (i = 0; i < CANT; i++) {
61 /* Obtiene entrada de usuario y sale si hay error al interpretarla.
62 * TODO - hacerlo independiente de la cantidad (usando CANT),
65 printf("Ingrese la lista de números (10 máximo) separados por comas (,): ");
77 &valores[9]) == EOF) {
78 fprintf(stderr, "Hubo un error al interpretar su entrada de datos.\n");
83 for (i = 0; i < CANT; i++) {
85 fprintf(stderr, "El valor de la posición %i es negativo.\n", i + 1);
92 /* Calculo valores de desplazamiento de fi y el ro máximo (radio) */
93 for (i = 0; i < CANT; i++) {
94 fi[i] = (double) valores[i] * 2.0 * M_PI / (double) total;
96 radio = max(ANCHO, ALTO) / 2;
98 /* Calculo correcciones en x e y para que "emule" un cuadrado */
99 ratio_x = (ALTO > ANCHO) ? ((double)ALTO / (double)ANCHO) : 1.0;
100 ratio_y = (ANCHO > ALTO) ? ((double)ANCHO / (double)ALTO) : 1.0;
102 /* Dibuja la torta */
103 for (y = -ALTO/2; y < (ALTO/2); y++) {
104 for (x = -ANCHO/2; x < ANCHO/2; x++) {
107 for (i = 0; i < CANT; i++) {
108 /* Se fija si cada x, y de la pantalla está en una porción de
109 * la torta, dibujando el número que corresponde si lo es así.
111 if (esta_en((double)x * ratio_x,
113 fi_cero, fi[i], radio)) {
117 /* Si no pertenece a esta parte de la torta, actualizo el
118 * fi_cero sumandole el delta fi de la parte actual.
124 /* Si no se pertenece a ninguna parte, se dibuja un espacio */
129 printf("\n"); /* Termino una línea */
137 int esta_en(double x, double y, double fi_cero, double fi_delta, int radio) {
138 double ro = sqrt(x*x + y*y);
139 double fi = atan2(y, x) + M_PI;
140 double fi_fin = fi_cero + fi_delta;
141 /* Se fija si el fi y ro actuales están en los rangos
142 * NOTA: la comparación se hace como float para evitar pequeños errores
143 * de redondeo (las operaciones se hacen en double para que sean más
144 * precisas y las comparaciones en float para que sean más "flexibles").
147 ((float)ro <= (float)radio)
148 && ((float)fi >= (float)fi_cero)
149 && ((float)fi <= (float)fi_fin);