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

📄 daolibaiview.cpp

📁 倒立摆可以倒来倒去
💻 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 + -