///////////////////////////////////////////////////////
//                                                   //
//       Московский Государственный Технический      //
//           Университет Гражданской Авиации         //
//                                                   //
//      Курсовая работа студента группы: ЭВМ-2-2     //
//           Новичкова Виталия Дмитриевича           //
//                                                   //
// (с) 2005-2012 Система Компьютнрных Сетей  WohlNET //
//                                                   //
///////////////////////////////////////////////////////

//Рисование декартовых координат и вычисление графика функции

int graph(char *s,char *sid)
{
float a,b,i;
int xmax,ymax,px,py,x0,y0;
	a=sizea;
	b=sizeb;
	xmax=getmaxx()+1;
	ymax=getmaxy()+1;
        px=100;
        py=100;
        x0=xmax/2;
        y0=ymax/2;

	for(;;)
	{
		if(((xmax/2+b*px)>xmax)||((xmax/2+a*px)<0))
		{
			next(s,sid);
			putpixel(xmax/2+Oper.x*px,ymax/2-expr(s,sid)*py, color5);
			px=px-1;
			py=py-1;
			Oper.Op='╞';
			Oper.tokval=0;
			continue;
		}
		setfillstyle(SOLID_FILL, color1);
		bar(0,0,xmax,ymax);
		setfillstyle(SOLID_FILL, color1);

		setcolor(color2);
		setlinestyle(DASHED_LINE,0,2);
		for(i=x0;i<xmax;i+=px) line(i,0,i,ymax);
		for(i=x0;i>0;i-=px) line(i,0,i,ymax);
		for(i=y0;i>0;i-=py) line(0,i,xmax,i);
		for(i=y0;i<ymax;i+=py) line(0,i,xmax,i);
		setlinestyle(DOTTED_LINE,0,2);
		for(i=x0;i<xmax;i+=(px/10)) line(i,0,i,ymax);
		for(i=x0;i>0;i-=(px/10)) line(i,0,i,ymax);
		for(i=y0;i>0;i-=(py/10)) line(0,i,xmax,i);
		for(i=y0;i<ymax;i+=(py/10)) line(0,i,xmax,i);

		setcolor(color3);
		setlinestyle(SOLID_LINE,0,3);
		line(0,y0, xmax,y0);
		line(x0,0,x0,ymax);

		line(xmax, y0, xmax-10,y0+5);
		line(xmax, y0, xmax-10,y0-5);
		line(xmax, y0, xmax-10,y0+3);
		line(xmax, y0, xmax-10,y0-3);
		line(xmax-10, y0+5, xmax-10, y0-5);

		line(x0, 0, x0-5, 0+10);
		line(x0, 0, x0+5, 0+10);
		line(x0, 0, x0-3, 0+10);
		line(x0, 0, x0+3, 0+10);
		line(x0-5, 0+10, x0+5,0+10);

		setcolor(color5);
		setlinestyle(SOLID_LINE,0,3);
		settextstyle(0,0,1);

		outtextxy(x0-18,y0+7,"0");
		for(i=x0;i<xmax;i+=px)
		circle(i,y0,2);
		for(i=x0;i>0;i-=px)
		circle(i,y0,2);

		for(i=y0;i>0;i-=py)
		circle(x0,i,2);
		for(i=y0;i<ymax;i+=py)
		circle(x0,i,2);

		for(i=x0, jjj=0;i<xmax; i+=px,jjj++)
		if((jjj!=0)&&i<xmax-40){sprintf(jjk, "%i",jjj); outtextxy(i,y0+14, jjk);}
		for(i=x0, jjj=0;i>0; i-=px,jjj--)
		if((jjj!=0)&&i>20){sprintf(jjk, "%i",jjj); outtextxy(i,y0+14, jjk);}

		for(i=y0, jjj=0;i>0; i-=py,jjj++)
		if((jjj!=0)&&i>40){sprintf(jjk, "%i",jjj); outtextxy(x0-20,i, jjk);}
		for(i=y0, jjj=0;i<ymax-40; i+=py,jjj--)
		if((jjj!=0)&&i<ymax-40){sprintf(jjk, "%i",jjj); outtextxy(x0-20,i, jjk);}



		outtextxy(xmax-25,y0+14,"X");
		outtextxy(x0-18,0+25,"Y");
		settextstyle(4,0,3);
		outtextxy(12,12,s);

		setcolor(color4);
		setlinestyle(SOLID_LINE,0,3);
		for(Oper.x=a; Oper.x<b; Oper.x+=(b-a)/xmax)
		   {
			next(s,sid);
			y_dot = expr(s,sid);
			x_dot = Oper.x;
			xcheck = ((xmax/2+x_dot*px>20)&&(xmax/2+x_dot*px<xmax-20));
			ycheck = (ymax/2-y_dot*py>20)&&(ymax/2-y_dot*py<ymax-20)&&xcheck;
			if(x_dot == a)
			{
			  if(ycheck)
			putpixel(xmax/2+x_dot*px, ymax/2-y_dot*py,color4);
			}
			else
			  if(ycheck)
			     {
				if(ycheck2)
				line(xmax/2+x_dot*px, ymax/2-y_dot*py, xpr, ypr);
				//else
				//putpixel(xmax/2+x_dot*px, ymax/2-y_dot*py,color4);
			     }
			xpr=xmax/2+x_dot*px;
			ypr=ymax/2-y_dot*py;
			ycheck2=ycheck;
			delay(5);
			Oper.Op='╞';
			Oper.tokval=0;
		   }
		break;
	}
	return 0;
}