#include <stdio.h>
#include <math.h>
#include "genlib.h"
#include "simpio.h"
#include "graphics.h"


#define NMAX 1000

void empurre(int a[], int i, int n);
int farey(int n, int a[], int b[], double bends[]);
void gere_graphics(int n, int a[], int b[], double bends[]);

int main()
{
  int n;
  int n_termos;
  int i;
  int num[NMAX]={0, 1}, denom[NMAX]={1, 1};
  double bends[NMAX]={2.0, 2.0};

  printf("n = ");
  n=GetInteger();
  
  n_termos=farey(n, num, denom, bends);

  for (i=0; i<n_termos; i++)
    printf("%3d: %d/%d\n", i, num[i], denom[i]);

  gere_graphics(n_termos, num, denom, bends);
    
  return 0;
}

void empurre(int a[], int i, int n)
{
  int k;
  
  for (k=n-1; k>=i; k--) 
    a[k+1]=a[k];
}

void empurre_d(double a[], int i, int n)
{
  int k;
  
  for (k=n-1; k>=i; k--) 
    a[k+1]=a[k];
}

int farey(int n, int a[], int b[], double bends[])
{
  int i;
  int nn=2;
  
  for (i=0; i<nn-1; i++) 
    while (b[i]+b[i+1]<=n) {
      empurre(a, i+1, nn);
      empurre(b, i+1, nn);
      empurre_d(bends, i+1, nn);
      nn++;
      a[i+1]=a[i]+a[i+2];
      b[i+1]=b[i]+b[i+2];
      bends[i+1]=bends[i]+bends[i+2]+2*sqrt(bends[i]*bends[i+2]);
    }

  return nn;
}

void gere_graphics(int n, int a[], int b[], double bends[])
{
  double h=.5;
  double f;

  int i;

  InitGraphics();
  
  f=4*GetWindowWidth()/5;
  MovePen(GetWindowWidth()/10, h);

  DrawLine(f, 0.0);

  for (i=0; i<n; i++) {
    MovePen(GetWindowWidth()/10+f*(double)a[i]/b[i], h);
    /* DrawLine(0.0, 0.05); */
    DrawArc(f/bends[i], -90, 360);
  }
}
  
  
  
