Ver Mensaje Individual
  #126 (permalink)  
Antiguo 22/12/2014, 10:03
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Petando la pila. Problemas y retos usando recursividad.

Bueno, aún me quedan por hacer algunas pruebas para certificar su funcionamiento. Lo pongo aquí porque, con las fiestas, lo mismo me quedo sin el código fuente.

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. struct Punto
  4. {
  5.     double x;
  6.     double y;
  7. };
  8.  
  9. double areaPoligono(struct Punto puntos[], int max, int i )
  10. {
  11.   struct Punto* p0 = &puntos[ i ];
  12.   struct Punto* p1;
  13.  
  14.   ++i;
  15.   if ( i < max )
  16.     p1 = &puntos[ i ];
  17.   else
  18.     p1 = &puntos[ 0 ];
  19.  
  20.   double factor1 = ( p1->y - p0->y ) / ( p1->x - p0->x );
  21.   double factor2 = p0->y - factor1 * p0->x;
  22.   factor1 *= 0.5;
  23.  
  24.   double v0 = ( factor1 * p0->x + factor2 ) * p0->x;
  25.   double v1 = ( factor1 * p1->x + factor2 ) * p1->x;
  26.  
  27.   double area = v1 - v0;
  28.  
  29.   if ( i < max )
  30.     return area + areaPoligono( puntos, max, i );
  31.   else
  32.     return area;
  33. }
  34.  
  35. double areaPoligono(struct Punto puntos[], int n)
  36. {
  37.   return fabs( areaPoligono( puntos, n, 0 ) );
  38. }
  39.  
  40. int main(int , char **)
  41. {
  42.   struct Punto puntos[] = { {3,20}, {15,20}, {6,10}, {9,30}, {12,10} };  // Estrella de 5 puntas
  43.   int n = sizeof( puntos ) / sizeof( struct Punto );
  44.   std::cout << "Area del polígono: " << areaPoligono( puntos, n ) << std::endl;
  45.   return 0;
  46. }

Un saludo

Última edición por eferion; 23/12/2014 a las 00:55