📄 areplaneview.cpp
字号:
// areplaneView.cpp : implementation of the CAreplaneView class
//
#include "stdafx.h"
#include "areplane.h"
#include "Setting.h"
#include "areplaneDoc.h"
#include "areplaneView.h"
#include "MainFrm.h"
#include <string.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int PlaneH,PlaneV,PlaneX=100, PlaneY=100;
double HL=0,HM=0,HS=0,HNZ=0;//定义高度
double speedUL=0,speedUS=0,speedZ=0,speedDS=0,speedDL=0;//定义速度
double fUL=0,fUS=0,fZ=0,fDS=0,fDL=0;//定义控制力
double fZ11=0,fDS12=0,fDL13=0,fDL14=0,fDL15=0;//定义控制力
double fUS21=0,fZ22=0,fDS23=0,fDL24=0,fDL25=0;//定义控制力
double fUL31=0,fUS32=0,fZ33=0,fDS34=0,fDL35=0;//定义控制力
double fUL41=0,fUL42=0,fZ43=0,fDS44=0,fDS45=0;//定义控制力
double force=0;
bool flag=FALSE,showflag=FALSE;
CString Mousepoint;
/////////////////////////////////////////////////////////////////////////////
// CAreplaneView
IMPLEMENT_DYNCREATE(CAreplaneView, CView)
BEGIN_MESSAGE_MAP(CAreplaneView, CView)
//{{AFX_MSG_MAP(CAreplaneView)
ON_COMMAND(ID_SETTING, OnSetting)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_LBUTTONDOWN()
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CAreplaneView construction/destruction
CAreplaneView::CAreplaneView()
{
blackBrush.CreateSolidBrush(RGB(0,0,0));
dkgrayBrush.CreateSolidBrush(RGB(128,128,128));
ltgrayBrush.CreateSolidBrush(RGB(192,192,192));
airBlueBrush.CreateSolidBrush(RGB(100,200,255));
blackPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
bluePen.CreatePen(PS_SOLID,1,RGB(128,128,128));
grayPen.CreatePen(PS_SOLID,4,RGB(192,192,192));
airplaneBrush.CreateSolidBrush(RGB(128,128,128));
}
CAreplaneView::~CAreplaneView()
{
}
BOOL CAreplaneView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CAreplaneView drawing
void CAreplaneView::OnDraw(CDC* pDC)
{
CAreplaneDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CAreplaneView printing
BOOL CAreplaneView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CAreplaneView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CAreplaneView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CAreplaneView diagnostics
#ifdef _DEBUG
void CAreplaneView::AssertValid() const
{
CView::AssertValid();
}
void CAreplaneView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CAreplaneDoc* CAreplaneView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAreplaneDoc)));
return (CAreplaneDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CAreplaneView message handlers
void CAreplaneView::OnSetting()
{ CSetting dlg;
dlg.DoModal();
PlaneH=dlg.m_height;
PlaneV=-dlg.m_speed;
PlaneY=dlg.m_height;
flag=TRUE;
// TODO: Add your command handler code here
}
void CAreplaneView::OnPaint()
{
CPaintDC dc(this); // device context for painting
OnPrepareDC(&dc);
CRect rect;
GetClientRect(rect);
CBrush *poldBrush=dc.SelectObject(&blackBrush);
double height=(double)rect.bottom;
double width=(double)rect.right;
CRect rectBackground(rect.left,(int)(height/100.0),rect.right,(int)(height*7.0/50.0));
dc.SelectObject(&airBlueBrush);
dc.Rectangle(rectBackground);
//CPen *poldPen=dc.SelectObject(&bluePen);
CRect airplaneground(rect.left,495,rect.right,700);
dc.SelectObject(<grayBrush);
dc.Rectangle(airplaneground);
//CPen *poldPen=dc.SelectObject(&bluePen);
//dc.FillRect(&m_RectSample,&Brush1);
//dc.Rectangle(PlaneX,PlaneY,25+PlaneX,PlaneY+25);
dc.MoveTo(PlaneX,PlaneY);
dc.LineTo(PlaneX+10,PlaneY+10);
dc.LineTo(PlaneX+25,PlaneY+10);
dc.LineTo(PlaneX+25,PlaneY+3);
dc.LineTo(PlaneX+35,PlaneY+10);
dc.LineTo(PlaneX+45,PlaneY+10);
dc.LineTo(PlaneX+50,PlaneY+15);
dc.LineTo(PlaneX+45,PlaneY+20);
dc.LineTo(PlaneX+35,PlaneY+20);
dc.LineTo(PlaneX+27,PlaneY+26);
dc.LineTo(PlaneX+25,PlaneY+20);
dc.LineTo(PlaneX+6,PlaneY+20);
dc.LineTo(PlaneX,PlaneY);
//画小人
dc.Ellipse(200,200,250,250);
dc.MoveTo(225,250);
dc.LineTo(225,300);
dc.LineTo(200,350);
dc.MoveTo(225,300);
dc.LineTo(250,350);
dc.MoveTo(225,270);
dc.LineTo(200,300);
dc.Ellipse(195,285,215,305);
dc.MoveTo(225,270);
dc.LineTo(250,300);
dc.Ellipse(240,285,260,305);
Mousepoint.Format("(%d,%d)",PlaneX,PlaneY);
dc.TextOut(PlaneX-40,PlaneY-50,Mousepoint);
CString msg;
msg.Format("%d,%d", PlaneX, PlaneY);
///////////////////状态栏的输出坐标///////////////////////////////////////
CMainFrame* pMainFrame= (CMainFrame*)( AfxGetApp()->m_pMainWnd);
ASSERT_KINDOF(CMainFrame, pMainFrame);
pMainFrame->m_wndStatusBar.SetPaneText(PANE_CURSOR_POSITION, msg);
// Do not call CView::OnPaint() for painting messages
}
void CAreplaneView::OnTimer(UINT nIDEvent)
{
GetAirplane();
if( PlaneH>400)
Invalidate();//发送重画信号
else
{
KillTimer(1);
if(abs(PlaneV)<5&&flag&&!showflag){AfxMessageBox("飞机安全着陆!!");showflag=TRUE;}
else if(abs(PlaneV)>=5&&flag&&!showflag){AfxMessageBox("you are dead!");showflag=TRUE;}
}
//CView::OnTimer(nIDEvent);
}
void CAreplaneView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC mydc(this);
CWnd *cwnd=mydc.GetWindow();
HWND hwnd=cwnd->GetSafeHwnd();
cwnd->SetTimer(1,20,NULL);
CView::OnLButtonDown(nFlags, point);
}
void CAreplaneView::GetAirplane()
{
double dx;
double speedx=(PlaneV);
//模糊规则定义,模糊推理
//高度的规则,隶属度函数
dx=double(PlaneH);
if(dx>500&&dx<=1000)
HL=dx/500-1;
else HL=0;
if(dx>800)
HM=(800-dx)/500+1;
else if(dx>300&&dx<=800)
HM=(dx-300)/500;
else
HM=0;
if(dx>0&&dx<300)
HS=(dx+200)/500;
else if(dx>300&&dx<800)
HS=(800-dx)/500;
else HS=0;
if(dx>0&&dx<500)
HNZ=1-dx/500;
else HNZ=0;
//速度的规则,隶属度函数
speedUL=0;speedUS=0;speedZ=0;speedDS=0;speedDL=0;
if(speedx>20)
speedUL=1;
if(speedx<=20&&speedx>10)
speedUL=speedx/10-1;
if(speedx>=10&&speedx<20)
speedUS=2-speedx/10;
if(speedx>=0&&speedx<10)
speedUS=speedx/10;
if(speedx>0&&speedx<10)
speedZ=1-speedx/10;
if(speedx<=0&&speedx>-10)
speedZ=1+speedx/10;
if(speedx>-10&&speedx<0)
speedDS=-speedx/10;
if(speedx>=-20&&speedx<-10)
speedDS=speedx/10+2;
if(speedx<-20)
speedDL=1;
if(speedx>=-20&&speedx<-10)
speedDL=-speedx/10-1;
/////////////////////////////////////////////////////////////////////
//定义FAM表
//double HL,HM,HS,HNZ;//定义高度
//double speedUL,speedUS,speedZ,speedDS,speedDL;//定义速度
//double fUL,fUS,fZ,fDS,fDL;//定义控制力
//模糊推理
//FAM表的第一行
fUL=0;fUS=0;fZ=0;fDS=0;fDL=0;
if(HL!=0)
{if(speedDL!=0)
{if(HL>=speedDL)fZ11=HL;
else fZ11=speedDL;
}
if(speedDS!=0)
{if(HL>=speedDS)fDS12=HL;
else fDS12=speedDS;
}
if(speedZ!=0)
{if(HL>=speedZ)fDL13=HL;
else fDL13=speedZ;
}
if(speedUS!=0)
{if(HL>=speedUS)fDL14=HL;
else fDL14=speedUS;
}
if(speedUL!=0)
{if(HL>=speedUL)fDL15=HL;
else fDL15=speedUL;
}
}
//////////////////////////////////////////////////////////////
//FAM表的第二行
if(HM!=0)
{if(speedDL!=0)
{if(HL>=speedDL)fUS21=HM;
else fUS21=speedDL;
}
if(speedDS!=0)
{if(HM>=speedDS)fZ22=HM;
else fZ22=speedDS;
}
if(speedZ!=0)
{if(HM>=speedZ)fDS23=HM;
else fDS23=speedZ;
}
if(speedUS!=0)
{if(HM>=speedUS)fDL24=HM;
else fDL24=speedUS;
}
if(speedUL!=0)
{if(HM>=speedUL)fDL25=HM;
else fDL25=speedUL;
}
}
//FAM表的第三行
if(HS!=0)
{if(speedDL!=0)
{if(HL>=speedDL)fUL31=HS;
else fUL31=speedDL;
}
if(speedDS!=0)
{if(HS>=speedDS)fUS32=HS;
else fUS32=speedDS;
}
if(speedZ!=0)
{if(HS>=speedZ)fZ33=HS;
else fZ33=speedZ;
}
if(speedUS!=0)
{if(HS>=speedUS)fDS34=HS;
else fDS34=speedUS;
}
if(speedUL!=0)
{if(HS>=speedUL)fDL35=HS;
else fDL35=speedUL;
}
}
//FAM表的第四行
if(HNZ!=0)
{if(speedDL!=0)
{if(HL>=speedDL)fUL41=HNZ;
else fUL41=speedDL;
}
if(speedDS!=0)
{if(HNZ>=speedDS)fUL42=HNZ;
else fUL42=speedDS;
}
if(speedZ!=0)
{if(HNZ>=speedZ)fZ43=HNZ;
else fZ43=speedZ;
}
if(speedUS!=0)
{if(HNZ>=speedUS)fDS44=HNZ;
else fDS44=speedUS;
}
if(speedUL!=0)
{if(HNZ>=speedUL)fDS45=HNZ;
else fDS45=speedUL;
}
}
//////////////////////////////////////////////
//解推理,采用自定义面积求出作用力
//force=fUL*((10*(1+fUL)+10)/2+10)+fUS*10+fDS*(-10)+fDL*((-10*(1+fDL)-10)/2-10);
force=fDS12*(-10)+fDL13*((-10*(1+fDL)-10)/2-10)+fDL14*((-10*(1+fDL)-10)/2-10)+fDL15*((-10*(1+fDL)-10)/2-10);//定义控制力
force=force+fUS21*10+fDS23*(-10)+fDL24*((-10*(1+fDL)-10)/2-10)+fDL25*((-10*(1+fDL)-10)/2-10);//定义控制力
force=force+fUL31*((10*(1+fUL)+10)/2+10)+fUS32*10+fDS34*(-10)+fDL35*((-10*(1+fDL)-10)/2-10);//定义控制力
force=force+fUL41*((10*(1+fUL)+10)/2+10)+fUL42*((10*(1+fUL)+10)/2+10)+fDS44*(-10)+fDS45*(-10);//定义控制力;
force=force/(fZ11+fDS12+fDL13+fDL14+fDL15+fUS21+fZ22+fDS23+fDL24+fDL25+fUL31+fUS32+fZ33+fDS34+fDL35+fUL41+fUL42+fZ43+fDS44+fDS45);
PlaneV=PlaneV+force;
PlaneH=PlaneH+PlaneV/3;//减小移动的步数
PlaneX=PlaneX+3;//减小移动的步数
PlaneY=(1100-PlaneH)/1.5;
}
int CAreplaneView::area(int i)
{switch( i )
{
case 1://大升fUL
return 1;
break;
case 2 :
break;
case 3:
break;
case 4:
break;
case 5 :
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -