/* gcc -DTEST -I/opt/X11/include -L/opt/X11/lib -lX11 oscillator-g.c */
#include <stdio.h>
#include <math.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

main() {
  Display *Glib_d;
  int Glib_s;
  Window Glib_w;
  GC Glib_gc;
  XSetWindowAttributes att;
  int x,y;

  double X1, X2, X3, A, T, Dt;

  Glib_d = XOpenDisplay(NULL);
  Glib_s = DefaultScreen(Glib_d);
  Glib_gc = DefaultGC(Glib_d,Glib_s);
  Glib_w = XCreateSimpleWindow(Glib_d,RootWindow(Glib_d,Glib_s),0,0,
                               500,400,2,BlackPixel(Glib_d,Glib_s),WhitePixel(Glib_d,Glib_s));

  att.override_redirect = 1;
  XChangeWindowAttributes(Glib_d,Glib_w,CWOverrideRedirect, &att);
  XMapWindow(Glib_d,Glib_w);


  /* {{d^2} \over {dt^2}} y + y = \sin(at) */

  X1 = 0.5; X2 = 0.501; A=0.5;

  Dt = 0.07; T = 0;
  while (T<50) {
    X3 = 2*X2-X1+Dt*Dt*(sin(A*T)-X2);
    printf("T=%lf, X1=%lf\n",T,X1);
    x = T*10;
    y = X1*50+200;
    XDrawPoint(Glib_d,Glib_w,Glib_gc,x,y);
    T=T+Dt;
    X1=X2; X2=X3;
  }

  XFlush(Glib_d);
  sleep(100);
  XCloseDisplay(Glib_d);
}








