⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newtonview.cpp

📁 数值分析中牛顿插值算法
💻 CPP
字号:
// newtonView.cpp : implementation of the CNewtonView class
//

#include "stdafx.h"
#include "newton.h"

#include "newtonDoc.h"
#include "newtonView.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 6

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

/////////////////////////////////////////////////////////////////////////////
// CNewtonView

IMPLEMENT_DYNCREATE(CNewtonView, CView)

BEGIN_MESSAGE_MAP(CNewtonView, CView)
	//{{AFX_MSG_MAP(CNewtonView)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNewtonView construction/destruction



CNewtonView::CNewtonView()
{
	// TODO: add construction code here

}

CNewtonView::~CNewtonView()
{
}

BOOL CNewtonView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CNewtonView drawing
//

void CNewtonView::OnDraw(CDC* pDC)
{  
	CNewtonDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	//牛顿插值函数,选取函数y=pow(e,-x),插值点选择X[3]
	//y[N]用于存放插值节点对应的X值
	//initX[M],initY[M],initZ[M]分别放画图时的横坐标和纵坐标.initY[M]放插值后的函数值,
	//initZ[M]放插值前的函数值.
    float x[3]={0.0,3.0,5.0};
    float y[3]={0.0,0.0,0.0};
	float initX[N];
    float initY[N];
    float initZ[N];
	int i;
	float a=0.0,b=0.0,c=0.0,d=0.0;
	   for (i=0;i<3;i++)
	{
		y[i]=exp(-x[i]);
	}
	a=y[0];                           
	b=(y[0]-y[1])/(x[0]-x[1]);
	d=(y[2]-y[0])/(x[2]-x[0]);
    c=(d-b)/(x[2]-x[1]);
	for (i=0;i<N;i++)
	{
       initX[i]=i;
	   initY[i]=a+b*(initX[i]-x[0])+c*(initX[i]-x[0])*(initX[i]-x[1]);
       initZ[i]=exp(-initX[i]);
	}
	
	   //分别取得X和Y最大值,最小值

       int  maxX=initX[0];

       int  minX=initX[0];

       float maxY=initY[0];

       float minY=initY[0];
	   float maxZ=initZ[0];

       float minZ=initZ[0];

       for( i=0;i<N;i++)

       {

              if(initX[i]>maxX)

                     maxX=initX[i]; 

              if(initX[i]<minX)

                     minX=initX[i];

              if(initY[i]>maxY)

                     maxY=initY[i];

              if(initY[i]<minY)

                     minY=initY[i];
			   if(initZ[i]>maxZ)

                     maxZ=initZ[i];

              if(initZ[i]<minZ)

                     minZ=initZ[i];
             
       }

      //如果原点必须在X轴上,加上下面2行,否则注释掉

       if(minX>0)

              minX=0;

      //如果原点必须在Y轴上,加上下面2行,否则注释掉

       if(minY>0)

              minY=0;
         
       if(minZ>0)

              minZ=0;
	  
 

       //确定图象显示大小

       int width=500;
       int height=300;
	   //要显示两个图象,只要把下面一个图象其高度都增加一个值即可.

       //确定坐标图四周预留的空白大小
       const int mytop=20;
	   const int mybottom=20;
	   const int myleft=80;
       const int myright=50;

       //确定X,Y,Z轴每单位显示宽度
       float intervalX=(width-myleft-myright)/(maxX-minX);
       float intervalY=(height-mybottom-mytop)/(maxY-minY);
       float intervalZ=(height-mybottom-mytop)/(maxZ-minZ);
        
       //绘制曲线。由于绘图坐标的Y轴是向下延升,所以这里每个点的Y值是用
       //图象高度减去y值大小。
       pDC->MoveTo(int(myleft+(initX[0]-minX)*intervalX), 
             int(height-(mybottom+(initY[0]-minY)*intervalY)));
       for(i=0;i<N;i++)
	   {

       pDC->LineTo(int(myleft+(initX[i]-minX)*intervalX), int(height-(mybottom+(initY[i]-minY)*intervalY)));//画线,与moveto连用
      
        }

       //绘制X轴,从图形区域最左端到最右端
       float bottomY=0;
	   float leftX=0;
       float bottomZ=0;

       //bottomY表示X轴的y值,leftX表示Y轴的x值
       if(minY>0)
           bottomY=minY;
       if(minX>0)
           leftX=minX;
	   if(minZ>0)
           bottomZ=minZ;
       pDC->MoveTo(int(myleft),int(height-(mybottom+(bottomY-minY)*intervalY)));
       pDC->LineTo(int(width-myright),int(height-(mybottom+(bottomY-minY)*intervalY)));

       //Y轴从图形区域最底端到最顶端
       pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-mybottom));
       pDC->LineTo(int(myleft+(leftX-minX)*intervalX),int(mytop));

       //确定显示刻度个数
       const int count=5;
	   int countx=N-1;

       //确定每个显示刻度之间的宽度
       float spaceX=(width-myleft-myright)/countx;
       float spaceY=(height-mybottom-mytop)/count;
       float spaceZ=(height-mybottom-mytop)/count;

       //绘制刻度和刻度值
       CString str;

       //X轴
      for(i=0;i<=countx;i++)//yhy
	  {
              str.Format("%d",minX+i*(maxX-minX)/countx);

              pDC->MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY)));

              pDC->LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY+5)));

              pDC->TextOut(int(myleft+spaceX*i-10),

                     int(height-(mybottom+(bottomY-minY)*intervalY-5)),str);

       }
     //Y轴

        for(i=0;i<=count;i++)

       {

              str.Format("%.1f",minY+i*(maxY-minY)/count);

              pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-(mybottom+spaceY*i)));

              pDC->LineTo(int(myleft+(leftX-minX)*intervalX+5),int(height-(mybottom+spaceY*i)));

              pDC->TextOut(int(myleft+(leftX-minX)*intervalX-30),
//
                  int(height-(mybottom+spaceY*i+8)),str);

       }

      //绘制X,Y轴的变量名

       pDC->TextOut(width/2,height-20,"牛顿插值函数");

       pDC->TextOut(0,height/2,"幅值");
		 //X轴
//test start
		pDC->MoveTo(int(myleft+(initX[0]-minX)*intervalX), 

                     int(height+300-(mybottom+(initZ[0]-minZ)*intervalZ)));

       for(i=0;i<N;i++)

       {

            pDC->LineTo(int(myleft+(initX[i]-minX)*intervalX), 

                     int(height+300-(mybottom+(initZ[i]-minZ)*intervalZ)));

        }
      //绘制X轴和Y轴
       pDC->MoveTo(int(myleft),int(height+300-(mybottom+(bottomZ-minZ)*intervalZ)));

       pDC->LineTo(int(width-myright),int(height+300-(mybottom+(bottomZ-minZ)*intervalZ)));

       //Y轴从图形区域最底端到最顶端

       pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height+300-mybottom));

       pDC->LineTo(int(myleft+(leftX-minX)*intervalX),int(mytop+300));

       for(i=0;i<=countx;i++)

       {

              str.Format("%d",minX+i*(maxX-minX)/countx);

              pDC->MoveTo(int(myleft+spaceX*i),int(height+300-(mybottom+(bottomZ-minZ)*intervalZ)));

              pDC->LineTo(int(myleft+spaceX*i),int(height+300-(mybottom+(bottomZ-minZ)*intervalZ+5)));//每个MOVETO ,LINeto 画刻度上的小竖线

              pDC->TextOut(int(myleft+spaceX*i-10),

                     int(height+300-(mybottom+(bottomZ-minZ)*intervalZ-5)),str);

       }
         //Y轴
        for(i=0;i<=count;i++)

       {

              str.Format("%.1f",minZ+i*(maxZ-minZ)/count);

              pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height+300-(mybottom+spaceZ*i)));

              pDC->LineTo(int(myleft+(leftX-minX)*intervalX+5),int(height+300-(mybottom+spaceZ*i)));

              pDC->TextOut(int(myleft+(leftX-minX)*intervalZ-30),
                           int(height+300-(mybottom+spaceZ*i+8)),str);
		}

          //绘制X,Y轴的变量名
       pDC->TextOut(width/2-10,height+300-10,"牛顿插值原函数");
       pDC->TextOut(0,height/2+300,"幅值");

}

/////////////////////////////////////////////////////////////////////////////
// CNewtonView printing

BOOL CNewtonView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CNewtonView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CNewtonView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CNewtonView diagnostics

#ifdef _DEBUG
void CNewtonView::AssertValid() const
{
	CView::AssertValid();
}

void CNewtonView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CNewtonDoc* CNewtonView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CNewtonDoc)));
	return (CNewtonDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CNewtonView message handlers

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -