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

📄 areplaneview.cpp

📁 飞机着陆的模糊实现
💻 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(&ltgrayBrush);
    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 + -