/* Program: pumpkin5.c
   Draw a pumpkin.  Function version.
*/
#include <stdio.h>
#include "genlib.h"
#include "simpio.h"
#include "graphics.h"
/* Use math library */
#include <math.h>
#define PI 3.14159
/* Function Prototypes */
double deg2rad (double angle) ;
void DrawEye(double eye_size) ;

/* Convert degree to radians */
double deg2rad ( double angle ) {
  return (PI * angle / 180.0 ) ;
}
/* Draw an eye */
void DrawEye(double eye_size) {
  DrawLine(-eye_size/2, 0.0) ;
  DrawLine(eye_size/2, eye_size) ;
  DrawLine(eye_size/2, -eye_size) ;
  DrawLine(-eye_size/2, 0.0) ;
}

main() {
 double max_x, max_y ;
 double x, y, mid_x, mid_y ;
 double angle, fatness ;
 int i ;

  InitGraphics() ;
  max_x = GetWindowWidth() ;
  max_y = GetWindowHeight() ;
  mid_x = max_x / 2.0 ;
  mid_y = max_y / 2.0 ;

  /* Draw Pumpkin in the middle */
  draw_pumpkin(mid_x, mid_y, 0.5, 60.0) ;
  for ( i = 0 ; i < 12 ; i++ ) {
      angle = i * 30.0 ;
      x = mid_x + 1.5 * cos(deg2rad(angle)) ;
      y = mid_y + 1.5 * sin(deg2rad(angle)) ;
      fatness = 47.5 + i*2.5 ;
      draw_pumpkin(x, y,  0.25, fatness) ;
  }
}

void draw_pumpkin(double x_loc, double y_loc,
        double pumpkin_size, double pump_ang) {

  double x, y, top, eye_offset ;
  double radius, start, sweep ;

  top = y_loc + pumpkin_size * sin(deg2rad(pump_ang)) ;
  eye_offset = pumpkin_size * cos(deg2rad(pump_ang)) ;

  /*** Draw stem */
  MovePen(x_loc, top ) ;
  DrawLine(-pumpkin_size/8.0, 3*pumpkin_size/8.0);
  DrawLine(pumpkin_size/4.0, 0.0 ) ;
  DrawLine(-pumpkin_size/8.0, -3*pumpkin_size/8.0);

  /*** Draw right side of pumpkin */
  MovePen(x_loc, top) ;
  start = 180.0 - pump_ang ;
  sweep = 360.0 - 2 * pump_ang ;
  DrawArc(pumpkin_size, start, -sweep ) ; 

  /*** Draw left side of pumpkin */
  start = -pump_ang ;
  DrawArc(pumpkin_size, start, -sweep ) ; 

  /*** Draw Eyes */
  MovePen(x_loc + eye_offset, y_loc) ;
  DrawEye(pumpkin_size/4.0) ;
  MovePen(x_loc - eye_offset, y_loc) ;
  DrawEye(pumpkin_size/4.0) ;

  /* Draw Mouth */
  radius = pumpkin_size / 2.0 ;
  start = 270.0 - pump_ang ;
  sweep = 2 * pump_ang ;
  x = x_loc + radius * cos(deg2rad(start)) ;
  y = y_loc + radius * sin(deg2rad(start)) ;
  MovePen(x,y) ;
  DrawArc(radius, start, sweep);
  radius = radius * sin(deg2rad(pump_ang)) ;
  DrawArc(radius, 0.0, -180.0 ) ;
}
