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

📄 code11.cpp

📁 Partial differential equations
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "Code11.h"

CMyWinApp MyApplication;

BOOL CMyWinApp::InitInstance()
{
    CCode11* pFrame = new CCode11;
    m_pMainWnd = pFrame;
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateWindow();
    return TRUE;
}

BEGIN_MESSAGE_MAP(CCode11,CFrameWnd)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
    ON_BN_CLICKED(IDC_BUTTON,OnButton)
END_MESSAGE_MAP()

CCode11::CCode11()
{
	Create(NULL,"Code11: Partial Differential Equations",
		WS_OVERLAPPEDWINDOW,CRect(0,0,900,700),NULL);
	Arial80.CreatePointFont(80,"Arial");
	menu[0].hm=CPoint(10,300); hGrid=CPoint(150,285);
	menu[0].rc=CRect(menu[0].hm.x,menu[0].hm.y,
		menu[0].hm.x+139,menu[0].hm.y+500);
	menu[1].item="Poisson's Equation";
	menu[2].item="Heat Equation";
	menu[3].item="Wave Equation";
	for (int i=1;i<=nMenuItems;i++)
	{
		menu[i].hm=CPoint(20,30+(i-1)*30);
		menu[i].rc=CRect(menu[i].hm.x,menu[i].hm.y,
			menu[i].hm.x+150,menu[i].hm.y+20);
	}
	input[0].hm=CPoint(200,20);
	input[0].rc=CRect(input[0].hm.x,input[0].hm.y,
		input[0].hm.x+560,input[0].hm.y+220);
	for (i=1;i<=maxInput;i++)
		input[i].hm=CPoint(input[0].hm.x+10,input[0].hm.y+30+(i-1)*25);
	input[0].display=CRect(20,170,170,230);
	pt=new PT [M*N+1];
	fMenu=0; idc=301;
	fStatus=0; fMenu=0;
	wrc=CSize(50,30);
	hSpace=70; vSpace=50; r1vspace=40;
	rcGrid=CRect(hGrid.x-150,hGrid.y-30,hGrid.x+750,hGrid.y+500);
	a=new double *[M*N+1];
	b=new double [M*N+1];
	z=new double [M*N+1];
	u=new double *[N+1];
	w=new double *[N+1];
	for (int i=0;i<=N;i++)
	{
		u[i]=new double [M+1];
		w[i]=new double [M+1];
	}
	for (i=0;i<=M*N;i++)
		a[i]=new double [M*N+1];
}

CCode11::~CCode11()
{	
	for (int i=0;i<=N;i++)
		delete u[i],w[i];
	for (i=0;i<=M*N;i++)
		delete a[i];
	delete u,w,a,b,z,u,w,pt;
}

