📄 daolibaiview.cpp
字号:
// DaolibaiView.cpp : implementation of the CDaolibaiView class
//
#include "stdafx.h"
#include "Daolibai.h"
#include "math.h"
#include "ChushizhiDia.h"
#include "Splash.h"
#include "DaolibaiDoc.h"
#include "DaolibaiView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDaolibaiView
IMPLEMENT_DYNCREATE(CDaolibaiView, CScrollView)
BEGIN_MESSAGE_MAP(CDaolibaiView, CScrollView)
//{{AFX_MSG_MAP(CDaolibaiView)
ON_COMMAND(ID_DAOLIBAI, OnDaolibai)
ON_WM_TIMER()
ON_WM_PAINT()
ON_COMMAND(ID_CHUSHIHUA, OnChushihua)
ON_COMMAND(ID_STOP, OnStop)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDaolibaiView construction/destruction
CDaolibaiView::CDaolibaiView()
{
// TODO: add construction code here
m_timer=0;
pi=3.1415927;
FlagX=0;
FlagX1=1;
}
CDaolibaiView::~CDaolibaiView()
{
}
BOOL CDaolibaiView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDaolibaiView drawing
void CDaolibaiView::OnDraw(CDC* pDC)
{
CDaolibaiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CDaolibaiView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CDaolibaiView diagnostics
#ifdef _DEBUG
void CDaolibaiView::AssertValid() const
{
CScrollView::AssertValid();
}
void CDaolibaiView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CDaolibaiDoc* CDaolibaiView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDaolibaiDoc)));
return (CDaolibaiDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDaolibaiView message handlers
void CDaolibaiView::OnDaolibai()
{
// TODO: Add your command handler code here
CDC* pdc=GetDC();
double X1lishudu[3]={0,0,0}; //X1的隶属度的值
double X2lishudu[3]={0,0,0}; //X2的隶属度的值
double Ulishudu[5]; //U的隶属度的值
int FlagX1[3]={0,0,0}; //隶属度的标志
int FlagX2[3]={0,0,0}; //隶属度的标志
int FlagU[5]={0,0,0,0,0}; //隶属度的标志
//开始计算倒立摆
int j;
for(j=0;j<3;j++)
{
X1lishudu[j]=0.0;
X2lishudu[j]=0.0;
FlagX1[j]=0;
FlagX2[j]=0;
}
for(j=0;j<5;j++)
{
FlagU[j]=0;
Ulishudu[j]=0.0;
}
//判断X1[i]所处的状态,并计算其隶属度的值
if(X1>0&&X1<2)
{
FlagX1[1]=1;
FlagX1[2]=1;
X1lishudu[1]=-0.5*X1+1;
X1lishudu[2]=0.5*X1;
}
if(X1>2)
{
FlagX1[2]=1;
X1lishudu[2]=1;
}
if(X1<0&&X1>-2)
{
FlagX1[1]=1;
FlagX1[0]=1;
X1lishudu[1]=0.5*X1+1;
X1lishudu[0]=-0.5*X1;
}
if(X1<-2)
{
FlagX1[0]=1;
X1lishudu[0]=1;
}
//判断X2[i]所处的状态&&计算其隶属度的值
if(X2>0&&X2<5)
{
FlagX2[1]=1;
FlagX2[2]=1;
X2lishudu[1]=-0.2*X2+1;
X2lishudu[2]=0.2*X2;
}
if(X2>5)
{
FlagX2[2]=1;
X2lishudu[2]=1;
}
if(X2<0&&X2>-5)
{
FlagX2[1]=1;
FlagX2[0]=1;
X2lishudu[1]=0.2*X2+1;
X2lishudu[0]=-0.2*X2;
}
if(X2<-5)
{
FlagX2[0]=1;
X2lishudu[0]=1;
}
//根据X1、X2的状态判断U[k]的状态&&计算U[k]的隶属度
if(FlagX1[0]==1&&FlagX2[0]==1)
{
FlagU[0]=1;
Ulishudu[0]=min1(X1lishudu[0],X2lishudu[0]);
}
if((FlagX1[0]==1&&FlagX2[1]==1)||(FlagX1[1]==1&&FlagX2[0]==1))
{
FlagU[1]=1;
Ulishudu[1]=min1(min1(X1lishudu[0],X2lishudu[1]),min1(X1lishudu[1],X2lishudu[0]));
}
if((FlagX1[0]==1&&FlagX2[2]==1)||(FlagX1[2]==1&&FlagX2[0]==1)||(FlagX1[1]==1&&FlagX2[1]==1))
{
FlagU[2]=1;
Ulishudu[2]=min1(min1(min1(X1lishudu[0],X2lishudu[2]),min1(X1lishudu[2],X2lishudu[0])),min1(X1lishudu[1],X2lishudu[1]));
}
if((FlagX1[1]==1&&FlagX2[2]==1)||(FlagX1[2]==1&&FlagX2[1]==1))
{
FlagU[3]=1;
Ulishudu[3]=min1(min1(X1lishudu[1],X2lishudu[2]),min1(X1lishudu[2],X1lishudu[1]));
}
if(FlagX1[2]==1&&FlagX2[2]==1)
{
FlagU[4]=1;
Ulishudu[4]=min1(X1lishudu[2],X2lishudu[2]);
}
//计算U[k]的值
//模糊结果的并和非模糊量
U=(-area1(Ulishudu[0])*16-area1(Ulishudu[1])*8+area1(Ulishudu[3])*8+area1(Ulishudu[4])*16)/(area1(Ulishudu[0])+area1(Ulishudu[1])+area1(Ulishudu[2])+area1(Ulishudu[3])+area1(Ulishudu[4]));
//确定下一次循环的X1[k+1]、X2[k+1]的值
X1=X1+X2;
X2=X1-U;
FlagX=1;
}
double CDaolibaiView::area1(double a)
{
return (2*a-a*a);
}
double CDaolibaiView::min1(double a, double b)
{
double min1ab;
if(abs(a)>1e-6&&abs(b)>1e-6)
{
if(a>=b)
min1ab=b;
else
min1ab=a;
return (min1ab);
}
else
{
if(a>=b)
min1ab=a;
else
min1ab=b;
return (min1ab);
}
}
void CDaolibaiView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if(FlagX==1&&FlagX1==1)
{
//InvalidateRect(new CRect(400-56,400-81,400+56,400+81));
OnDaolibai();
Invalidate();
/*
CRect rect;
GetClientRect(&rect);
i++;
*/
}
CScrollView::OnTimer(nIDEvent);
}
void CDaolibaiView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
m_timer=SetTimer(1,100,NULL);
}
BOOL CDaolibaiView::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
KillTimer(m_timer);
return CScrollView::DestroyWindow();
}
double CDaolibaiView::GetXjiaodu()
{
static int ijiaodu=0;
if(ijiaodu<1000)
{
ijiaodu++;
return (X1);
}
else
return 0;
}
void CDaolibaiView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
//dc.MoveTo(400,400);
//dc.LineTo(410,410);
dc.MoveTo(400-100,410);
dc.LineTo(400+100,410);
dc.MoveTo(400-100,409);
dc.LineTo(400+100,409);
dc.MoveTo(400-100,408);
dc.LineTo(400+100,408);
dc.MoveTo(400-100,407);
dc.LineTo(400+100,407);
dc.Rectangle(400-50,350,400+50,400);
dc.MoveTo(400,350);
dc.LineTo(400+80*sin(X1*pi/180),350-80*cos(X1*pi/180));
dc.Ellipse(400+80*sin(X1*pi/180)-10,350-80*cos(X1*pi/180)-10,400+80*sin(X1*pi/180)+10,350-80*cos(X1*pi/180)+10);
}
void CDaolibaiView::OnChushihua()
{
// TODO: Add your command handler code here
CChushizhiDia dlg;
dlg.DoModal();
X1=dlg.m_X1;
X2=dlg.m_X2;
FlagX1=1;
}
void CDaolibaiView::OnStop()
{
// TODO: Add your command handler code here
FlagX1=FlagX=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -