临时

来源:互联网 发布:ubuntu16 cuda8 caffe 编辑:程序博客网 时间:2024/06/02 10:03

 // DlgChart.cpp : implementation file
//

#include "stdafx.h"
#include "page.h"
#include "DlgChart.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgChart dialog


CDlgChart::CDlgChart(CWnd* pParent /*=NULL*/)
 : CDialog(CDlgChart::IDD, pParent)
{
 //{{AFX_DATA_INIT(CDlgChart)
  // NOTE: the ClassWizard will add member initialization here
 //}}AFX_DATA_INIT
}


void CDlgChart::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CDlgChart)
  // NOTE: the ClassWizard will add DDX and DDV calls here
 //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgChart, CDialog)
 //{{AFX_MSG_MAP(CDlgChart)
 ON_WM_PAINT()
 ON_WM_SHOWWINDOW()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgChart message handlers

BOOL CDlgChart::OnInitDialog()
{
 CDialog::OnInitDialog();
 
 // TODO: Add extra initialization here
 
 m_pstatic = (CStatic*)GetDlgItem(IDC_PICCHAT);
 CRect rect; //矩形区域对象  
 CWnd *pWnd; //得到图片框的窗口指针  
 pWnd=GetDlgItem(IDC_PICCHAT);  
 m_dc = pWnd->GetDC();

 m_chart = new CLinepic(m_dc);
 m_pstatic->GetClientRect( &rectStaticClient );
 
 rectStaticClient.NormalizeRect();
    m_size.cx=rectStaticClient.Size().cx;
    m_size.cy=rectStaticClient.Size().cy;
    m_size.cx = rectStaticClient.Width();    // zero based
    m_size.cy = rectStaticClient.Height();    // zero based

    m_pstatic->ClientToScreen( &rectStaticClient );
    ScreenToClient( &rectStaticClient);
       
    m_pt.x = rectStaticClient.left;
    m_pt.y = rectStaticClient.top;
 offsetx= m_pt.x;
    offsety= m_pt.y;
 m_chart->SetScale(1000,1000);
// m_chart->DoGradientFill(m_dc,&rectStaticClient);
 m_chart->ReSetRange(rectStaticClient.Width(),rectStaticClient.Height());
 m_iXxishu=1;m_iYxishu=4;

/* m_chart->DrawMarker(2,0,0,true);
 m_chart->DrawMarker(4,4,0,true);
 m_chart->DrawMarker(8,8,0,true);
 m_chart->DrawMarker(16,8,0,true);
 m_chart->DrawMarker(32,12,0,true);
 m_chart->DrawMarker(48,8,0,true);
 InvalidateRect(&rectStaticClient);*/
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

void CDlgChart::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 dc.BitBlt(offsetx,offsety,m_size.cx,m_size.cy,
    m_chart->GetMemDC(),0,0,SRCCOPY);
 // TODO: Add your message handler code here
 
 // Do not call CDialog::OnPaint() for painting messages
}