void CCode11::OnPaint()
{
	CPaintDC dc(this);
	CString str;
	CRect rc;
	int i,j,r;
	dc.SelectObject(Arial80);
	dc.SetBkColor(RGB(150,150,150));
	dc.SetTextColor(RGB(255,255,255));
	for (i=1;i<=nMenuItems;i++)
	{
		dc.FillSolidRect(&menu[i].rc,RGB(150,150,150));
		dc.TextOut(menu[i].hm.x+5,menu[i].hm.y+5,menu[i].item);
	}
	dc.SetBkColor(RGB(255,255,255));
	dc.SetTextColor(RGB(100,100,100));
	dc.Rectangle(input[0].rc);
	if (fMenu==1)
		str="u[xx] + u[yy]=0";
	if (fMenu==2)
		str="u[t] - alpha^2*u[xx]=0";
	if (fMenu==3)
		str.Format("u[tt] - alpha^2*u[xx]=0");
	dc.TextOut(input[0].hm.x+150,input[0].hm.y+5,menu[fMenu].item+": "+str);
	if (fMenu>=0)
		for (i=1;i<=nInputItems;i++)
			dc.TextOut(input[i].hm.x+10,input[i].hm.y,input[i].label);
	if (fStatus>=2)
	{
		for (j=m;j>=0;j--)
		{
			dc.MoveTo(hGrid.x+wrc.cx/2,hGrid.y+wrc.cy/2+j*vSpace);
			dc.LineTo(hGrid.x+wrc.cx/2+n*hSpace,hGrid.y+wrc.cy/2+j*vSpace);
		}
		for (i=0;i<=n;i++)
		{
			dc.MoveTo(hGrid.x+i*hSpace+wrc.cx/2,hGrid.y+wrc.cy/2);
			dc.LineTo(hGrid.x+i*hSpace+wrc.cx/2,hGrid.y+wrc.cy/2+m*vSpace);
		}
		dc.TextOut(hGrid.x-100,hGrid.y+m/2*vSpace-20,
			((fMenu==1)?"u(x0,y)":"u(x0,t)"));
		dc.TextOut(hGrid.x+(n+1)*hSpace-10,hGrid.y+m/2*vSpace-20,
			((fMenu==1)?"u(xN,y)":"u(xN,t)"));
		dc.TextOut(hGrid.x+n/2*hSpace-40,250,
			((fMenu==1)?"u(x,ym)":""));
		if (fMenu==2 || fMenu==3)
		{
			dc.TextOut(hGrid.x,hGrid.y+(m+1)*vSpace-10,"u(x,t0)");
			if (fMenu==3)
				dc.TextOut(hGrid.x+200,hGrid.y+(m+1)*vSpace-10,"uD(x,t0)");
		}
		if (fMenu==1)
			dc.TextOut(hGrid.x+n/2*hSpace-40,hGrid.y+(m+1)*vSpace-10,"u(x,y0)");
		for (j=m;j>=0;j--)
			for (i=0;i<=n;i++)
			{
				rc=CRect(hGrid.x+i*hSpace,hGrid.y+j*vSpace,
					hGrid.x+i*hSpace+wrc.cx,hGrid.y+j*vSpace+wrc.cy);
				dc.Rectangle(rc);
				str.Format("%d,%d",i,m-j); 
				dc.TextOut(hGrid.x+wrc.cx/3+i*hSpace,hGrid.y+2+j*vSpace,str);
			}
	}
	if (fStatus==3)
	{
		for (j=m;j>=0;j--)
			for (i=0;i<=n;i++)
			{
				str.Format("%.4lf",u[i][j]);
				dc.TextOut(hGrid.x+i*hSpace+5,hGrid.y+15+(m-j)*vSpace,str);
			}
		if (fMenu==1)
		{
			dc.TextOut(30,180,"Poisson's Equation");
			dc.TextOut(30,195,"u[xx]+u[yy]="+input[1].item);
			dc.TextOut(30,210,input[4].item+"< x <"+input[5].item
						+", "+input[6].item+"< y <"+input[7].item);
		}
		if (fMenu==2)
		{
			str.Format("%lf",pow(alpha,2));
			dc.TextOut(30,180,"Heat Equation");
			dc.TextOut(30,195,"u[t]-"+str+" u[xx]=0");
			dc.TextOut(30,210,input[4].item+"< x <"+input[5].item
						+", "+input[6].item+"< t <"+input[7].item);
		}
		if (fMenu==3)
		{
			str.Format("%lf",pow(alpha,2));
			dc.TextOut(30,180,"Wave Equation");
			dc.TextOut(30,195,"u[tt]-"+str+" u[xx]=0");
			dc.TextOut(30,210,input[4].item+"< x <"+input[5].item
						+", "+input[6].item+"< t <"+input[7].item);
		}
	}
}

void CCode11::InputLabels()
{
	if (fMenu>0)
	{
		nInputItems=7;
		input[2].label="n (2-8)";
		input[3].label="m (2-8)";
		input[4].label="x[0]";
		input[5].label="x[n]";
	}
	if (fMenu==1)
	{
		input[1].label="w(x,y)";
		input[6].label="y[0]";
		input[7].label="y[m]";
	}
	if (fMenu==2 || fMenu==3)
	{
		input[1].label="alpha";
		input[6].label="t[0]";
		input[7].label="t[m]";
	}
}

void CCode11::OnLButtonDown(UINT nfStatuss,CPoint pt)
{
	int i,k;
	for (k=1;k<=nMenuItems;k++)
		if (menu[k].rc.PtInRect(pt))
		{
			fMenu=k; fStatus=1;
			for (i=1;i<=maxInput;i++)
				input[i].ed.DestroyWindow();
			table1.DestroyWindow();
			table2.DestroyWindow();
			Clear(input[0].display);
			Clear(rcGrid);
			InvalidateRect(input[0].rc);
			btn.DestroyWindow();
			btn.Create("Compute",WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
				CRect(50,140,150,170),this,IDC_BUTTON);
			for (int i=1;i<=maxInput-1;i++)
				input[i].ed.DestroyWindow();
			switch(k)
			{
				case 1: 
					fMenu=1; InputLabels(); break;
				case 2: 
					fMenu=2; InputLabels(); break;
				case 3: 
					fMenu=3; InputLabels(); break;
			}
			for (i=1;i<=nInputItems;i++)
				input[i].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(input[i].hm.x+100,input[i].hm.y,input[i].hm.x+520,
					input[i].hm.y+20),this,idc++);
		}
}

