// ................................................................... #include
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <corso.h>

extern XVideoData xvd;

double funz(double x);

main()
{
	int i,ix,ix0,iy,iy0,nPoints,oldx,oldy;
	double delta,x,xMax,xMin,y,yMax,yMin,yScale;
	double (*ptfunz)(double x);
	
	// ......................................................... apri la finestra
	StartXWindow(800,600,0,0,"Grafico",1);
	// ................................................................. funzione
	//ptfunz=sin;
	ptfunz=funz;
	// ..................................................... fissa l'intervallo x
	xMin=-M_PI;
	xMax=2.5*M_PI;
	nPoints=720;
	delta=(xMax-xMin)/double(nPoints);
	ix0=40;
	if (xMin*xMax<0.0) ix0=40-int(xMin/delta+0.5);
	// ............................................................. intervallo y
	yMin=yMax=(*ptfunz)(xMin);
	for (i=0;i<nPoints;i++)
	{
		x=xMin+double(i)*delta;
		y=(*ptfunz)(x);
		if (y<yMin) yMin=y;
		else if (y>yMax) yMax=y;
	}
	yScale=520.0/(yMax-yMin);
	iy0=560;
	if (yMin*yMax<0.0) iy0=560+int(yMin*yScale+0.5);
	// .............................................................. colore nero
	XSetForeground(xvd.display,xvd.gc,xvd.black);
	// ......................................................... disegna l'asse x
	XDrawLine(xvd.display,xvd.backpix[0],xvd.gc,40,iy0,760,iy0);
	XhScale(0,0,TRUE,720,40,iy0,xMin,xMax,2);
	// ......................................................... disegna l'asse y
	XDrawLine(xvd.display,xvd.backpix[0],xvd.gc,ix0,560,ix0,40);
	XvScale(0,0,TRUE,520,ix0,560,yMin,yMax,2);
	// ............................................................. colore rosso
	XSetForeground(xvd.display,xvd.gc,xvd.red[2]);
	// ....................................................... disegna il grafico
	XSetForeground(xvd.display,xvd.gc,xvd.red[2]);
	for (i=0;i<720;i++)
	{
		ix=i+40;
		x=xMin+i*delta;
		y=(*ptfunz)(x);
		iy=560-int((y-yMin)*yScale+0.5);
		if (i>0) XDrawLine(xvd.display,xvd.backpix[0],xvd.gc,oldx,oldy,ix,iy);
		oldx=ix;
		oldy=iy;
	}
	XSetForeground(xvd.display,xvd.gc,xvd.black);
	XRedraw();
	// .................................................................. aspetta
	XWait(0);
	// ....................................................... chiudi la finestra
	CloseXWindow();
}

double funz(double x)
{
	double y;
	y=2*x*x-10.0*x+3.0;
	return y;
}

