/*				 09.MAY.2005			    profilo.cc
							   by Giovanni Moruzzi


*/
#include <X11/Xlib.h>
#include <X11/Xutil.h>

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#include "corso.h"

extern XVideoData xvd;

main()
{
    int i,iComm,ii,key,l,nComm,nPar,nn,y0,y1;
    double hwhm,path,wG,wL,yMax,yMin,yScale;
    double *y;
    char **comandi,**ParName,**ParVal;
    char answ[16][25];
    
    // .................................................. apri la finestra X
    StartXWindow(800,600,0,0,"Trasformata");
    // .....................................................................
    nn=1024;
    // ......................................................................
    y=new double [nn];
    // ........................................................... parametri
    nPar=3;
    ParName=new (char *) [nPar];
    ParVal=new (char *) [nPar];
    for (i=0;i<nPar;i++) ParVal[i]=new char [24];
    ParName[0]="Gauss width";
    ParName[1]="Lorentz width";
    ParName[2]="Path length";
    wG=32.0;
    wL=30.0;
    path=30.0;
    sprintf(ParVal[0],"%.5lf",wG);
    sprintf(ParVal[1],"%.5lf",wL);
    sprintf(ParVal[2],"%.5lf",path);
    // ............................................................. comandi
    nComm=2;
    comandi=new (char *) [nComm];
    comandi[0]="Disegna";
    comandi[1]="Fine";
    // ............................................................... loop
    for (;;)
    { 
	XSetForeground(xvd.display,xvd.gc,xvd.white.pixel);
	XFillRectangle(xvd.display,xvd.backpix,xvd.gc,0,0,800,400);
	// .......................................... calcola la convoluzione
	SincVoigt(y,nn,&hwhm,wG,wL,path);
	// ................................................. massimo e minimo
	yMax=-1.0e100;
	yMin=1.0e100;
	for (i=0;i<400;i++)
	{
	    if (y[i]>yMax) yMax=y[i];
	    else if (y[i]<yMin) yMin=y[i];
	}
	if (0.0<yMax && 0.0>yMin)
	{
	    XSetForeground(xvd.display,xvd.gc,xvd.red[0].pixel);
	    y0=399+int(yMin*yScale);
	    XDrawLine(xvd.display,xvd.backpix,xvd.gc,0,y0,799,y0);
	}
	// .......................................... disegna la convoluzione
	yScale=400.0/(yMax-yMin);
	y0=399-int((y[0]-yMin)*yScale);
	XSetForeground(xvd.display,xvd.gc,xvd.black.pixel);
	for (i=1;i<400;i++)
	{ 
	    y1=399-int((y[i]-yMin)*yScale);
	    XDrawLine(xvd.display,xvd.backpix,xvd.gc,399+i,y0,400+i,y1);
	    XDrawLine(xvd.display,xvd.backpix,xvd.gc,401-i,y0,400-i,y1);
	    y0=y1;
	}
	XPrintf(0,0,1,"HWHM = %.5lf",hwhm);
	XRedraw();
	// ............................................................ menu
	iComm=XMenu(1,"Convoluzione",ParName,ParVal,nPar,20,comandi,
			nComm,10,420);
	if (iComm==0)
	{
	    wG=atof(ParVal[0]);
	    wL=atof(ParVal[1]);
	    path=atof(ParVal[2]);
	}
	else if (iComm==1) break;
    }
    // .......................................................................
    delete [] y;
    CloseXWindow();
}





