/* Program: pumpkin3.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 mid_x, mid_y ;
 double i, j ;

  /* Initialize graphics routines */
  InitGraphics() ;
  max_x = GetWindowWidth() ;
  max_y = GetWindowHeight() ;
  mid_x = max_x / 2.0 ;
  mid_y = max_y / 2.0 ;

  for (i = -1 ; i <= 1 ; i++) 
    for (j=-1 ; j <= 1 ; j++) 
      draw_pumpkin(mid_x + 1.5 * i, mid_y + 1.5 * j,
	 0.5, 60.0) ;
}


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 ) ;
}