/***********************************************************
在窗口显示时计算并绘制概率密度函数,由于绘图模块本身只支持整数
坐标而本功能需要实现支持至少3位小数的坐标绘制,因此只能再绘制
前将绘制比例缩小,再将坐标变大(*10000取整)。
同时由于需要将所有点都绘制在绘图区域内,所以需要将最终绘图的x
和y值按比例放大或缩小。
绘图模块将按照等间距绘制m_icount个点。因此数据越多,绘制的点越

************************************************************/
void CDlgChart::OnShowWindow(BOOL bShow, UINT nStatus)
{
 CDialog::OnShowWindow(bShow, nStatus);
 int iXValue,iYValue;
 double dNormal,dFangcha,dAverage,dXValue,dOffset;
 dNormal=dFangcha=dAverage=dXValue=dOffset=0;
 CRect tCrect;CRect* ptCrect=&tCrect;
 double dMinus = (m_aiTestValue[m_icount-1]-m_aiTestValue[0]) / m_icount;
 // TODO: Add your message handler code here
 ptCrect = m_chart->GetRect();

 switch(m_bTestType)
 {
 case TEST_TYPE_DZPD:
  m_iXxishu=1;m_iYxishu=8;
  break;
 case TEST_TYPE_JYGD:
  m_iXxishu=1;m_iYxishu=4;
  break;
 case TEST_TYPE_JH:
  m_iXxishu=1;m_iYxishu=4;
     break;
 case TEST_TYPE_KJWZJY:
  m_iXxishu=1;m_iYxishu=4;
     break;
 case TEST_TYPE_SSTJQ:
  m_iXxishu=1;m_iYxishu=4;
  break;
 case TEST_TYPE_ZYFP:
  m_iXxishu=1;m_iYxishu=4;
     break;
 case TEST_TYPE_ZYLJZL:
  m_iXxishu=1;m_iYxishu=4;
     break;
 default:
     break;
 }
 dMinus = dMinus*(ptCrect->right-30)/(m_aiTestValue[m_icount-1]*100-30);//按比例修改
 dAverage = Anverage(m_aiTestValue,m_icount);
 dFangcha = Fangcha(m_aiTestValue,m_icount,dAverage);
 dOffset = Normal(dAverage,dAverage,dFangcha);
 for (int i=0;i<m_icount;i++)
 {
/*  dXValue = (m_aiTestValue[0]+i*dMinus)*ptCrect->right/(m_aiTestValue[m_icount-1]*100);
  dNormal = Normal(dXValue,dAverage,dFangcha);
  iXValue = floor((dXValue-(m_aiTestValue[0])*ptCrect->right/(m_aiTestValue[m_icount-1]*100))*10000);
  iYValue = floor(dNormal*10000*(ptCrect->bottom-30)/(dOffset*100));//按比例修改
  m_chart->DrawMarker(iXValue,iYValue,0,true);*/
/*  dXValue = (m_aiTestValue[i]);
  dNormal = Normal(dXValue,dAverage,dFangcha);
  iXValue = floor((dXValue-m_aiTestValue[0])*10000);
  iYValue = floor(dNormal*10000*(ptCrect->bottom-30)/(dOffset*100));//按比例修改
  m_chart->DrawMarker(iXValue,iYValue,0,true);*/

  dXValue = (m_aiTestValue[0]+i*dMinus);
  dNormal = Normal(dXValue,dAverage,dFangcha);
  iXValue = floor((dXValue-m_aiTestValue[0])*10000);
  iYValue = floor(dNormal*10000*(ptCrect->bottom-30)/(dOffset*100));//按比例修改
  m_chart->DrawMarker(iXValue,iYValue,0,true);
 }
 iXValue = floor((dAverage-m_aiTestValue[0])*10000);
 int iYValueEnd = floor(dOffset*10000*(ptCrect->bottom-30)/(dOffset*100));
 m_chart->DrawLine(iXValue,0,iXValue,iYValueEnd);
 dXValue = m_LatestValue;
 dNormal = Normal(dXValue,dAverage,dFangcha);
 iXValue = floor((dXValue-m_aiTestValue[0])*10000);
 iYValue = floor(dNormal*10000*(ptCrect->bottom-30)/(dOffset*100));
 m_chart->DrawMarker(iXValue,iYValue,1,true);

 
}

double CDlgChart::Anverage(double a[],int n)
{
 double sum=0,sum1=0;
 double dAnverage=0,adverage1=0;

 for(int i=0;i<=n-1;i++)
 {
  sum+=a[i];
 }
 dAnverage=sum/n;
 return dAnverage;
}

double CDlgChart::Fangcha(double a[],int n,double dAnv)
{
 double sum=0;
 double dAnverage=0;

 for(int i=0;i<=n-1;i++)
  sum+=(a[i]-dAnv)*(a[i]-dAnv);
 dAnverage=sum/n;

 return dAnverage;
}

double CDlgChart::Normal(double x,double miu,double sigma) //概率密度函数
{
 return (1.0/sqrt(2*PI*sigma) * exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma)));
}

////linepic

