#include <intuition/intuition.h>
#define PI 3.1416

struct NewWindow nw =
{ 0,0,640,256,0,1,
   CLOSEWINDOW            /*  IDCMP flags            */
 | ACTIVATE,
                          /*  Regular flags for gadgets and such */
   WINDOWDEPTH
 | WINDOWSIZING
 | WINDOWDRAG
 | WINDOWCLOSE
 | SMART_REFRESH
 | ACTIVATE,

  NULL,NULL,
  (UBYTE *) "Sine",
  NULL,NULL,100,40,-1,-1,WBENCHSCREEN
};

extern void *OpenLibrary();
extern void *OpenWindow();
extern void *GetMsg();
extern double sin();

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct IntuiMessage *message;
struct RastPort *rp;
struct Window *w;

quit()
{ if (w) CloseWindow(w);
  if (GfxBase) CloseLibrary(GfxBase);
  if (IntuitionBase) CloseLibrary(IntuitionBase);
  exit(0);
}

float xl,xu,yl,yu;

void cls()
{ SetDrMd(rp,JAM1);
  SetAPen(rp,0L);
  RectFill(rp,0L,10L,640L,256L);
  SetAPen(rp,1L);
}

float u,x;
int k,h;
long ix,iy;

axis()
{ char Buf[10];

  u=xl;
  k=0;
  h=nw.Height-10;
  x=1;
  SetAPen(rp,3L);
  iy=nw.Height/2;
  Move(rp,NULL,iy);
  Draw(rp,640L,iy);
  Move(rp,50L,20L);
  Text(rp,"x(n+1) = u*sin(PI*x(n))",23L);
  Move(rp,5L,iy-10);
  sprintf(Buf,"%.3f",xl);
  Text(rp,Buf,(long)strlen(Buf));
  Move(rp,5L,20L);
  sprintf(Buf,"%.3f",yu);
  Text(rp,Buf,(long)strlen(Buf));
  Move(rp,5L,30L);
  Text(rp,"x",1L);
  Move(rp,320L,iy-10);
  sprintf(Buf,"%.3f",(xu+xl)/2);
  Text(rp,Buf,(long)strlen(Buf));
  Move(rp,600L,iy-10);
  Text(rp,"u",1L);
  Move(rp,5L,2*iy-10);
  sprintf(Buf,"%.3f",yl);
  Text(rp,Buf,(long)strlen(Buf));
  SetAPen(rp,1L);
}

main()
{ float x1;
  int i,j;
  ULONG Class;
  USHORT code;

  if (!(GfxBase = OpenLibrary("graphics.library",NULL))) quit();
  if (!(IntuitionBase = OpenLibrary("intuition.library",NULL))) quit();
  if (!(w = OpenWindow(&nw)))
    {  nw.Height=200;
       if (!(w = OpenWindow(&nw))) quit();
    }
  rp = w->RPort;

  xl=0.6;
  xu=2;
  yl=-2;
  yu=0;
  u=xl;
  x=0.5;
  cls();
  axis();

  FOREVER
    {  if (message = GetMsg(w->UserPort))
        { Class = message->Class;
          ReplyMsg(message);
          switch (Class)
            { case CLOSEWINDOW : quit();
            }
        }
       if (k<640)
          { k++;
            ix=k;
            for (j=0;j<k/3;j++)
                { for (i=0;i<21;i++) x=u*sin(PI*x);
                  if (x<0)
                    { iy=(yu-x)/(yu-yl)*h+10;
                      Move(rp,ix,iy);
                      Draw(rp,ix,iy);
                    }
                }
            u+=(xu-xl)/640.0;
          }
    }
}