void CCode11::OnButton()
{
	CRect rc;
	int i,j;
	if (fStatus==3)
		fStatus=2;
	if (fMenu==1)
	{
		if (fStatus==2)
			Poisson();
		if (fStatus==1)
		{
			for (i=1;i<=nInputItems;i++)
				input[i].ed.GetWindowText(input[i].item);
			n=atoi(input[2].item); n=((n<=N)?n:N);
			m=atoi(input[3].item); m=((m<=M)?m:M);
			pt[0].x=atof(input[4].item); 
			pt[n].x=atof(input[5].item);
			pt[0].y=atof(input[6].item); 
			pt[m].y=atof(input[7].item);
			h=(double)1/n*(pt[n].x-pt[0].x);
			k=(double)1/m*(pt[m].y-pt[0].y);
			input[nInputItems+1].ed.DestroyWindow();
			input[nInputItems+2].ed.DestroyWindow();
			input[nInputItems+1].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x-100,hGrid.y+m/2*vSpace),
					CSize(90,25)),this,idc++);
			input[nInputItems+2].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x+(n+1)*hSpace-10,hGrid.y+m/2*vSpace),
					CSize(90,25)),this,idc++);
			input[nInputItems+3].ed.DestroyWindow();
			input[nInputItems+4].ed.DestroyWindow();
			input[nInputItems+3].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x+n/2*hSpace,hGrid.y+(m+1)*vSpace-10),
					CSize(90,25)),this,idc++);
			input[nInputItems+4].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x+n/2*hSpace,250),
					CSize(90,25)),this,idc++);
			fStatus=2;
		}
	}
	if (fMenu==2)
	{
		if (fStatus==2)
			Heat();
		if (fStatus==1)
		{
			for (i=1;i<=nInputItems;i++)
				input[i].ed.GetWindowText(input[i].item);
			n=atoi(input[2].item); n=((n<=N)?n:N);
			m=atoi(input[3].item); m=((m<=M)?m:M);
			pt[0].x=atof(input[4].item); pt[n].x=atof(input[5].item);
			pt[0].t=atof(input[6].item); pt[m].t=atof(input[7].item);
			h=(double)1/n*(pt[n].x-pt[0].x);
			k=(double)1/m*(pt[m].t-pt[0].t);
			input[nInputItems+1].ed.DestroyWindow();
			input[nInputItems+2].ed.DestroyWindow();
			input[nInputItems+1].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x-100,hGrid.y+m/2*vSpace),
					CSize(90,25)),this,idc++);
			input[nInputItems+2].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x+(n+1)*hSpace-10,hGrid.y+m/2*vSpace),
					CSize(90,25)),this,idc++);
			input[nInputItems+3].ed.DestroyWindow();
			input[nInputItems+3].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x+n/2*hSpace,hGrid.y+(m+1)*vSpace-10),
					CSize(90,25)),this,idc++);
			fStatus=2;
		}
	}
	if (fMenu==3)
	{
		if (fStatus==2)
			Wave();
		if (fStatus==1)
		{
			for (i=1;i<=nInputItems;i++)
				input[i].ed.GetWindowText(input[i].item);
			n=atoi(input[2].item); n=((n<=N)?n:N);
			m=atoi(input[3].item); m=((m<=M)?m:M);
			pt[0].x=atof(input[4].item); pt[n].x=atof(input[5].item);
			pt[0].t=atof(input[6].item); pt[m].t=atof(input[7].item);
			h=(double)1/n*(pt[n].x-pt[0].x);
			k=(double)1/m*(pt[m].t-pt[0].t);
			input[nInputItems+1].ed.DestroyWindow();
			input[nInputItems+2].ed.DestroyWindow();
			input[nInputItems+1].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x-100,hGrid.y+m/2*vSpace),
					CSize(90,25)),this,idc++);
			input[nInputItems+2].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 

⌨️ 快捷键说明

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