BOOL CLinepic::DrawMarker(int x,int y,int index,BOOL bmark)
{
 int xc,yc,xold,yold,xover,yover;
 COLORREF color;
 switch (index)
 {
 case 0:
  { 
  color = RGB(0,255,0);
  break;
  }
 case 1:
  { 
  color = RGB(255,255,0);
  break;
  }
 case 2:
  { 
  color = RGB(255,0,0);
  break;
  }
 case 3:
  { 
  color = RGB(255,0,255);
  break;
  }
 case 4:
  { 
  color = RGB(0,255,255);
  break;
  }
 default:
  { 
  color = RGB(255,255,255);
  break;
  }
 }
 
 xc = x*xUnit/xscale+30-XOvalue;
 yc = m_rcclient.bottom-y*yUnit/yscale;
 xold = pointlast[index].x*xUnit/xscale+30;
 yold = m_rcclient.bottom-pointlast[index].y*yUnit/yscale;

/* xc = x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;//-1避开重绘区
 yc = m_rcclient.bottom-y*yUnit/yscale;
 xold = pointlast[index].x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;
 yold = m_rcclient.bottom-pointlast[index].y*yUnit/yscale;
 if(yc>=m_rcclient.bottom)
  yc=m_rcclient.bottom-1;
 if(yold>=m_rcclient.bottom)
  yold=m_rcclient.bottom-1;*///090222

/*  xc = x*xUnit/xscale+30-XOvalue;
  xold = pointlast[index].x*xUnit/xscale+30-XOvalue;*/
/* if(xc>m_rcclient.right-5)
 {
  MoveRange(xc-m_rcclient.right+5);
  xc = x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;
  xold = pointlast[index].x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;
 }*///hhh090222
 if (bmark)
 {
  if (1!=index)
  {
   
   m_hPenNew.CreatePen(PS_SOLID,2,color);
   VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
   
   POINT  p[4];
   p[0].x = xc - 3;
   p[0].y = yc;
   p[1].x = xc;
   p[1].y = yc + 3;
   p[2].x = xc + 3;
   p[2].y = yc;
   p[3].x = xc;
   p[3].y = yc - 3;
   m_dcMemL.Polygon(p, 4);
   
   m_dcMemL.SelectObject(m_hPenOld);
   m_hPenNew.DeleteObject();
  }
  if (1==index)
  {
   xc = x*xUnit/xscale+30;
   yc = m_rcclient.bottom-y*yUnit/yscale;
   m_hPenNew.CreatePen(PS_SOLID,2,color);
   VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
   POINT  p[4];
   p[0].x = xc - 3;
   p[0].y = yc;
   p[1].x = xc;
   p[1].y = yc + 3;
   p[2].x = xc + 3;
   p[2].y = yc;
   p[3].x = xc;
   p[3].y = yc - 3;
   m_dcMemL.Polygon(p, 4);
   m_dcMemL.SelectObject(m_hPenOld);
   m_hPenNew.DeleteObject();
/*   VERIFY(m_pNewFont.CreatePointFont(110, "宋体", &m_dcMemL));
   m_pOldFont = m_dcMemL.SelectObject(&m_pNewFont);
   
   m_dcMemL.TextOut(xc,yc,"本次成绩");
   
   m_dcMemL.SelectObject(m_pOldFont);
   m_pNewFont.DeleteObject();*/
    //m_dcMemL.SetBkColor(RGB(0,0,0));
    m_dcMemL.SetTextColor(color);
    
    //m_hPenNew.CreatePen(PS_SOLID,1,color);
    //VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
    m_dcMemL.SelectStockObject(NULL_BRUSH);
    
    //m_dcMemL.MoveTo(0,topempty-1);
    //m_dcMemL.LineTo(m_rcclient.right,topempty-1);
    
    VERIFY(m_pNewFont.CreatePointFont(110, "宋体", &m_dcMemL));
    m_pOldFont = m_dcMemL.SelectObject(&m_pNewFont);
    
    m_dcMemL.TextOut(xc+5,yc-5,"本次成绩");
    
    m_dcMemL.SelectObject(m_pOldFont);
    m_pNewFont.DeleteObject();

  }
 }

 if(1!=index)
 {
  m_hPenNew.CreatePen(PS_SOLID,1,color);
  VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
  
  // m_dcMemL.SelectStockObject(BLACK_PEN);
  /* if(pointlast[index].x!=0)
  {*/
  if(yc<topempty&&yold<topempty)
  {
   m_dcMemL.MoveTo(xold-1,topempty);
   m_dcMemL.LineTo(xc,topempty);
  }
  else if(yc<topempty)
  {
   xover = xc-(topempty-yc)*(xc-xold)/(yold-yc);
   yover = topempty;
   m_dcMemL.MoveTo(xold,yold);
   m_dcMemL.LineTo(xover,yover);
   m_dcMemL.MoveTo(xover,topempty);
   m_dcMemL.LineTo(xc,topempty);
  }
  else if(yold<topempty)
  {
   xover = (topempty-yold)*(xc-xold)/(yc-yold)+xold;
   yover = topempty;
   m_dcMemL.MoveTo(xover,yover);
   m_dcMemL.LineTo(xc,yc);
   m_dcMemL.MoveTo(xover,topempty);
   m_dcMemL.LineTo(xold-1,topempty);
  }
  else
  {
   m_dcMemL.MoveTo(xold,yold);
   m_dcMemL.LineTo(xc,yc);
  }
  /* }
  else
  {
  m_dcMemL.MoveTo(xc,m_rcclient.bottom);
  m_dcMemL.LineTo(xc,yc);
 }*/
 /* if(0==pointlast[index].x)
 {
 ;//m_dcMemL.MoveTo(xold,yold);
 //m_dcMemL.LineTo(xc,yc);
 }
 else
 {
 m_dcMemL.MoveTo(xold,yold);
 m_dcMemL.LineTo(xover,yover);
 }*/
  
  m_dcMemL.SelectObject(m_hPenOld);
  m_hPenNew.DeleteObject();
 }
 pointlast[index].x = x;
 pointlast[index].y = y;

 return TRUE;
}

 

 

 

BOOL CLinepic::DrawLine(int x,int y,int xend,int yend)
{
 int xc,yc,xcend,ycend;
 xc= yc=xcend= ycend=0;
 xc = x*xUnit/xscale+30;
 yc = m_rcclient.bottom-y*yUnit/yscale;
 xcend = xend*xUnit/xscale+30;
 ycend = m_rcclient.bottom-yend*yUnit/yscale;
 m_hPenNew.CreatePen(PS_SOLID,1,RGB(255,255,255));
 VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
 m_dcMemL.MoveTo(xc,yc);
 m_dcMemL.LineTo(xcend,ycend);
 m_dcMemL.SelectObject(m_hPenOld);
 m_hPenNew.DeleteObject(); 
 return true;
}

原创粉丝点击