#include <owl\framewin.h>
#include <owl\dialog.h>
#include "spo.h"
#include <math.h>
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include <owl\dc.h>
class MyWindow;
MyWindow* myWin;

class MyApp:public TApplication
 {
  public:
   void InitMainWindow();

 };

class MyWindow:public TFrameWindow
 {
  double sine[800], cosine[800], sinx[800], cosx[800];
  bool sinIs, cosIs, sinxIs, cosxIs;
  int k,q,p,s,x0,y0;
 // int view;
  TMenu* menu;
  TPopupMenu popupMenu;
  virtual void SetupWindow();
  virtual void CleanupWindow();
  void Paint(&TDC, bool, TRect&);
  void CmAbout();
  void CmSin();
  void CmCos();
  void CmSinx();
  void CmCosx();
  
  public:
   int view;
   MyWindow(TWindow* parent, const char far* title);
   DECLARE_RESPONSE_TABLE(MyWindow);
  protected:
  void Paint(TDC&dc,bool erase,TRect& r);
 };

  DEFINE_RESPONSE_TABLE1(MyWindow, TFrameWindow)
   EV_COMMAND(CM_ABOUT,CmAbout),
   EV_COMMAND(CM_SIN,CmSin),
   EV_COMMAND(CM_COS,CmCos),
   EV_COMMAND(CM_SINX,CmSinx),
   EV_COMMAND(CM_COSX,CmCosx),


  END_RESPONSE_TABLE;

MyWindow::MyWindow(TWindow* parent, const char far* title):TFrameWindow(parent,title)
 {
  Attr.X=0; Attr.Y=0; Attr.W=800; Attr.H=600;
  AssignMenu("MainMenu");

  sinIs=false; cosIs=false; cosxIs=false; sinxIs=false;

 }


void MyWindow::SetupWindow()
 {
  TWindow::SetupWindow();
  menu=new TMenu(HWindow);
 }

void MyWindow::CleanupWindow()
 {
  delete menu;
  TWindow::CleanupWindow();
 }


void MyWindow::CmAbout()
 {
  MessageBox("Курсовая работа по дисциплине опреционные системы \nВыполнил студент группы ЭВМ2-1 Осипов А.В. .","About",MB_ICONINFORMATION);
 }

void MyWindow::CmSin()
 {
  int state=menu->GetMenuState(CM_SIN,MF_BYCOMMAND);
  if (state==MF_UNCHECKED)
    {
     for (int i=-400; i<400; i++)
     sine[i+400]=sin((double)i/20);
     sinIs=true;
     menu->CheckMenuItem(CM_SIN,MF_CHECKED);
    Invalidate();
    }
  else
    {
    for (int i=0; i<800; i++)
     sine[i]=0;
    sinIs=false;
    menu->CheckMenuItem(CM_SIN,MF_UNCHECKED);
    Invalidate();
    }
 }

void MyWindow::CmCos()
 {
  int state=menu->GetMenuState(CM_COS,MF_BYCOMMAND);
  if (state==MF_UNCHECKED)
    {
     for (int i=-400; i<400; i++)
     cosine[i+400]=cos((double)i/20);
     cosIs=true;
     menu->CheckMenuItem(CM_COS,MF_CHECKED);
    Invalidate();
    }
  else
    {
    for (int i=0; i<800; i++)
     cosine[i]=0;
    cosIs=false;
    menu->CheckMenuItem(CM_COS,MF_UNCHECKED);
    Invalidate();
    }
 }

void MyWindow::CmSinx()
 {
  int state=menu->GetMenuState(CM_SINX,MF_BYCOMMAND);
  if (state==MF_UNCHECKED)
    {
     for (int i=-400; i<400; i++)
     if (i!=0)
     //if ((i<=-30)&&(i>=30))
     sinx[i+400]=10*((50*sin((double)(0.1*i))/20))/i;
     sinxIs=true;
     menu->CheckMenuItem(CM_SINX,MF_CHECKED);
    Invalidate();
    }
  else
    {
    for (int i=0; i<800; i++)
     sinx[i]=0;
    sinxIs=false;
    menu->CheckMenuItem(CM_SINX,MF_UNCHECKED);
    Invalidate();
    }
 }

void MyWindow::CmCosx()
 {
  int state=menu->GetMenuState(CM_COSX,MF_BYCOMMAND);
  if (state==MF_UNCHECKED)
    {
     for (int i=-400; i<400; i++)
      if (i!=0)
      cosx[i+400]=10*((50*cos((double)(0.1*i))/20))/i;
     cosxIs=true;
     menu->CheckMenuItem(CM_COSX,MF_CHECKED);
    Invalidate();
    }
  else
    {
    for (int i=0; i<800; i++)
     cosx[i]=0;
    cosxIs=false;
    menu->CheckMenuItem(CM_COSX,MF_UNCHECKED);
    Invalidate();
    }
 }

void MyWindow::Paint(TDC& dc, bool, TRect&)
 {

  y0=Attr.H/2;
  x0=Attr.W/2;
  dc.MoveTo(0,y0);
  dc.LineTo(Attr.W,y0);
  dc.MoveTo(x0,0);
  dc.LineTo(x0,Attr.H);
  dc.MoveTo(x0,y0);
  for (int i=0; i<12; i++)
   {
    x0=24+(int)(i*3.141598*20);
    dc.MoveTo(x0,y0-3);
    dc.LineTo(x0,y0+3);
   }
 x0=Attr.W/2;
  for (int i=0; i<10; i++)
   {
    y0=50+50*(int)(i);
    dc.MoveTo(x0-3,y0);
    dc.LineTo(x0+3,y0);
   }
 y0=Attr.H/2;
 dc.TextOut(20,Attr.H/2+10,"-6п          -5п           -4п          -3п            -2п           -п");
 dc.TextOut(405,Attr.H/2+10,"0            п             2п           3п             4п            5п             x");
 dc.MoveTo(Attr.W,Attr.H/2);
 dc.LineTo(Attr.W-15,Attr.H/2-3);
 dc.MoveTo(Attr.W,Attr.H/2);
 dc.LineTo(Attr.W-15,Attr.H/2+3);
 dc.TextOut(405,240,"1");
 dc.MoveTo(Attr.W/2,0);
 dc.LineTo(Attr.W/2+3,15);
 dc.MoveTo(Attr.W/2,0);
 dc.LineTo(Attr.W/2-3,15);
 dc.TextOut(405,190,"2");
 dc.TextOut(405,140,"3");
 dc.TextOut(405,90,"4");
 dc.TextOut(405,40,"5");
 dc.TextOut(405,5,"y");
 dc.TextOut(405,350,"-1");
 dc.TextOut(405,400,"-2");
 dc.TextOut(405,450,"-3");
 dc.TextOut(405,500,"-4");
 dc.MoveTo(0,y0);
 TPen p1(TColor(250,0,0));
 dc.SelectObject(p1);
  if (sinIs==true)
   {for (int i=0; i<800; i++)
    { TPen p1(TColor(200,50,150),2,PS_SOLID); dc.SelectObject(p1);   //цвет 1
     dc.SetPixel(i,y0-(int)(sine[i]*50),TColor(150,50,50));
     dc.LineTo(i,y0-(int)(sine[i]*50));
    }
    TBrush b1(TColor(200,50,100));
    dc.FillRect(600,500,615,515,b1);
    dc.TextOut(617,500,"Sin(x)");
    dc.MoveTo(0,y0);
   }
  if (cosIs==true)
   {for (int i=0; i<800; i++)
    {  TPen p1(TColor(0,250,0),2,PS_SOLID); dc.SelectObject(p1);   //цвет2
     dc.SetPixel(i,y0-(int)(cosine[i]*50),TColor(50,250,50));
     dc.LineTo(i,y0-(int)(cosine[i]*50));
    }
    TBrush b2(TColor(0,250,0));
    dc.FillRect(600,520,615,535,b2);
    dc.TextOut(617,520,"Cos(x)");
    dc.MoveTo(0,y0);
  }
  if (sinxIs==true)
   {

   for (int i=0; i<800; i++)
    if(i!=400)
    {{ TPen p1(TColor(0,0,250),2,PS_SOLID); dc.SelectObject(p1);        //цвет3
     dc.SetPixel(i,y0-(int)(sinx[i]*50),TColor(50,50,250));
     dc.LineTo(i,y0-(int)(sinx[i]*50));
    }
    TBrush b3(TColor(0,0,250));
    dc.FillRect(670,520,685,535,b3);
    dc.TextOut(687,520,"Cos(1/x)");
    //dc.MoveTo(0,y0);
    }
    }

  if (cosxIs==true)
  { int i;    TPen p1(TColor(150,150,10),2,PS_SOLID); dc.SelectObject(p1);   //цвет4
   for (i=0; i<396; i++)
    {
     dc.SetPixel(i,y0-(int)(cosx[i]*50),TColor(50,50,50));
     dc.LineTo(i,y0-(int)(cosx[i]*50));
    }
    i=404;
    TBrush b4(TColor(150,150,10));
    dc.FillRect(670,500,685,515,b4);
    dc.TextOut(687,500,"Sin(1/x)");
   dc.MoveTo(404,y0-(int)(cosx[i]*50));
   for (i=404; i<800; i++)
    {
     dc.SetPixel(i,y0-(int)(cosx[i]*50),TColor(50,50,50));
     dc.LineTo(i,y0-(int)(cosx[i]*50));
    }

   }
  }

void MyApp::InitMainWindow()
 {
  EnableBWCC();
  MyWindow* myWin=new MyWindow(0, "Графики функций");
  myWin->SetIconSm(this,1);
  SetMainWindow(myWin);

 }

int OwlMain(int, char*[])
 {
   return MyApp().Run();
 }
