📄 code11.cpp
字号:
#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 + -